Multiplier a jeho použití v šabloně

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

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

Felix
Nette Core | 1196
+
0
-

Ja mam pocit, ze to nejde. Alespon co vim z drivejska.

sejmor
Člen | 63
+
0
-

A jenom tak dotaz pro znalce. Když mám tedy klasickou úlohu pro multiplier a potřebuju si předat víc parametrů udělám si komponentu, kterou zavolám:

{control shopFormEdit $item->id,$item->pocetkusu}

Jaká je tedy výhoda multiplieru ?

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

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

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
+
0
-
  1. No pro komponenty máš v Presenteru továrničku
  2. V továrničce máš ten multiplier
  3. V multiplieru používáš ten callback to vytváří jednu instanci
  4. 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
  5. 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
+
0
-

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)

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

Co se týče využití Multiplieru, tak je to naprosto košer.

sejmor
Člen | 63
+
0
-

Díky moc všem :-)