Grido – načtení dodavatelů (id, název) → zobrazení názvu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Desttro
Člen | 126
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Jo to prošlo, napsal jsem místo sppliers suppliers → snad to nebyl záměr.
Hází to zase: *Cannot read an undeclared column ‚suppliers.name‘. *

Desttro
Člen | 126
+
0
-

Tak to vyhazuje i když to dám do jednotného čísla – tabulku suppliers dám na supplier a sloupec v manufacturing taky bez toho „s“ na konci.
Vyhazuje to tohle:

Nette\MemberAccessException
Cannot read an undeclared column ‚supplier.name‘.

marioff
Člen | 69
+
0
-

skus vymazat cache

Desttro
Člen | 126
+
0
-

Zkusil jsme smazat obsah /temp/cahche ale nepomohlo.
Mám někam dát ten kód?

Oli
Člen | 1215
+
0
-

Nevím, proč ti tohle nefunguje. Můžeš ještě zkusit místo tečkový notace udělat callback

->setColumn(function($item){return $item->suppliers->name;});

Pokud ani tohle nepomůže tak pošli asi celou metodu, kde vytváříš to grido. Pak mě nenapadá, kde je problém…

Desttro
Člen | 126
+
0
-

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;
    }
Desttro
Člen | 126
+
0
-

Nechápu proč mi filterSelect nebere ani pole, vždy to hlásí tohle:

Warning
strtoupper() expects parameter 1 to be string, object given

$grid->addFilterSelect('supplier_id', 'Dodavatel',  array(
    '' => '',
    'Firma1' => 'Firma1',
    'Firma2' => 'Firma2',
    'Firma3' => 'Firma3'
));
Desttro
Člen | 126
+
0
-

Neví někdo prosím jak na to? Furt si s tím lámu hlavu a nemůžu na to přijít.

Děkuji za každou pomoc