Action s aktuálními parametry

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

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

Pavel Kravčík
Člen | 1205
+
0
-

A zkoušel si ho @persistent nebo uložit ty věci do $_SESSION?

David Matějka
Moderator | 6445
+
0
-
  1. 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..
  2. formular generuje odkaz pomoci ->link('this') a v takovem pripade se prenaseji dva druhy parametru:
  1. persistentni (tedy ty s anotaci @persistent)
  2. 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
+
0
-

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

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.

zt
Člen | 13
+
0
-

ano to mas pravdu, jenze tech komponent se vytvori 20 na strance ktera != 1, tzn 20 dotazů

jinak dík moc, actionDefault($page) je ono :)

Editoval zt (21. 7. 2015 14:11)

David Matějka
Moderator | 6445
+
0
-

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

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

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

@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

zt
Člen | 13
+
0
-

chápu, tenhle pripad me nenapadl kdyz zatim delam jen prototyp

no, ale ta komponenta se stejne musi 20× vytvorit aby se ten form incialoval a zavolal jeho callback ne?

Editoval zt (21. 7. 2015 15:24)

David Matějka
Moderator | 6445
+
0
-

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

zt
Člen | 13
+
0
-

pri signalu se tedy vytvoří pouze jedna komponenta? v tom pripade by ten fallback daval skutecne vetsi smysl

David Matějka
Moderator | 6445
+
0
-

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