Generování dynamického formuláře pomocí foreach
- plech
- Člen | 7
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
- ViPEr*CZ*
- Člen | 817
$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
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
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.
- dada-amater
- Bronze Partner | 52
Mas tam tohle vid?
<?php
use Nette\Application\UI\Form;
//cili tam neni toto:
//use Nette\Forms\Form;
?>
- macejko1
- Člen | 18
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
Zkousel si zjistit, zda se ti ty dynamicke inputy opravdu vytvori i pri odeslani formulare?
- Petr Hudík
- Člen | 49
@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.