nette addons replikátor formulářových prvků – validace

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

Ahoj, jsem v nette nový, už se nějkou dobu snažím rozchodit jeden upravený příklad z nette dopňků. Mám ale problém. Jedná se o dynamické formuláře. Chtěl bych si dynamický formulář naklikat dopředu, – takže mám setValidationScope na false, chtěl bych to dělat ajaxem. Toto mi jde. Následně bych chtěl naklikaný formulář odeslat, a tam nastává problém. V případě že provedu nějaká ajaxová volání nad dynamickým formulářem – přidám či odeberu prvek. Tak mi nefunguje ajaxové tlačítko zpracovat – proběhne nějaký požadavek, ale žádné výsledky. Nic se nestane. Když kliknu na tlačítko zpracovat bez ajaxu, tak první odeslání se také nic nestane – stránka se znovu načte jak jako byla, a druhý klik na tlačítko už mi funguje jak bych si představoval.

Omlouvám se jestli to složitě vysvětluji, kdyžtak doplním detaily, tady máte kousky kódu kde se děje to co popisuji.

use Nette\Forms\Container;
use Nette\Application\UI\Form;
use Nette\Forms\Controls\SubmitButton;
use Nette\Utils\Html;

/**
 * Homepage presenter.
 */
class WorkdayPresenter extends BasePresenter {

   public function actionDefault() {
      if ($values = $this->getSession('values')->users) {
         $this['workForm']->setDefaults($values);
      }
   }

   public function renderDefault() {
      $this->template->users = $this->getSession('values')->users;
   }

   protected function createComponentWorkForm($name) {
      $form = new Form;

      $presenter = $this;
      $invalidateCallback = function () use ($presenter) {
                 /** @var \Nette\Application\UI\Presenter $presenter */
                 $presenter->invalidateControl('usersForm');
              };
      // jméno, továrnička, výchozí počet
      $replicator = $form->addDynamic('users', function (Container $container) use ($invalidateCallback) {

                 $container->addText('od')
                         ->setType('time');
                 $container->addText('do')
                         ->setType('time');
                 $prompt = Html::el('option')
                         ->setText("Druh práce")
                         ->class('prompt');
                 $container->addSelect('prace', NULL, array('prace1', 'prace2', 'prace3'))
                         ->setPrompt($prompt);
                 $container->addText('hodin')
                         ->setAttribute('placeholder', '0.00')
                         ->addRule(Form::FLOAT, 'Hodiny musejí být číslo!')
                         ->setAttribute('size', '10');

                 $container->addSubmit('removeAjax', 'Smazat Ajaxem')
                         ->setAttribute('class', 'ajax')
                         ->addRemoveOnClick($invalidateCallback);
              }, 1);
      $replicator->addSubmit('addAjax', 'Přidat dalšího Ajaxem')
              ->setAttribute('class', 'ajax')
              ->setValidationScope(FALSE) //js validace
              ->addCreateOnClick(TRUE, $invalidateCallback); //php validace

      $form->addSubmit('send', 'Zpracovat')
              ->onClick[] = callback($this, 'WorkFormSubmitted');

      $form->addSubmit('sendAjax', 'Zpracovat Ajaxem')
                      ->setAttribute('class', 'ajax')
              ->onClick[] = callback($this, 'WorkFormSubmitted');

      $this[$name] = $form;
      $form->action .= '#snippet--workForm';
      return $form;
   }

   /**
    * @param SubmitButton $button
    */
   public function WorkFormSubmitted(SubmitButton $button) {
      // jenom naplnění šablony, bez přesměrování
      $this->getSession('values')->users = $button->form->values;
      $this->redirect('this');
   }

}

sablona presenteru

{block content}
<h1 n:block="title">Workday</h1>



 {snippet usersForm}

{form workForm}
<fieldset>
   <legend>Provedené práce</legend>

   <table >
      <thead>
         <tr>
            <th>od</th>
            <th>do</th>
            <th>prace</th>
            <th>hodin</th>
         </tr>
      </thead>
      <tbody>
         <tr n:foreach="$form['users']->containers as $user">
            <td>{$user['od']->control}</td>
            <td>{$user['do']->control}</td>
            <td>{$user['prace']->control}</td>
            <td>{$user['hodin']->control}</td>
            <td>{$user['removeAjax']->control}</td>
         </tr>
      </tbody>
      <tfoot>
         <tr>
            <td colspan="...">Celkem,-</td>
         </tr>
      </tfoot>

   </table>
    {input users-addAjax}
   {input send}
 {input sendAjax}

</fieldset>

 {/form}

v layout latte mam nacitani techto javascriptu

{block scripts}
     <script src="{$basePath}/js/jquery-1.7.2.min.js"></script>
     <script src="{$basePath}/js/netteForms.js"></script>
     <script src="{$basePath}/js/nette.ajax.js"></script>

     <script>
        $(window).load(function () { $.nette.init(); });
     </script>
{/block}

Jsem fakt zacatecnik, takze tam jsou urcite blbosti. Kdyby nekdo nerozumel otazce, tak upresnim.

Diky vsem zucastnenym.

EDIT: ještě mohu dodat, že když mažu nebo přidávám tak se mi v js konzoli ukazuje typ pozadavku jako application/json a kdyz chci zpracovat, tak text/html

Editoval Cup (16. 6. 2013 21:58)