Grido – načtení dodavatelů (id, název) → zobrazení názvu
- Desttro
- Člen | 126
Zdravím,
potřebuju v Gridu vykreslovat dodavatele, mám 2 tabulky, které mají
v pořádku klíče. Nevím, jak ale do grida dostat moji metodu, aby to
vypisovalo názvy dodavatelů a ne jejich ID, které jsou v tabulce
manufacturing.
Vžy mi to vyhodí:
Nette\InvalidArgumentException
Component name must be integer or string, array given.
zasekne se mi to u toho:
$grid->addColumnText(HomepagePresenter::getSuppliers(),
‚Dodavatel‘)
Nechápu proč, tady jsou moje data:
manufacturing
supplier_id, material
__________
|1|zinek |
|1|cin |
|2|zinek |
|2|med |
----------
suppliers
id, name
___________
|1|Firma1 |
|2|Firma2 |
-----------
Používám Grido, udělal jsem si tuhle metodu:
public function getSuppliers()
{
$row = $this->database->table('suppliers')
->select('id, name')
->order('name ASC')
->fetchPairs('id', 'name');
return ($row) ? $row : NULL;
}
No a v Presneteru mám:
protected function createComponentGrid($name)
{
$grid = new \Grido\Grid($this, $name);
$grid->model = $this->database->table('manufacturing');
$grid->addColumnText(HomepagePresenter::getSuppliers(), 'Dodavatel')
->setSortable();
}
Děkuji za každou radu
- Oli
- Člen | 1215
To je přece docela jasný ;-) Ty se snažíš jako jméno komponenty (alias jméno sloupce) použít pole a to nemůžeš. To ti říká ta hláška Component name must be integer or string, array given.
Že ty jsi nečetl dokumentaci nebo sandbox grida? :-) Tady je to co ty chceš. Správně by to mělo být zhruba takhle:
protected function createComponentGrid($name)
{
$grid = new \Grido\Grid($this, $name);
$grid->model = $this->database->table('manufacturing');
$grid->addColumnText('supplier_id', 'Dodavatel')
->setSortable()
->setColumn('supplier.name');
}
Editoval Oli (8. 1. 2015 21:27)
- Desttro
- Člen | 126
Díky, toho jsem si nevšiml. Nicméně furt to nemůžu rozchodit, fut mi to hází Use of undefined constant … assumed …
Když se snažím dát např. suppliers.name atd.
Jsou ty tabulky správně – ty klíče?
http://s17.postimg.org/…3/table1.png
http://s24.postimg.org/…t/table2.png
Děkuji
Editoval Desttro (8. 1. 2015 20:49)
- Oli
- Člen | 1215
Takhle to vypadá, že to máš správně. Napadá mě akorát, kopíroval
jsi to z toho mého postu? mám tam hned 2 3 chyby. Jednak překlep
suplier → supplier a jednak suplier.name
musí být
v uvozovkách. Už jsem to nahoře opravil.
Na kterým řádku ti to hází tu chybu? Podle chyby bych řekl, že to bude asi tenhle řádek, ne?
$grid->addColumnText(supplier_id, 'Dodavatel') // --> $grid->addColumnText('<--supplier_id'<--, 'Dodavatel')
->setColumn(suplier.name); // --> ->setColumn('supplier.name');
Editoval Oli (8. 1. 2015 21:30)
- Desttro
- Člen | 126
Do uvozovek jsem to nedal, ale furt mi to hlásí chybu
Cannot read an undeclared column ‚suppliers.name‘.
mám tohle:
$grid->addColumnText('suppliers_id', 'Dodavatel')
->setSortable()
->setColumn('suppliers.name');
vždyť takový sloupec tam mám v té databázi, tu jsem neměnil, je aktální jako na obrázcích
- Oli
- Člen | 1215
Nevím, jestli to na to může mít vliv. Já dělal vždycky názvy sloupců v jednotným čísle a názvy tabulek v množným. Nette automaticky tvoří ty vazby tak, že ořízne název sloupce o _id. Je možný, že tím, že to máš jako suppliers, tak si myslí, že to je název tabulky. Možná kecám blbosti, a problém je jinde, tohle mě napadlo.
Jinak jestli ti to funguje jinde, tak musí i tady. Můžeš zkusit něco jako:
$row = $this->database->table('manufacturing')->fetch();
dump($row->sppliers->name);
Jestli ti to projde, tak to dobře propojí a problém bude jinde…
- Desttro
- Člen | 126
Tohle funguje, děkuji! Akorat nechápu proč jde jenom tenhle způsob.
Ještě se chci zeptat, jak teď přidám filtr? myslím addFilterSelect – tu
roletku aby tam byly zase např. Firma1, Firma2, Frima3, … ?
Tady jem můj Grid v HomepagePresenter:
class HomepagePresenter extends BasePresenter
{
/** @var Nette\Database\Context @inject */
public $database;
public function getSuppliers()
{
$row = $this->database->table('suppliers')
->select('id, name')
->order('name ASC')
->fetchPairs('id', 'name');
return ($row) ? $row : NULL;
}
protected function createComponentGrid($name)
{
$grid = new \Grido\Grid($this, $name);
$grid->model = $this->database->table('manufacturing');
//$row = $this->database->table('manufacturing')->fetch();
//dump($row->suppliers->name);
$grid->addColumnText('supplier_id', 'Dodavatel')
->setSortable()
->setColumn(function($item){return $item->supplier->name;});
$grid->addColumnText('order_id', 'č. o.')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnText('orderp', 'č. p. o.')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnText('material', 'Materiál')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnText('dimension', 'Rozměr')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnDate('required_date', 'Požd. term.', \Grido\Components\Columns\Date::FORMAT_DATE)
->setSortable()
->setFilterDate();
$grid->addColumnDate('confirmed_date', 'Potvrz. term.', \Grido\Components\Columns\Date::FORMAT_DATE)
->setSortable()
->setFilterDate();
$grid->addColumnDate('delivery_date', 'Term. dodání', \Grido\Components\Columns\Date::FORMAT_DATE)
->setSortable()
->setFilterDate();
$grid->addColumnText('delivered', 'Dodáno')
->setSortable()
->setFilterText()
->setSuggestion();
$grid->addColumnText('note', 'Poznámka');
$grid->addFilterSelect('supplier_id', 'Dodavatel');
$grid->addActionHref('edit', 'Edit')
->setIcon('pencil');
$grid->addActionHref('delete', 'Delete')
->setIcon('trash')
// ->setConfirm(function($item) {
// return "Are you sure you want to delete {$item->firstname} {$item->surname}?";
// })
;
$grid->filterRenderType = $this->filterRenderType;
$grid->setExport();
}
}
můj BasePresenter:
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
/** @var string @persistent */
public $ajax = 'on';
/** @var string @persistent */
public $filterRenderType = \Grido\Components\Filters\Filter::RENDER_INNER;
/**
* Custom condition callback for filter birthday.
* @param string $value
* @return array|NULL
*/
public function gridBirthdayFilterCondition($value)
{
$date = explode('.', $value);
foreach ($date as &$val) {
$val = (int) $val;
}
return count($date) == 3
? array('birthday', '= ?', "{$date[2]}-{$date[1]}-{$date[0]}")
: NULL;
}
public function getSuppliers()
{
$row = $this->database->table('manufacturing')
->select('id, name')
->order('name ASC')
->fetchPairs('id', 'name');
return ($row) ? $row : NULL;
}
/**********************************************************************************************/
protected function createTemplate($class = NULL)
{
if (\Nette\Framework::VERSION_ID >= 20200) {
$template = parent::createTemplate();
$latte = $template->getLatte();
$set = new \Latte\Macros\MacroSet($latte->getCompiler());
$set->addMacro('scache', '?>?<?php echo strtotime(date(\'Y-m-d hh \')); ?>"<?php');
$latte->addFilter('scache', $set);
return $template;
} else {
$template = parent::createTemplate($class);
$latte = new Nette\Latte\Engine;
$set = new \Nette\Latte\Macros\MacroSet($latte->getCompiler());
$set->addMacro('scache', '?>?<?php echo strtotime(date(\'Y-m-d hh \')); ?>"<?php');
$template->registerFilter($latte);
return $template;
}
}
public function beforeRender()
{
$baseUri = self::getExtraPath();
$this->template->baseUri = $baseUri ? $baseUri : $this->template->basePath;
}
public static function getExtraPath()
{
return $_SERVER['HTTP_HOST'] == 'grido.bugyik.cz'
? '/example'
: NULL;
}