Předání proměnné typu ActiveRow komponentě
- kytart
- Člen | 10
Potřebuju v šabloně vykreslit komponentu a předat jí jako parametr proměnnou typu Nette\Database\Table\ActiveRow.
{foreach $rows as $row}
{control component, $row}
{/foreach}
vyhodí to ale chybu „Argument 1 passed to HomepagePresenter::createComponentComponent() must be an instance of Nette\Database\Table\ActiveRow, string given, called in C:\wamp\www\Appealon\libs\Nette\loader.php on line 1797 and defined“
když místo toho dám v šabloně {dump $row}
tak to
normálně vypíše, že je to ActiveRow zatímco když zkusím jenom
{$row}
, tak se to přetypuje na string a vypíše to primární
klíč řádku. Z nějakého důvodu se tedy přetypuje na string, když se
předává komponentě, ale nevim proč a jak to ošetřit. Díky
- jiri.pudil
- Nette Blogger | 1032
Pozor! Argumenty, které uvádíš v makru control
, se
předávají až render()
metodě. Tovární metoda
createComponent*()
dostává název komponenty (v tomhle
případě „component“).
- frosty22
- Člen | 373
Přesně tak, makro:
{control component, $row}
neytváří novou instanci objektu, ale máš stále jednu instaci – právě vytvořenou tou továrničkou createComponentComponent() ..
A to makro pouze volá metodu render, čili to je:
{$component->render($row)}
Pozn.: A nette se stará právě o to, aby se ta továrnička zavolala pouze jednou a to při prvním přístupu k té komponentě.
Editoval frosty22 (14. 8. 2013 16:57)
- kytart
- Člen | 10
jiri.pudil napsal(a):
Pozor! Argumenty, které uvádíš v makru
control
, se předávají ažrender()
metodě. Tovární metodacreateComponent*()
dostává název komponenty (v tomhle případě „component“).
Luxus, díky. Stačilo odstranit proměnnou z metody createComponent*() a funguje to :-) Tenhle poznatek o procesu vykreslení komponenty si budu od teď pamatovat…