Neprechadzaju niektore hodnoty z odoslaneho formulara

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

Zdravim, zacinam s nette a mam dost zaujimavy problem s formularom. V presenteri mam nieco taketo:

<?php
	...
	$container = $form->addContainer('fields');
	$fields = $this->getProductFieldInputs($_GET['catId']);
	foreach($fields AS $key => $field){
	  $label .= $field[3] != '' ? $field[0].' ('.$field[3].')' : $field[0];
	  $container->addText('product_field_'.$key, $label);
	}
    ...
?>

V latte potom:

...
<div n:foreach="$form['fields']->controls as $field" class="row">{label $field /}{input $field}</div>
...

inputy sa vytvoria vporiadku, atribut name je OK aj label je OK. avsak po odoslani formulara a naslednom vydumpovani hodnot formulara tam tieto hodnoty nevidim. pritom ostatne odoslane hodnoty formulara tam su a su vporiadku. problem robia len tieto vytvarane vo foreach. robim nieco nespravne?

CZechBoY
Člen | 3608
+
0
-

Volá se ten foreach hned nebo až někdy později (až po dumpování hodnot formuláře)?

rewerz
Člen | 7
+
0
-

Foreach sa vola hned, tak isto ako ostatne prvky formulara. Ked pozriem zdrojak vygenerovaneho HTML tak je vsetko vporiadku. Ked spravim dump tak je tam len nieco taketo
fields => Nette\Utils\ArrayHash #f532

CZechBoY
Člen | 3608
+
0
-

A co bys očekával? ArrayHash můžeš přetypovat na obyčejné pole nebo si rovnou vyžádat pole.

$values = $form->getValues(true);
rewerz
Člen | 7
+
0
-

to je vpoho. ide skor o to, ze to pole je prazdne.

CZechBoY
Člen | 3608
+
0
-

Asi by to chtělo víc kodu.
Zkopíroval jsem ten tvůj kod do čistýho nette projektu a vše je ok.

class HomepagePresenter extends Presenter
{
    protected function createComponentForm()
    {
        $form = new Form;

        $container = $form->addContainer('fields');
        for($i = 0; $i < 5; $i++) {
            $container->addText('product_field_' . $i, $i);
        }

        $form->addSubmit('send');

        $form->onSubmit[] = function(Form $form) {
            \Tracy\Debugger::barDump($form->getValues(true));
        };

        return $form;
    }
}
{block content}

{form form}
    <div n:foreach="$form['fields']->controls as $field" class="row">{label $field /}{input $field}</div>

    {input send}
{/form}

{/block}
array (1)
	fields => array (5)
		product_field_0 => "1"
		product_field_1 => "2"
		product_field_2 => "3"
		product_field_3 => "4"
		product_field_4 => "5

Editoval CZechBoY (22. 9. 2016 20:58)

rewerz
Člen | 7
+
0
-

skusil som odtial vyhodit tu premennu $_GET['catId'] a dat tam natvrdo ciselnu hodnotu a funguje to. vypada to tak ako keby sa aj po odoslani formulara kontrolovala ta hodnota $_GET['catId'] a v tom momente je prazdna

Šaman
Člen | 2666
+
+3
-

A máš ten parametr catId i v adrese po odeslání formuláře? (Zjistíš tak, že z neprovedeš redirect.) Jestli ne, tak to je tím. Nette si kontroluje data z formuláře a validuje je proti samotnému formuláři, takže i po odeslání musí mít catId, aby si dalo dohromady původní podobu formuláře. (Je to ochrana proti podstrčení nevyžádaných hodnot.)

P.S. A nepoužívej přímo pole GET, ale $this->getParameter('catId').

Editoval Šaman (23. 9. 2016 0:57)

rewerz
Člen | 7
+
0
-

Tak to je velmi cenna informacia. Diky. Potom uz je len otazka aky by bol najlepsi sposob ako ten parameter dostat dalej aby bol dostupny aj pri validacii?