Jak na formulářovou tabulku

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

Dobrý den,
řeším problém jak nejlépe pomocí AppForm udělat formulářovou tabulku, tedy takový formulář, kde jeden řádek bude představovat jeden container a může jich být n.

Ve starším příspěvku jsem narazil na nsáledující řešení:


<?php
$translateForm = new AppForm($this,'trans');
$translateForm->addGroup();
foreach ($table as $index => $item){
        $container = $translateForm->addContainer($index);
        $container->addHidden('id')->setValue($item->id);
        $container->addText('translation', $item->name,100)->setValue($item->translation);
        $container->addSubmit('delete', 'Smazat');
        $i++;
}
$translateForm->addSubmit('save', 'Uložit')
              ->onClick[] = array($this,'onSave');
$this->template->form = $translateForm;
?>

V šabloně:

{foreach $form->getComponents() as $c)
        {if $c instanceOf FormContainer}
                {foreach $c->components as $c2}
                        {$c2->render()}
                {/foreach}
        {else}
                {$c->render()}
        {/if}
{/foreach}

Myslím, že to se blíží tomu jak to chci řešit, ale jsou tu 2 problémy.

  1. tento příklad končí chybou ve vykreslení šablony ( if vykreslí bez přední závorky jako {if $c instanceOf FormContainer):)
  2. $c2->render() mi vrátí MemberAccessException, že HiddenField nezná metodu render()

Jak máte podobný úkol řešený vy, případně jak to nejlépe vyřešit?

Předem díky za každou radu.

MartinJanda
Člen | 60
+
0
-

Ok, odpovím si sám.

Místo $c2->render() se musí použít $c2->control.

LuKo
Člen | 116
+
0
-

V šabloně ti v řádku: `{foreach $form->getComponents() as $c) ` chybí ukončovací závorka.

MartinJanda
Člen | 60
+
0
-

Díky. Toho jsem si nevšiml.

MartinJanda
Člen | 60
+
0
-

Je nějaký speciální způsob jak procházet poslaná data z formuláře, kde se využívají FormContainery?
`$this->form->getValues() ` mi vrací prázdné pole.

Další možný problém může být v tom, že se formulář generuje dynamicky v části if(!$this->form->isSubmitted()) { v prepare fázi. Nezpůsobuje to problém při zpracování poslaných informací?

Celé je to pro mě těžce pochopitelné a s tím jak se to pořád vyvíjí, narážím často na fóru na informace, které jsou už zastaralé a neplatné :-(

Opět díky za každou radu.

MartinJanda
Člen | 60
+
0
-

No je to prasácký, ale načtu si to přímo z $_POST. Jiné řešení mě nenapadá.

kravčo
Člen | 721
+
0
-

Keď formulár obsahuje kontajnery s inputmi, $form->getValues() by rozhodne nemal vrátiť prázdne pole. Na jednoduchom príklade mi to vrátilo peknú štruktúru:

array(1) {
  "container1" => array(3) {
    "text1" => string(0) ""
    "text2" => string(0) ""
    "text3" => string(0) ""
  }
}

Problém bude inde. Kde voláš $this->form->getValues(), kde napĺňaš $this->form ?

MartinJanda
Člen | 60
+
0
-

Ano, takovou strukturu bych očekával a taková data jsou poslána v $_POST.

Přišel jsem na to, že jádro celého problému je, že formulář je generován dynamicky a to můžu jen při vykreslení. Při zpracování je jen vytvořen AppForm, ale už nejsou vytvořeny jednotlivé prvky. Bez toho však nelze použít $this->form->getValues(). Asi to podle vytvořené struktury ještě kontroluje atd.

Asi jediné řešení je načíst si data v prepare přímo z $_POST a jen kontrolovat odeslání.

kravčo
Člen | 721
+
0
-

MartinJanda napsal(a):

Asi jediné řešení je načíst si data v prepare přímo z $_POST a jen kontrolovat odeslání.

Dovolím si nesúhlasiť.

Isteže, formulár sa vytvára i pri spracovaní – tak sa napr. môže na strane serveru overiť, či je valídny. Je až taký problém vytvoriť ten dynamicky generovaný formulár aj po odoslaní? Práve ťahaním priamo z postu totiž validáciu na strane servera obchádzaš.

MartinJanda
Člen | 60
+
0
-

Vím jak to myslíte a pro prostředí na webu a velký počet uživatelů máte jistě pravdu. Díky za vaši myšlenku.