Multiplier v Nette je nástroj pro vytváření komponent dynamicky za běhu.
Umožňuje definovat továrničku pro více komponent.
Funguje na principu vnořených komponent – každá komponenta zděděná od NetteComponentModelContainer může obsahovat další komponenty.
API: https://api.nette.org/Nette.Application.UI.Multiplier.html
Příklad: Výpis produktů v eshopu s formulářem pro vložení
Řešení 1 (bez použití multiplieru)
Celý výpis obalíme do jednoho formuláře.
Řešení 2 (s použitím multiplieru)
Multiplier vystupuje v pozici rodiče, který své potomky dokáže vytvářet dynamicky pomocí callbacku předaného v konstruktoru.
protected function createComponentShopForm()
{
return new Multiplier(function ($itemId) {
$form = new NetteApplicationUIForm;
$form->addText('count', 'Počet zboží:')
->addRule($form::FILLED)
->addRule($form::INTEGER);
$form->addHidden('itemId', $itemId);
$form->addSubmit('send', 'Přidat do košíku');
return $form;
});
}
V šabloně u každého zboží vykreslíme formulář, kde každý bude unikátní komponentou.
{foreach $items as $item}
<h2>{$item->title}</h2>
{$item->description}
{control shopForm-$item->id}
{/foreach}
Formát argumentu předaný makru {control}:
{control shopForm-$item->id}
- shopForm – název komponenty
- $item->id – id potomka
Postup:
- první iterace foreach
- shopForm neexistuje – zavolá se továrnička createComponentShopForm
- na vrácrené komponentě (instanci Multiplieru) je zavolána továrnička konkrétního formuláře (anonymní funkce předaná v konstruktoru Multiplieru)
- druhá a další iterace foreach
- komponenta shopForm již existuje
- hledáme vždy jiného potomka komponenty shopForm (dle $item->id) – znovu je volána anonymní funkce která vrací nový formulář
Každá továrnička dostává jako svůj první argument název tvořené komponenty ($item->id).
Zdroje
- https://pla.nette.org/cs/multiplier
- https://doc.nette.org/cs/2.4/components#toc-komponenty-do-hloubky
- https://pla.nette.org/cs/posobota-36-jan-tvrdik-komponenty