IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: dynamický formulář, znovupoužitelnost jednoho formuláře, Ajax

Aktivity
Avatar
Frederik Fako:8.3.2018 15:06

Dobrý den,
už jsem vážně v koncích a nevím si rady. Potřebuji mít v presenteru jeden formulář "m-krát". Tedy Mám Routy a každá routa si nese své informace jako je zda je aktivní a své dodavatele, kteří mají také hodnotu zda jsou nebo nejsou aktivní a nyní potřebuji měnit data ve formuláři a následně je upravovat v databázi na základě zvolené roury. Napadlo mě tohle:
Screenshot pro lepší pochopení: "Screenshot ":https://prnt.sc/io6lxa
( vlevo jsou roury, které se načtou z db a z nich si uživatel vybere routu, pro kterou se v pravo vygeneruje její formulář ( ajaxove ). Pro každou routu je ten form stejný a meni jen hodnoty zvolené routy )
Presenter

<?php

public function handleEdit($term)
{
$this->template->dodavatele = $this->dodavatel->byPath($term)->fetchAll();
$this->removeComponent($this['help']);
$this->actionEdit($term);
$this->createComponentHelp();
$this->redrawControl('dodavatele');
}

      public function createComponentHelp(){
        $term = $this->temp;
        if(!isset($term)){
          $term = "KH0201";
        }
        $pole = $this->database->table('cesty')->where('CestyNazev',$term)->fetchPairs('CestyID', 'CestyNazev');
        $aktivni = $this->database->query('SELECT CestyAktivni FROM Cesty WHERE CestyNazev = ?',$term)->fetch()->CestyAktivni;
        $dodavatele = $this->dodavatel->byPath($term)->fetchPairs('DodavateleID', 'DodavateleNazev');
        $aktivniDodavatele = $this->database->query('SELECT dodavatel FROM ces_dod WHERE aktivni = 1 AND cesta = 1')->fetchPairs();
        $form = new Form;
        $form->setMethod('POST');
        $form->addCheckbox('RouteActive', 'Aktivni:');
        $form->setDefaults(['RouteActive'=>$aktivni]);
        $form->addCheckboxList('dodavatele', NULL,$dodavatele);
        $form->setDefaults(array('dodavatele' => $aktivniDodavatele ));
        $form->addProtection(); // Ochrana proti Cross-Site Request Forgery
            $form->onSuccess[]=[$this,'UpdateFormSucceeded'];
            return $form;

      }

?>

Nevím jak předat proměnnou komponentě abych jí mohl znovu vytvořit s již aktualizovanými daty.
A poté ajaxove formulář odeslat a tím přepsat data v DB pro zvolenou routu.
Latte:

{snippet dodavatele}
     {ifset $dodavatele}
   {form help}

     <div>{$dodavatele[0]->CestyNazev}</div>
     <div>{input RouteActive}</div>
     <div>
        <h2>Dodavatele pro cestu</h2>
        <table rules="all">
           <tr>
              <td></td>
              <td>Název dodavatele</td>
              <td>Aktivní</td>
           </tr>
               {foreach $form[dodavatele]->items as $key => $label}
               <tr>
               <td><a onclick="return confirm('Opravdu chcete smazat dodavatele?')" n:href="delete! $key">Smazat</a></td>
               <td>{$label}</td>
               <td><input n:name="dodavatele:$key"></td>
               </tr>
             {/foreach}


        </table>
     </div>
   {/form}

     {/ifset}
     {/snippet}
 
Odpovědět
8.3.2018 15:06
Avatar
Odpovídá na Frederik Fako
Martin Konečný (pavelco1998):8.3.2018 15:12

Ahoj, patrně hledáš Nette\Applica­tion\UI\Multi­plier, viz:
https://doc.nette.org/…4/multiplier

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
8.3.2018 15:12
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Frederik Fako:9.3.2018 21:46

Nakonec jsem tedy použil Multiplier
Celý kod vypadá takto:

public function createComponentEditForm(){
      return new Multiplier(function ($itemId) {
      $aktivni = $this->cesty->PathActive($itemId)->fetch();
      $dodavatele = $this->dodavatel->byPathID($itemId)->fetchPairs('DodavateleID', 'DodavateleNazev');
      $aktivniDodavatele = $this->dodavatel->byPathIDActive($itemId)->fetchPairs();
      $form = new Form;
      $form->setMethod('POST');
      $form->getElementPrototype()->class = 'ajax';
      $form->addText('naves','Návěs pro cestu:')
           ->setDefaultValue($aktivni->CestyNaves)
           ->setHtmlAttribute('placeholder','Návěs');
      $form->addCheckbox('RouteActive', 'Aktvní cesta:');
      $form->setDefaults(['RouteActive'=>$aktivni->CestyAktivni]);
      $form->addCheckboxList('dodavatele', NULL,$dodavatele);
      $form->setDefaults(array('dodavatele' => $aktivniDodavatele ));
      $form->addHidden('CestaID', $itemId);
      $form->addHidden('newDod');
      $form->addSubmit('Zmenit','Uložit změny pro routu')
           ->setHtmlAttribute('class','ajax');
      $form->addProtection(); // Ochrana proti Cross-Site Request Forgery
          $form->onSuccess[]=[$this,'EditFormSucceeded'];
          return $form;
    });
  }

   public function editFormSucceeded($form,$values){
    $this->database->query('UPDATE Cesty SET CestyAktivni = ? WHERE CestyID = ?',$values->RouteActive,$values->CestaID);
   }

Děkuji za pomoc!
Každopádně nyní řeším problém s tím, že potřebuji ony vytvořené formuláře odesílat přes Ajax, ale bohužel se nedaří a stránka se stále refreshuje. Využívám nette.ajax.js A četl jsem že stačí formuláři nebo jeho submit inputu přidat class "ajax" a že by se to mělo samo o vše postarat a při odeslání zavolat ublic function editFormSucce­eded($form,$va­lues) avšak stránka se stále refreshuje :/

 
Nahoru Odpovědět
9.3.2018 21:46
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.