Action s aktuálními parametry
- zt
- Člen | 13
Jsem na http://site.dev/?page=13
a mám komponentu kterou
vytvářím a renderuji formulář. Dejme tomu button přidání produktu do
košíku. Pak mám presenter kde mam createComponentAdd s multiplierem,
actionDefault kde nacitam produkty, renderDefault kde je predavam do sablony.
Ovsem formulář mi nepridá onen GET parametr ?page=13, tzn při odeslání
formuláře si to myslí, že ?page=1 tudíž má proměnná obsahuje produkty
ze stránky 1. Je možné nějak docílit toho aby tam bylo i to ?page=13?
Editoval zt (21. 7. 2015 12:13)
- zt
- Člen | 13
public function createComponentAddToCart() {
return new Multiplier(function($productId) {
$product = $this->products[$productId];
$control = new AddToCartControl($product, $this->cart);
return $control;
});
}
$product = $this->products[$productId];
vyhodí offset error,
protože si to mslí, že je na stránce 1, tudíč je proměnná jako pole
porudktů z první stránky a né třinácté
Vygenerovaný form:
<form class="ajax" action="/" method="post" id="frm-addToCart-279-addForm">
<input class="btn btn-default" type="submit" name="add" value="Přidat do košíku">
<input type="hidden" name="do" value="addToCart-279-addForm-submit"><!--[if IE]><input type=IEbug disabled style="display:none"><![endif]-->
</form>
Editoval zt (21. 7. 2015 12:31)
- David Matějka
- Moderator | 6445
- mel bys tam mit nejaky fallback, aby to vybralo z DB, pokud ten produkt v tom seznamu existovat nebude – muze se stat, ze nez uzivatel prida produkt do kosiku, tak se zmeni poradi atd..
- formular generuje odkaz pomoci
->link('this')
a v takovem pripade se prenaseji dva druhy parametru:
- persistentni (tedy ty s anotaci
@persistent
) - uvedene v parametrech odpovidajici action* (nebo pokud action neexistuje,
tak render*) metody. Takze v tvem pripade by melo stacit
actionDefault($page)
.. ale jestli to vubec bude nutne, kdyz dodrizis bod 1 :)
- zt
- Člen | 13
bod 1 nechci dodrzet, fallback je fajn ale to bych pak mel tolik SQL dotazu kolik je na stránce produktů ne? :)
pridani @persistent pomohlo, ale ted kdyz kliknu na produkt (prechod na detail) tak to ten parametr ?page tam take predava, to je nezadouci, co s tim?
Editoval zt (21. 7. 2015 14:03)
- David Matějka
- Moderator | 6445
fallback znamena neco takoveho
if (!isset($this->products[$id])) {
$product = $this->productModel->get($id);
}
tedy to provede dotaz jen pokud ten produkt existovat nebude v seznamu.
a k persistent: pokud to mas v jednom presenteru, tak se to tak bohuzel
chovat bude. Pouzij tu actionDefault($page)
a je to.
- David Matějka
- Moderator | 6445
ale ten dotaz se provede pouze pokud to neni v tech products
.
coz je pravdepodobne pouze po pridani do kosiku. a to muzes udelat jen s jednym
produktem. Takze to provede v maximalne o jeden dotaz vic (a to jeste
vyjimecne)
- Šaman
- Člen | 2668
Některé databázové vrstvy umí zařídit, že se (třeba při
načítání ve foreach cyklu) provede jen jeden dotaz
SELECT … FROM … WHERE id IN [1, 7, 10, 15]
. Třeba
Nette\Database
to umí (za určitých podmínek). Takže to zkus a
až pokud bude problém s výkonem, tak optimalizuj.
Editoval Šaman (21. 7. 2015 14:15)
- zt
- Člen | 13
ne :D .. pokud ten produkt v products neni tak tam nema co delat ani ten
form post prece :) samozrejme se to muze stát, ale zatím vypisuji produkty co
v košíku už jsou, je nesmysl najednou ztrácet produkty z katalogu si
myslím
pokud ovsem by byl na stránce 21, a ono v products byly produkty ze stránky
1, tak se najednou vytvoří třeba 20 komponent coz je
20 zbytecnych dotazů
EDIT:
používá se ORM, to je jedno, problem vyresen, dekuji :)
Editoval zt (21. 7. 2015 14:18)
- David Matějka
- Moderator | 6445
@zt: jsi na strance 1, vybere se prvnich 20 produktu. Uzivatel si chce pridat do kosiku 20. produkt na strance.. ale mezitim pribyl v katalogu jeden produkt, takze 20. produkt je najednou 21. a je na druhe strance. Uzivatel odesle form a Server Error 500. Pridas tam ty tri radky, co jsem poslal a vsechno funguje krasne, provedl se jen jeden dotaz navic v tomhle konkretnim pripade.
A mimochodem, kdyz se tu chcem bavit o zbytecnych dotazech – je celkem zbytecny vybirat po odeslani formulare znovu tech 20 produktu, kdyz ti staci jen jeden produkt
- David Matějka
- Moderator | 6445
ne, po odeslani dojde akorat ke zpracovani signalu na te jedne komponente (ktera se tedy vytvori) a pak presmerujes. Jiz nedojde k vykresleni tech dalsich 19. komponent a tedy ani nedojde k jejich inicializaci
- David Matějka
- Moderator | 6445
Komponenty se vytvareji az kdyz jsou potreba, pri prvnim vykresleni stranky
jsou inicializovany az ze sablony, kde volas
{control addToCart-$id}
a pri zpracovani formulare v okamziku
zpracovani a ano, pouze ta jedna (nette by ani nevedelo, ktery jiny by melo
inicializovat :)). Pak hned presmerujes, takze k inicializaci dalsich vubec
nedojde