20× renderování stejného formu/komponenty, např. vložení produktu do košíku
- Vojtěch Dobeš
- Gold Partner | 1316
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
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
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
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!