Generování dynamického formuláře pomocí foreach

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

Ahoj, už několik hodin se trápím s následujícím problémem:

Při odeslání formuláře laděnka zahlásí Undefined property: Nette\ArrayHash::$8, kde 8 je name prvního inputu v průchodu foreach cyklem. Pokud cyklus vypíši ručně, chyba se nevyskytuje. Předpokládám tedy, že bude problém ve foreach cyklu. Ale netuším kde. Napadá vás prosím něco?
Mockrát děkuji.

Presenter:

<?php
protected function createComponentInventuraForm($name) {
      $zbozi = $this->skladovaZasobaRepository->findByStanek();

      $form = new Form($this, $name);
      foreach ($zbozi as $zbozi1) {
        $form->addText($zbozi1->id_zbozi, $zbozi1->zbozi->nazev_zbozi);
      }
      $form->addSubmit('create', 'Uložit');
      $form->onSuccess[] = $this->inventuraFormSubmitted;
      return $form;
  }

  public function inventuraFormSubmitted(Form $form) {

        $id_smena = $this->inventuraRepository->createInventura($form->values->id_smena, $this->getUser()->id);
        $last_id_smena = $id_smena->id_smena;
        $zbozi = $this->skladovaZasobaRepository->findByStanek($form->values->id_stanek);

        foreach ($zbozi as $zbozi1) {
          $id_zbozi = $zbozi1->id_zbozi;
          $mnozstvi = $form->values->$id_zbozi;
          if ($mnozstvi > 0) {
            $this->chybejiciZboziRepository->createChybejiciZbozi($last_id_smena, $id_zbozi, $mnozstvi);
          }
        }
      $this->redirect('this');
  }
?>

Template:

<?php
{form inventuraForm}
        <div class="inventura-form">
            {control $form errors}
            <table>
              <thead>
              <tr>
                  <th>Zboží</th>
                  <th>Množství</th>
                  <th>Chybí</th>
              </tr>
              </thead>
              <tbody>
                {foreach $zbozi as $zbozi1}
                    <tr>
                      <td>{label $zbozi1->id_zbozi /}</td>
                      <td>{$zbozi1->mnozstvi} {$zbozi1->zbozi->id_jednotka}</td>
                      <td>{input $zbozi1->id_zbozi}</td>
                    </tr>
                {/foreach}
                <tr>
                  <td>{input create}</td>
                </tr>
              </tbody>
            </table>
        </div>
        {/form}
?>

PHP 5.3.3
Nette Framework 2.0.10 (revision c0332ac released on 2013–03–08)
Laděnka

Draffix
Člen | 146
+
0
-

Neměli by se ty hodnoty z formuláře dostávat takto?

$values = $form->getValues();     // Nette\ArrayHash
$values = $form->getValues(TRUE); // array
ViPEr*CZ*
Člen | 817
+
0
-

$form->values můžeš taky, protože Form dědí od Nette\Object
Zkusil bych spíš jestli se Vám to vůbec odešle, tj. podívat se do POST a pak dump oněch values.

public function inventuraFormSubmitted(Form $form) {
Nette\Diagnostics\Debugger::dump($form->values);
...
foreach(...
plech
Člen | 7
+
0
-

Formulář se v pořádku odešle i s proměnnými. Při vyskočení chyby se podívám do POST a tam vidím všechny proměnné i s hodnotami. Ještě jednou podotknu, že pokud foreach vypíši ručně s úplně stejnými name a id v selectu, tak vše proběhne v pořádku. Čím to může být?
Paradox je, že stejnou konstrukci již používám v jiném presenteru (samozřejmě mírně upravenou s jinými daty) a tam vše funguje, jak má.
Díky za odpovědi.

Editoval plech (26. 4. 2013 10:45)

plech
Člen | 7
+
0
-

Problém jsem obešel takto:

<?php
$mnozstvi = $_POST[$id_zbozi];
?>

jelikož v POST se hodnoty přenáší, avšak v proměnné $form->values (zkoušel jsem i $values = $form->getValues(TRUE)) jsou pouze hodnoty prvků formuláře, které nejsou vytvořeny pomocí fce foreach.
Dokážete to někdo vysvětlit?
Díky.

Draffix
Člen | 146
+
0
-

Pokud jste dumpnul odeslané hodnoty a získal jste požadované parametry, pak je vše správně ne? Jinak $_POST[$id_zbozi] je také možné použít, ale dal bych si velký pozor na ošetření.

plech
Člen | 7
+
0
-

V POST je vše správně, ale pole $form->getValues() (nebo i $form->getValues(TRUE)) tyto hodnoty neobsahuje. Jsou zde pouze hodnoty prvků formuláře, které nejsou z foreach cyklu. To mi nejde do hlavy…

dada-amater
Bronze Partner | 52
+
0
-

Mas tam tohle vid?

<?php
use Nette\Application\UI\Form;
//cili tam neni toto:
//use Nette\Forms\Form;
?>
plech
Člen | 7
+
0
-

Ano. Jaký je mezi nimi rozdíl?

mkoubik
Člen | 728
+
0
-

Nette\Application\UI\Form používá signály z nette a je určený pro použití v presenteru, Nette\Forms\Form můžeš používat i samostatně.

macejko1
Člen | 18
+
0
-

Mam rovnaky problem, foreach-om si vytvaram checkboxy a nasledne ich vypisujem v sablone. No pri spracuvavani vysledku mi $form->getValues() nevracia potrebne hodnoty, ale zato getPost() vracia uplne vsetko. Je to nejaky bug alebo robim nieco spatne?

public function deleteFilesFormSuccess(Form $form)
    {
	dump($form->getValues());
	dump($this->getHttpRequest()->getPost());
	die();
    }

a dostavam nadledovne

Nette\ArrayHash(1) {
   all => TRUE
}

array(6) {
   all => "on" (2)
   32_ => "on" (2)
   31_ => "on" (2)
   28_ => "on" (2)
   27_ => "on" (2)
   delete => "Zmazať súbory" (15)
}

Prave som skusal metodu GET a vysledok s $form->getValues() je stejny, pricom URL vyzera nasledovne:

http://localhost:8888/uzivatelske-prostredie/sprava-suborov?all=on&32_=on&31_=on&28_=on&27_=on&delete=Zmaza%C5%A5+s%C3%BAbory&do=deleteFilesForm-submit

Editoval macejko1 (8. 5. 2013 20:46)

dada-amater
Bronze Partner | 52
+
0
-

Zkousel si zjistit, zda se ti ty dynamicke inputy opravdu vytvori i pri odeslani formulare?

Petr Hudík
Člen | 49
+
0
-

@macejko1: ve svém příspěvku bohužel nezmiňuješ co jsi všechno zkoušel a jak vypadá definice formuláře. Osobně bych začal tímto, tento problém může popsané chování vysvětlit.

dada-amater napsal(a):

Mas tam tohle vid?

<?php
use Nette\Application\UI\Form;
//cili tam neni toto:
//use Nette\Forms\Form;
?>

Pokud to nezabere, pošli sem prosím definici formuláře.