Nevola se callback u formulare

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

Zdravim,
snazim se udelat jednoduchou galerii, ale stale se mi nedari zprovoznit formular pro upravu popisu obrazku, ale stale se mi nepodarilo, aby mi po odeslani formulare zavolal callback. Formular vytvarim v presenteru pro konkretni editovany obrazek (vzdy pouze jeden formular na strance), ktery se bude natahovat ajaxove. Zkousel jsem pouzivat jak Nette\Application\UI\Form tak i Nette\Forms\Form, ale vysledek je stejny, callback se nezavola. Zkousel jsem i pouzit onSubmit misto onSuccess.

Delam neco principielne spatne? Jak bych na takovou ulohu mel z pohledu Nette jit?

Pouziti vypada nejak takto (tridu jsem orezal o nadbytecny (funkcni) balast):

<?php

class GalleryPresenter extends BasePresenter
{
  private $model;

  private $edit = array();

  public function editImageForm(GIImage $image)
  {
//     $form = new Nette\Application\UI\Form;
    $form = new Nette\Forms\Form;
    $form->addHidden('id');
    $form->addText('description', 'Popis:');
    $form->addCheckbox('show', 'Zobrazit');
    $form->addSubmit('submit', 'Uložit');
    $form->onSuccess[] = callback($this, 'editImageFormSubmitted');

    $form->setDefaults(array(
      'id' => $image->id(),
      'description' => $image->name(),
      'show' => $image->visible()
    ));
    return $form;
  }

  function editImageFormSubmitted($form)
  {
    Debug::dump($form);
    $values = $form->getValues();
    $this->model->editImage($values['id'], $values['description'], $values['show']);
    $this->model->saveImages();
    $this->flashMessage('Úpravy byly uloženy.');
    $this->edit[$values['id']] = FALSE;
    die();
    if (!$this->isAjax())
      $this->redirect('this');
  }
}
?>

Nette 2.0-beta (2011–07–02), PHP 5.3.6

Diky za pomoc.

Claudie1
Člen | 21
+
0
-

Ahoj.
u téhle verze Nette bys měl použít Nette\Application\UI\Form a onSuccess. formulář bys měl vytvářet jako componentu pomocí metody createcomponent (createcomponentImageForm napriklad) -viz dokumentace https://doc.nette.org/cs/forms#… .

studna
Člen | 181
+
0
-

Jak poznáš, že se callback nezavolá? Debug::dump() už není, teď je Nette\Diagnostics\Debugger::dump(), viz api.

mixi.cz
Člen | 5
+
0
-

studna napsal(a):

Jak poznáš, že se callback nezavolá? Debug::dump() už není, teď je Nette\Diagnostics\Debugger::dump(), viz api.

To poznam podle toho, ze se neprovedou ani zadne dalsi akce uvedene v tom callbacku, kazdopadne diky za upresneni volani dumpu.

Mixi

mixi.cz
Člen | 5
+
0
-

Claudie1 napsal(a):

Ahoj.
u téhle verze Nette bys měl použít Nette\Application\UI\Form a onSuccess. formulář bys měl vytvářet jako componentu pomocí metody createcomponent (createcomponentImageForm napriklad) -viz dokumentace https://doc.nette.org/cs/forms#… .

Podle tohoto prikladu jsem to puvodne chtel implementovat, ale narazil jsem na problem, jak predat metode createComponentImageForm ID obrazku pro ktery se ma formular vytvaret. Zkusim se asi ponorit hloubeji do tvorby komponent a najit nejakou cestu.

Mixi

Majkl578
Moderator | 1364
+
0
-

mixi.cz napsal(a):

Podle tohoto prikladu jsem to puvodne chtel implementovat, ale narazil jsem na problem, jak predat metode createComponentImageForm ID obrazku pro ktery se ma formular vytvaret. Zkusim se asi ponorit hloubeji do tvorby komponent a najit nejakou cestu.

A kde to ID bereš? Proč nepoužiješ property presenteru? Nebo getParam ($this->getParam('id'))?

mixi.cz
Člen | 5
+
0
-

Majkl578 napsal(a):

mixi.cz napsal(a):

Podle tohoto prikladu jsem to puvodne chtel implementovat, ale narazil jsem na problem, jak predat metode createComponentImageForm ID obrazku pro ktery se ma formular vytvaret. Zkusim se asi ponorit hloubeji do tvorby komponent a najit nejakou cestu.

A kde to ID bereš? Proč nepoužiješ property presenteru? Nebo getParam ($this->getParam('id'))?

ID se vola ze sablony, nejak takto:

{foreach $image as $item}
  .... (nahled obrazku)
  {snippet $item->id()}
    {if $edit[$item->id()]}
	{$presenter->editImageForm($item)}
    {else}
       .... (informace o obrazku + signal pro zobrazeni formulare)
    {/if}
  {/snippet}
{/foreach}

Princip je, ze mam nahled galerie s obrazky a po kliknuti na popisek obrazku se misto popisku zobrazi formular pro upravu popisku. Takze ID neni ani v presenteru ani nikde v hlavickach, pouze v danem ajaxovem requestu. Presenter sice ma pole $edit, ale to mu nepomuze, pokud bude vicero editovanych obrazku.

Editoval mixi.cz (3. 8. 2011 0:27)

Claudie1
Člen | 21
+
0
-

no, nepomoho by to id předat signálu jako parametr? volání signálu s více paramtery je například tady:

https://forum.nette.org/…ce-parametry

mixi.cz
Člen | 5
+
0
-

Claudie1 napsal(a):

no, nepomoho by to id předat signálu jako parametr? volání signálu s více paramtery je například tady:

https://forum.nette.org/…ce-parametry

No, to uz ted delam, jenom mam problem vytvorit v handleru toho signalu funkcni formular :o) – pokud ho budu vytvaret tovarnickou jako komponentu, tak mu neumim ten parametr ze signalu predat, pokud ho nevytvorim jako komponentu, tak mi z nej nefunguje callback.

Co jsem zatim vycetl, asi by slo vytvorit tovarnickou obecny formular a konkretni hodnoty vyplnit az v metode render… Akorat pokud vim, timto zpusobem nemuze na strance fungovat vice formularu soucasne, protoze formulare musi byt odlisene pomoci $name. Jenomze to je parametr volany v konstruktoru, kdy jednak jeste neznam ID a druhak by se konstruoval pouze jednou i v pripade vice formularu na strance.

Radeji tedy opustim svuj puvodni dotaz a misto toho shrnu zadani reseneho problemu – generovani N nezavislych formularu do stranky z presenteru, tak aby fungovala JS validace, mely spolecny callback a sel pouzit ajax. Jak to udelat „nette compliant way“?

Diky za postrceni spravnym smerem.

wodCZ
Člen | 49
+
0
-

Já používám use Nette\Application\UI\Form as AppForm, $form = new AppForm; a $form->onSuccess[] = callback($this, 'nejakyFormSubmitted'), vše funguje jak má. U Nette\Forms\Form se mi nikdy nepodařilo rozběhat callback, u AppForm vždy ;)