Neodeslané parametry formuláře

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

Ahoj, řeším takový delikátní problém, mám vytvořený formulář:

function createComponentAddToBasket() {
        $product = $this->EshopProdukt->getByUrl($this->presenter->getParameter("produkt"), $this->getSiteId());
        if (!$product) {
            $this->error("Tento produkt neexistuje");
        }
        $form = new Form();
        $form->addText("count", "Počet")->addRule(Form::INTEGER, "Musí být číslo")->setValue(1)->setAttribute("type", "number");
        $form->addSelect("shopitemid", "Varianta", $this->EshopVarianty->getVariantByProductId($product->id, $this->priceListId));
        $form->onSubmit[] = array($this, 'handleAddToBasket');
        return $form;
    }

ten používám klasicky v šabloně – odesílám skrze AJAX, když se podívám na datový provoz, tak vidím odeslaná data formuláře:

shopitemid:128
count:1
do:addToBasket-submit

ale když se na to podívám v obslužné metodě:

function handleAddToBasket(Form $form) {
        $v = $form->getValues(true);
        print_r($v);
        $product = $this->EshopProdukt->getProductById($v->shopItemId, $this->priceListId, $this->getSiteId());

        if (!$product) {
            $this->error("Tento produkt neexistuje");
        }
        $this->kosik->addItem($product, $v->count);
        $this->payload->product = $v->count . "x " . $product->name . ", " . ($product->price * $v->count) . " Kč";
        $this->redrawControl("kosik");
    }

tak mi ten print_r() vypíše jen:

Array
(
[count] ⇒ 1
[shopitemid] =>
)

kde může být chyba?

Šaman
Člen | 2666
+
0
-

Chyba může být v tom, že komponentu nejprve překreslíš (ve startup, nebo action metodě) a teprve na ni se zavolá ten handle? Bez AJAXu ti to funguje?

exquis
Člen | 83
+
0
-

ani bez ajaxu, v nem bych nerekl, ze je problem, kdyz i vidim, ze data odesila spravne, tak nechapu, proc si pak muzu precist jen „count“ když se odeslal i shopitemid..

exquis
Člen | 83
+
0
-

tak ještě jeden poznatek – když dám print_r($_POST) tak tam ta hodnota je, takže chyba je někde ve zpracování těch údajů u nette

Šaman
Člen | 2666
+
0
-

Můžeš někam nasdílet celý projekt? Třeba na GitHub, nebo BitBucket? Máš tam někde zakopanýho psa, ale bude to v jiné části kódu.
Ono i v této ukázce máš hromadu věcí, které rozhodně nejsou best-practise, ale neměly by způsobovat tuhle chybu. Je tam ale jedna důležitá věc – po odeslání zpracovávej formulář v události onSuccess. Ta se zavolá až po validaci, takhle by se ti zpracoval i nevalidní formulář.
Jo a jaká je verze Nette?

Editoval Šaman (6. 5. 2015 14:19)

Myiyk
Člen | 321
+
0
-

Problém může dělat setValue, raději použij setDefault, protože setValue přepisuje příchozí data.

U těch výchozích hodnot pro select, funguje načtení dat z databáze i při zpracování formuláře?
$form->getValues(true); vytvoří formulář a formulář načítá pro kontrolu data z DB.

Protože při zpracování formuláře se ověřuje, jestli tam taková položka je. A když ty proměnné $product->id a $this->priceListId budou mít jiné hodnoty při zobrazení formuláře a zpracování.
DB pochopitelně vrátí jiná nebo žádná data a Nette/Form to kontroluje.

exquis
Člen | 83
+
0
-

Rád bych nasdílel celý projekt, ale měl by to být placený a to nevím jak by se to zákazníkovi líbilo, to bohužel riskovat nechci, ale je mi jasný, že bez toho může být pomoc poměrně komplikovaná.

Jinak běžně to beru s onSuccess, ale teď už jsem zkoušel hledat chybu vážně všude, je to dokonce vidět i u toho getValues(true) a následného použití jako objektu, to je taky špatně, ale jak říkám, žkoušel jsem všechno možné..

exquis
Člen | 83
+
0
-

Verze 2.3.1

exquis
Člen | 83
+
0
-

Asi jsi na to kápnul, vypadá to, že nette nemá oproti čemu ověřovat, používám tam parametr který není dostupný:

$product = $this->EshopProdukt->getByUrl( $this->presenter->getParameter(„produkt“), $this->getSiteId());

Myiyk
Člen | 321
+
0
-

Jednoduchy test, jestli formulář funguje: přidej tam položku $form->addText('test');. Pokud nepoužíváš automatické generování, tak přidej položku do šablony. Pošli tím nějaký text a v php kontroluj jestli ti to přišlo.

exquis
Člen | 83
+
0
-

test prošel, už mi to nedalo, smazal jsem cache a najednou se posílá i ten parametr, co potřebuji, asi někde něco uvízlo, ale už nyní OK.. děkuji za pomoc

Šaman
Člen | 2666
+
0
-

Normálně by to mělo zahlásit, že tento produkt neexistuje. (Pokud po redirectu již nemáš ten parametr.) Chybu to asi nevyhodilo právě kvůli tomu, že to zpracováváš v onSubmit a nikoliv onSuccess. Takže to vypadá na kobinaci několika nefatálních chyb, které když spojily síly, tak to rozbily úplně :)