Problémy s ajaxovým formulářem

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

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)

Tharos
Člen | 1030
+
0
-

K problému číslo 3 – formuláře v Nette nemají své vlastní úložiště flash zpráv, nejsou potomky třídy Control.

mlha
Člen | 58
+
0
-

Tharos napsal(a):

K problému číslo 3 – formuláře v Nette nemají své vlastní úložiště flash zpráv, nejsou potomky třídy Control.

Musím tedy formuláři nějak registrovat componentu/presenter pro vypisování jeho flashMessages?

bazo
Člen | 620
+
0
-

vo formulari sa nepouzivaju flash spravy, ale errory sa vypisuju priamo vo formulari. flash messages sa zobrazuju predsa v sablonach

mlha
Člen | 58
+
0
-

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

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

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.