addComponent v handle metode a isSubmittedBy
- libik
- Člen | 96
Ahoj,
zarazil jsem se na podivnem chovani, ktere muze byt ale podivne jen pro me :)
Mam standardni formular
<?php
protected function createComponentQuicklinkForm()
{
$form = new Form;
$form->addSubmit('submit', 'Odeslat')->setAttribute('class', 'btn btn-success');
$form->onSuccess[] = callback($this, "processQuicklinksForm");
return $form;
}
?>
ktery nacitam do modalu ajaxem pres handler:
<?php
public function handleAddForm()
{
if ($this->isAjax())
{
$this['quicklinkForm']->addComponent(new \Nette\Forms\Controls\SubmitButton('Odeslat a vložit další'), 'submitAndInsert', 'cancel');
$this['quicklinkForm']['submitAndInsert']->setAttribute('class', 'btn-success');
$tpl = $this->template->setFile(__DIR__ . '/../templates/QuickLinks/add.latte');
$this->payload->tpl = (string) $tpl;
$this->payload->modal = true;
$this->redrawControl();
}
}
?>
Pro tento pripad si formular rozsiruju o submitAndInsert tlacitko, ktere chci odchytnout pri zpracovani formulare:
<?php
if (isset($form['submitAndInsert']) AND $form['submitAndInsert']->isSubmittedBy())
$this->redirect("default", array('goAdd' => true));
else
$this->redirect("default");
?>
$form[‚submitAndInsert‘] ale neexistuje.
Kdyz submitAndInsert vlozim primo do tovarnicky formulare (addSubmit), tak existuje. Resim to tedy tak, ze tovarnicka prijima parametr, kterym si submitAndInsert vyresim, kde potrebuju.
Je to vlastnost nebo nejaky bug?
EDIT: Jeste mam obdobnou zalezitost s removeComponent v handleru.
Editoval libik (13. 5. 2014 18:35)
- Zax
- Člen | 370
Tuším (nevím jistě) kde je problém:
Když odešleš formulář, tak se vlastně přesměrováváš na jiný handle, tudíž po odeslání nemá jak vytvořit to tlačítko – nezavolá se handleAddForm.
Jenom střílím od boku..
EDIT: Formulář se totiž vždy tvoří dvakrát – jednou při zobrazení a jednou při odeslání. Jinak totiž není možné zajistit validaci apod.
Editoval Zax (13. 5. 2014 19:13)
- Zax
- Člen | 370
Však jo – při zobrazení se zavolá handleAddForm, tlačítko se vytvoří a zobrazí. Pak ten formulář odešleš, což vyvolá nový request (=formulář je třeba opět vytvořit), který už ale nezavolá handleAddForm, protože akce formuláře nevede na handleAddForm, ale na nějaké quickLinkFormSubmitted (či jak to máš pojmenované). Proto to tlačítko neexistuje.
Mělo by to fungovat, když si celé to if($this->isAjax()) přesuneš do továrny.
Editoval Zax (13. 5. 2014 19:35)