Multiplier form – manuální vykreslení

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

Zdravím,
řeším problém s dynamickým vytvářením formulářů pomocí Multiplieru. Potřebuji manuální vykreslování, šablona vypadá nějak takto:

{foreach $photos as $photo}
	{form descriptionForm-$photo->id, class => "form-horizontal form-one-column"}
	...
	{/form}
{/foreach}

Formuláře pak vytvářím tímto způsobem:

protected function createComponentDescriptionForm($name) {
    $parent = $this;

    return new \Nette\Application\UI\Multiplier(function ($photoId) use ($parent, $name) {
                return new DescriptionForm($parent->service, $parent->id, $photoId, $parent, $name);
            });
}

Nicméně pokud pak v DescriptionForm zavolám konstruktor předka parent::__construct($parent, $name);, ozve se mi chyba: Component with name 'descriptionForm' already exists.

Formulář potřebuji připojit k Presenteru protože mu nastavuji setAction(). Je tenhle způsob vytváření formuláře nepodporovaný nebo mám jen někde chybu? Díky za odpověď.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Chybí klíčová část hádanky, kostruktor toho DescriptionForm :). S ním se to podaří rozřešit.

Etruska
Člen | 25
+
0
-

Nedával jsem ho, protože ta chyba vyskočí hned u parent::__construct, ale tady je:

public function __construct(\EstatesService $service, $estateId, $photoId, $parent, $name) {
    parent::__construct($parent, $name);

    $this->estateId = $estateId;
    $this->photoId = $photoId;
    $this->estatesService = $service;

    $this->addText("description", "Popis:");

    $this->setAction($this->presenter->link('Estates:edit', array('id' => $estateId, 'showTab' => 'photos', 'do' => 'photos-descriptionForm-submit')));

    $this->addSubmit('post', "Uložit údaje");
    $this->onSuccess[] = callback($this, 'formSubmitted');
}

Důležité tam je, že potřebuji ručně nastavit setAction a to, jak jsem vydedukovoval, nejde bez připojení k Presenteru.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Každý z těch drobných formuláříků má v názvu jiný $photoId – ten musí být také dál předán do konstruktoru. Tedy:

return new \Nette\Application\UI\Multiplier(function ($photoId, $parent) {
	return new DescriptionForm($parent->service, $parent->id, $photoId, $parent);
});
public function __construct(\EstatesService $service, $estateId, $photoId, $parent)
{
	parent::__construct($parent, $photoId);
Etruska
Člen | 25
+
0
-

Díky moc, to je ono :)