Multiplier a jeho použití v šabloně
- sejmor
- Člen | 63
Zdravím a mám prosbu,
V šabloně volám formulář (komponentu s multiplierem) předávám mu id:
{form shopForm-$item->id}
Potřebuju mu přímo ze šablony předat ještě jeden parametr. Něco jako
{form shopForm-$item->id-$item->pocetkusu}
Jde to nebo je to čistě jenom identifikátor ?
Pokud to jde jaká je syntax ? … já to zaboha nemůžu najít :-)
Díky
- Vojtěch Dobeš
- Gold Partner | 1316
Multiplier slouží k tomu, že se vytvoří více instancí dané komponenty.
Záleží, z jakého důvodu si předáváš parametry makrem
{control}
. Ty můžeš předávat i nadále (odděleně jako
další parametry makra, v případě dvou a více musí být mezi sebou
odděleny čárkou)…
{control shopForm-$item->id $item->pocetkusu}
…a jako u každé jiné komponenty se předávají metodě
render()
(z vlastní zkušenosti však doporučuji toto
předávání zcela opustit, protože není kompatibilní s Ajaxem). Pokud
obecně potřebuješ do každého z x formulářů (čehokoliv) dostat
nějaký parametr, pokus se tak učinit v továrničce (resp. v multiplierové
továrničce), a ne v šabloně – tam je obecně pozdě pro jakoukoliv
funkcionalitu a nemělo by se na to spoléhat.
Vysvětlující článek k Multiplieru
Editoval vojtech.dobes (2. 11. 2012 18:10)
- sejmor
- Člen | 63
Tento argument abych nepředával žádné parametry jsem četl již několikrát, ale popravdě moc nechápu jak to mám předat. Chci to udělat principielně správně – proto bych prosil jenom o schematické našťouchnutí abych nevymejšlel kolo. Jedná se mi momentálně o zobrazení klasického košíku kde budu mít možnost změnit počet kusů konkrétního idproduktu.
Mám to udělané tak že model mi vrátí pole s idéčkem produktu,popisem a počtem kusů. V prezenteru ho předám do šablony, kde ho přes foreach zobrazím. Potřebuju zde ale vygenerovat formulář, který má v hidden IDčko a v textovém poli počet kusů. Kdybych to měl dělat přes multiplier tak tomu můžu ze šablony předat jenom jeden identifikátor. Já mu ale potřebuju předat ID a počet kusů. Jak by to tedy správně mělo být ? Mám to udělat tak že do multiplieru předám jenom identifikátor řádku košíku a on si příslušné atributy (idzboží a počet kusů) nastaví sám. Je to ta správná metoda nebo jsem úplně mimo ?
Díky za případný nástřel … jsem stará struktura, nette je pro mě pořád příliš abstraktní … ale líbí se mi to a postupně si zvykám. Nechci jenom psát prasácky :-)
- Nox
- Člen | 378
- No pro komponenty máš v Presenteru továrničku
- V továrničce máš ten multiplier
- V multiplieru používáš ten callback to vytváří jednu instanci
- V tom callbacku máš nějaké vytvoření toho objektu instance (ať už přes $container->createXYZ nebo new) → a tam to voláš s nějakými parametry
- Tak na to místo ve 4 prostě přidáš příslušný parametr
Takže místo
<?php
return $container->createCart($id); // třeba
?>
dáš
<?php
return $container->createCart($id, $myService->getCartCount($id)); // ...třeba
//nebo
return $container->createCart($id, $cartCounts[$id]); // ...třeba
//...
?>
Teď koukám že v kuchařce na mutliplier je toto popsané:
https://doc.nette.org/…n/multiplier
- sejmor
- Člen | 63
Díky za vysvětlění … udělal jsem to takto (a funguje to). Teď mi jde v podstatě jenom o to jestli tam není nějaká prasárna nebo nesystematičnost a jestli tím byl myšlen tento způsob.
V presenteru mám
protected function createComponentShopFormEdit()
{
$service=$this;
return new Multiplier(function ($itemId) use ($service) {
$kosikrow=$service->context->shoppingcart->getShoppingCart();
$form = new Form;
$form->addText('pocetkusu', 'Počet zboží:')
->addRule($form::FILLED,'Pole musí být vyplněné')
->addRule($form::INTEGER, 'Počet kusů musí být celé číslo')
->setType('number')
->setDefaultValue($kosikrow[$itemId]->pocetkusu);
$form->setTranslator($service->context->translator);
$form->onSuccess[] = callback($service, 'shopFormSubmitedEdit');
$form->addHidden('itemId', $itemId);
$form->addSubmit('send', 'Upravit počet kusů');
return $form;
});
}
A v šabloně:
{control shopFormEdit-$item->id}
Editoval sejmor (2. 11. 2012 12:51)