20× renderování stejného formu/komponenty, např. vložení produktu do košíku

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

dzosincuk: jeste ze to tu nekdo napsal :) To je podle me to prave reseni. Je treba vytvorit tolik komponent, kolik se jich ma vykreslit. A jak David psal, to neni nova feature, ale design pattern.

Jedina nevyhoda je zatim nefunkcni ajax, respektive snippety (s odeslanim neni problem).

mildabre
Člen | 62
+
0
-

Výpis náhledu produktů v eshopu kde každý produkt má tlačítko „Do košíku“ + textbox pro počet kusů bych v PHP řešil jedním formulářem a v Nette by to mělo jít také.

DIV kde jsou vypsané produkty by v sobě obsahoval jeden společný FORM a v něm by byly boxy produktů s INPUT type=submit name=addtocart1234 value=„Do košíku“ a INPUT type=text name=quantity1234 value=„1“.

Klienta potřebuje odeslat product_id + quantity na což jeden formulář stačí. Celý trik je v zakódování product_id do atributu name které na server přenese metoda POST.

Vytvoření HTML stránky:

  • z databáze produkty do pole
  • foreachem nad polem produktů v komponentě formuláře vygenerujeme tlačítka a textboxy s product_id zakódovaným do atributu name těchto prvků
  • foreachem nad polem produktů v šabloně vygenerujeme náhledy produktů s tlačítky a textboxy

Zpracování POST tlačítka „Do košíku“

Kliknuté tlačítko lze identifikovat v Nette pomocí onClick[] nebo isSubmittedBy(). Nám ale stačí obsloužit jakékoliv kliknutí a na to nám stačí vlastnost onSubmit[] = $this->handleAddToCart.

Metoda handleAddToCart() by z pole $_GET vypreparovala product_id a dohledala počet produktů.

Validace

Nette vestavěná validace se asi nebude hodit – potřebovali bychom validovat pouze textbox související s kliknutým tlačítkem. V surovém Javascriptu by to bylo jednoduché.

Výhody: Jednodušší HTML, jednodušší zpracovatelský kód, rychlejší vykreslení stránky.

Nevýhody: Částečně obchází standardní formulářově-komponentní postupy Nette čímž bude kód hůře udržovatelný a asi i hůře akceptovatelný Nette komunitou.

Editoval mildabre (13. 12. 2012 1:43)

llook
Člen | 407
+
0
-

Samozřejmě by to tak šlo udělat, ale proč? Vždyť použití Multiplieru je o tolik snazší. Výhody:

  • Jednodušší HTML:
{foreach $items as $item}
	...
	{control addToCart-$item->id}
{/foreach}
  • Jednodušší zpracovatelský kód.
protected function createComponentAddToCart()
{
	$cart = $this->cart;
	return new Multiplier(function ($id) use ($cart) {
		$form = new Form;
		$form->addProtection();
		$form->addText('quantity');
		$form->addSubmit('add', 'Přidat');
		$form->onSuccess[] = function ($form) use ($id, $cart) {
			$cart->addGoods($id, $form->values['quantity']);
			$form->presenter->redirect('this');
		};
		return $form;
	});
}
  • Rychlejší odeslání formuláře (méně přenášených dat).
  • Dá se použít Nette validace.
Filip Procházka
Moderator | 4668
+
0
-

Best-practise je přesně to, co napsal @llook. Jen bych možná vymazlil maličko jinak to zpracování

$form->onSuccess[] = function ($form) use ($cart) {
	$cart->addGoods($form->name, $form->values['quantity']);
	$form->presenter->redirect('this');
};

V Multiplieru je jméno formuláře IDčko toho zboží :)


Já vám ty starý témata asi začnu jednoduše zamykat. Nekromanceři!