Předání proměnné typu ActiveRow komponentě

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

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

vitkutny
Člen | 73
+
0
-

zkus
{control component, $row|noescape}
nebo
{control component, !$row}

kytart
Člen | 10
+
0
-

vitkutny napsal(a):

zkus
{control component, $row|noescape}
nebo
{control component, !$row}

bohužel žádný rozdíl, ale díky

rixi
Člen | 109
+
0
-

workaround by bol predavat integer $row->id a ActiveRow riesit az v komponente

jiri.pudil
Nette Blogger | 1032
+
0
-

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

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

jiri.pudil napsal(a):

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“).

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…