Neprechadzaju niektore hodnoty z odoslaneho formulara

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 | 2668
+
+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?

RSS tématu Téma zavřeno