Formulář – úprava více položek najednou

stickybit
Člen | 14
+
0
-

Ahoj,

používám už nějaký čas Nette jako začátečník a s klasickými formuláři nemám problém. Nyní však bojuji s tím, jak vyřešit úpravu více položek najednou – v mém případě mám pod recepturou (tab1) vypsán materiál (tab2). Dosud jsem to bez problému řešil tak, že každá položka (materiál) má svůj formulář a lze jí upravovat pouze jednotlivě. Potřebuji to ale udělat tak, aby se jednalo o jeden formulář, ve kterém budou všechny položky, ty libovolně upravím a můžu je pak všechny odeslat najednou ke zpracování. Četl jsem i o low level formulářích, ale stejně se mně to nepodařilo rozchodil. Mám to řešené takto:

Formulář vypadá takto:

protected function createComponentRecepturaMatForm()
{

      $form = new Form;

      $form->addText('nazevZbozi', 'Název:')
           ->setHtmlAttribute('placeholder', 'nazevZbozi')
           ->setRequired();

      $form->addInteger('mid');

      $form->addSubmit('send', 'Uložit');
      $form->onSuccess[] = [$this, 'recepturaMatFormSucceeded'];

      return $form;

}

Latte

<form n:name="recepturaMatForm">

{foreach $materialy as $material}

    <p><input name="mid[]" value="{$material->id}"><input name="nazevZbozi[]" value="{$material->nazevZbozi}"></p>

{/foreach}

<input value="Upravit" n:name="send">

</form>

Když dám na stránce pak upravit, tak se formulář tváří jako odeslaný, ale nedostane se ke zpracování do metody recepturaMatFormSucceeded, působí jako že se jen provede refresh stránky.

public function recepturaMatFormSucceeded($form, $values)
{
		  //je úplně jedno co zde je - request sem nedojde
      dump($values);
			......

ačkoliv v tracy je v http requestu pole v pořádku odesláno:

post private => array (4)
nazevZbozi => array (15)
0 => "Merol"
1 => "PU0"
2 => "Versal"
3 => "Versalová Z"
4 => "Butylacetát"
5 => "Isobutanol"
send => "Upravit"

Chtěl bych prosím poradit proč se POST nedostane do recepturaMatFormSucceeded a jak data získat k dalšímu zpracování (k update v databázi). Díky

Editoval stickybit (4. 3. 2018 9:44)

CZechBoY
Člen | 3608
+
0
-

vypis si errory

$form->getErrors();
stickybit
Člen | 14
+
0
-

Díky, dal jsem

$form->onError[] = function() use ($form) {
                   		dump($form->getErrors());
                   };

Protože $form->getErrors(); nic nevracelo. Chyba byla:

array (1)
0 => "This field is required." (23)

Tak jsem dal pryč required od nazevZbozi, chybu to už nevyhazuje, nicméně problém je stále stejný = POST se nedostane do recepturaMatFormSucceeded.

Podotýkám, že problém vznikl po změně „input name“ na pole, což potřebuji

<input name="mid"> na <input name="mid[]">
<input name="nazevZbozi"> na <input name="nazevZbozi[]">

Editoval stickybit (4. 3. 2018 11:25)

duke
Člen | 650
+
+1
-

Potřebuješ-li jako input pole (tj. např. mid[]), pak k tomuto v Nette nelze použít běžné input objekty (vytvářené např. metodou addText()), nýbrž to musíš pořešit na nižší úrovni. K datům se dostaneš přes:

$midValues = $form->getHttpData($form::DATA_LINE, 'mid[]');
$nazevZboziValues = $form->getHttpData($form::DATA_LINE, 'nazev_zbozi[]');