Jak na formulářovou tabulku
- MartinJanda
- Člen | 60
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.
- tento příklad končí chybou ve vykreslení šablony ( if vykreslí bez
přední závorky jako
{if $c instanceOf FormContainer):
) - $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
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.
- kravčo
- Člen | 721
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
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
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
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.