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

Zdravím,
mám takový problém. Potřebuji si udělat formulář, který dynamicky mění počet položek, které jsou úplně stejné, jen se liší labelem a jménem. Udělal jsem to tedy tak, že jsem vytvořil vzor, který dále klonuju. Problém nastane ve chvíli, kdy chci přiřadit nějaké validační pravidla (možná i něco jiného, ale tam jsem se ještě nedostal.

<?php
	$pattern = new \Nette\Forms\Controls\TextArea();

	//$pattern->addRule(...);

	$clone = clone $pattern;

	$form->addComponent($clone, "name");
?>

Takto napsaný kód běží, tedy do doby, než odkomentuji přidání validačního pravidla. Běh pak končí chybovou hláškou:

Component '' is not attached to ‚Nette\Forms\Form‘

Vůbec mě nenapadá kde bych ještě mohl hledat problém. Důvod takového řešení je ten, že pattern může být prakticky jakýkoliv formulářový prvek. Používám to totiž na více věcí, ne konkrétně a poměrně často.

Edit: Po prozkoumání jsem přišel na to, že problém může hlásit pouze metoda lookup, tak jsem ji zkusil zavolat v presenteru s udávaným typem a vrátila mi korektně objekt formuláře. Ale vykreslení {input name} v šabloně zase zhavaruje. A dále, je jedno, jestli validační pravidlo přidám před klonováním nebo po klonování, výsledek je stejný, ale pokud naklonuji některý z prvků formuláře, přidaných metodou add*, tak vše funguje.

Editoval GAZDOWN (5. 6. 2013 18:45)

enumag
Člen | 2118
+
0
-

To klonování se mi nelíbí, použil bych spíše factory. Zda to vyřeší problém nevím, ale mohlo by. Neuvedl jsi na kterém z uvedených řádků to zhavaruje (na tom addRule těžko).

Editoval enumag (5. 6. 2013 19:38)

GAZDOWN
Člen | 3
+
0
-

Procházel jsem debugger, zhavaruje to na $rule->control->getForm()->getTranslator() v metodě Rules formatMessage(). getForm volá jen lookup(‚Nette\Forms\Form‘, TRUE). Zajímavé je, že to zhavaruje po zavolání $form[„name“]->getControl(), ale před tím uvedené $form->lookup(‚Nette…Forms‘, TRUE) projde bez problémů.

Editoval GAZDOWN (5. 6. 2013 19:57)

GAZDOWN
Člen | 3
+
0
-

Tak jsem to vyřešil tak, že jsem vzor připojil také k formulaři a teprve pak kolonal. Výsledek je, že se hodnoty v monitoru jsou pak správné, a lookup vrací korektní výsledky a tím pádem aplikace nespadne. Díky za rady.

PS. tu továrničku zvážím.