Neodeslané parametry formuláře
- exquis
- Člen | 83
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
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
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
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é..
- Šaman
- Člen | 2666
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ě :)