Problémy s ajaxovým formulářem
- mlha
- Člen | 58
Používám formulář který je obalený \Nette\Application\Control, abych ho mohl zobrazovat a odesilat AJAXově. Formulář otevírám pomocí signálu z DataGridu, který zároveň posílá parametr id.
Problém č.1
Abych se dostal k tomu parametru, musím nejprve componentu formuláře přidat
do presenteru
<?php
//$form je typu \Nette\Application\Control
//umi ale vetsinu method \Nette\Application\AppForm
//tj. mapuje na vnitrni formular typu \Nette\Application\AppForm
$this->addComponent($form, 'editItemForm');
$id = $form->getParam('id');
?>
Problém č.2
Na hodnotě parametru je závislá nabídka hodnot v selectboxu. Takže
vytvoření selectboxu a dalších částí formuláře musí být až
po…?!
SelectBox pak vraci NULL, ale o tom jsem se již něco dočetl zde
<?php
...
$input1 = $form->addHidden('type');
$input1->setValue($id);
$combo1 = $form->addSelect('item', $comboText[$id], $option[$id], 1);
$form->addSubmit('add', 'Přidat');
$form->getForm()->onSubmit[] = callback($this, 'editItemFormSubmited');
?>
Problém č.3
Jak se dostanu k flashovým zprávám formuláře? Potřebuji zjistit, že
formulář nebyl správně vyplněn a zareagovat jeho NEzavřením a zobrazením
hlášek.
Editoval mlha (29. 6. 2010 13:03)
- mlha
- Člen | 58
Varianta vytvoření formuláře A)
<?php
//$form je typu \Nette\Application\Control
//umi ale vetsinu method \Nette\Application\AppForm
//tj. mapuje na vnitrni formular typu \Nette\Application\AppForm
$this->addComponent($form, 'editItemForm');
$id = $form->getParam('id');
...
$input1 = $form->addHidden('type');
$input1->setValue($id);
$combo1 = $form->addSelect('item', $comboText[$id], $option[$id], 1);
$form->addSubmit('add', 'Přidat');
$form->getForm()->onSubmit[] = callback($this, 'editItemFormSubmited');
$form->getForm()->onInvalidSubmit[] = callback($this, 'editItemFormError');
?>
Formulář je nejprve přidán do presenteru a až pak se vkládají
formulářové prvky a nastavují callbacky.
Tato varianta „funguje“, ale po jeho odeslání se nespustí ani
„editItemFormSubmited“ ani „editItemFormError“.
Varianta vytvoření formuláře B)
<?php
//$form je typu \Nette\Application\Control
//umi ale vetsinu method \Nette\Application\AppForm
//tj. mapuje na vnitrni formular typu \Nette\Application\AppForm
$form->getForm()->onSubmit[] = callback($this, 'editItemFormSubmited');
$form->getForm()->onInvalidSubmit[] = callback($this, 'editItemFormError');
$this->addComponent($form, 'editItemForm');
$id = $form->getParam('id');
...
$input1 = $form->addHidden('type');
$input1->setValue($id);
$combo1 = $form->addSelect('item', $comboText[$id], $option[$id], 1);
$form->addSubmit('add', 'Přidat');
?>
Oproti předchozí variantě jsou callbacky definovány před vložením
formuláře do presenteru.
Tato varianta „funguje“, po jeho odeslání se spustí
„editItemFormSubmited“, ale $values = $form->getValues(); je prazdné a i
$form[‚item‘]->getRawValue() nefunguje.
Varianta vytvoření formuláře C)
<?php
//$form je typu \Nette\Application\Control
//umi ale vetsinu method \Nette\Application\AppForm
//tj. mapuje na vnitrni formular typu \Nette\Application\AppForm
$input1 = $form->addHidden('type');
$combo1 = $form->addSelect('item', 'temptext', NULL, 1);
$form->addSubmit('add', 'Přidat');
$form->getForm()->onSubmit[] = callback($this, 'editItemFormSubmited');
$form->getForm()->onInvalidSubmit[] = callback($this, 'editItemFormError');
$this->addComponent($form, 'editItemForm');
$id = $form->getParam('id');
...
$input1->setValue($id);
$combo1->setItems($option[$id]);
$nameLabel = $combo1->getLabelPrototype();
$nameLabel->setText($comboText[$id]);
?>
Zde jsou všechny formulářové prvky a callbacky definovány před
vložením formuláře do presenteru.
Tato varianta „funguje“, po jeho odeslání se spustí
„editItemFormSubmited“, ale $values = $form->getValues(); obsahuje item =
NULL. K původní hodnotě se lze dobrat přes
$form[‚item‘]->getRawValue().
Bohužel v této variantě se nedaří změnit Label comboboxu – zůstává
původní ‚temptext‘. Každopádně se tato varianta nejvíce blíží
ideálnímu stavu.
- mlha
- Člen | 58
bazo napsal(a):
vo formulari sa nepouzivaju flash spravy, ale errory sa vypisuju priamo vo formulari. flash messages sa zobrazuju predsa v sablonach
Pokud se dostanu do handleru pro spracovani formuláře, tak si případné vlastní hlášky posílám do Datagridu, který beztak překresluju. Pokud ale není formulář korektně vykreslen, tak se hlášky generují v Nette a jdou buhví kam.
Takže konečně jsem se dostal do chyboveho handleru a tam zajistil aby se formulář neukryl. Tím se mi konečně zobrazila flashMessage.
bazo DĚKUJU!!!
Akorát ten formulář není v původním stavu. Zřejme nedošlo k přenesení parametrů, které měl při vytvoření.
A stále řeším problém viz. předchozí příspěvek.
Editoval mlha (29. 6. 2010 15:01)
- mlha
- Člen | 58
Problem jsem vyřešil a zde je výsledek mého šetření:
Zásadní je použití methody
<?php
$this->addComponent($form, 'editItemForm');
?>
Pro můj případ je nutné připojit komponentu k presenteru již při vytváření
<?php
$form = new \Nette\Application\AppForm($this, 'editItemForm');
?>
pak již není třeba volat addComponent ani return $form.