manuální vykreslení složitějšího formuláře – containers

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

Zdravím,

chtěl bych Vás poprosit o radu, jakým způsobem se dá manuálně vykresit v šablonách container vytvořený tímto způsobem. (Verze Nette 2.0, ale i ve verzi 0.9.)

...
$form->addContainer('items');
$items = $this->model->getAllItems();
foreach($items as $item) {
	$form->addText($item->id, $item->name, 10, 10);
}
...

Potřeboval bych se dostat v šabloně např přes nějaký foreach cyklus k jednotlivým textovým polím toho containeru. Něco jako:

<p n:foreach="$form['items'] as $item">{$item->label}: {$item->control}</p>

Editoval kravčo (6. 10. 2010 18:23)

pekelnik
Člen | 462
+
0
-

Iterace nad kontejnerem je ve frontě.

prozatím použij:

<p n:foreach="$form['items']->controls as $item">{$item->label}: {$item->control}</p>

David se ale netváří, že by to chtěl změnit, což je celkem škoda.

toka
Člen | 253
+
0
-

Nevím proč, ale mně na současné situaci vůbec nic nevadí :-D

ji_ri_k
Člen | 44
+
0
-

Děkuji za rychlou odpověď. Bohužel tento způsob jsem zkoušel, ale nefunguje.

Když si vydumpuji tuto proměnnou:

{$form['items']->controls}

tak v ní je pouze tato hodnota:

NInstanceFilterIterator(1) {
   "type" private => "IFormControl" (12)
}

Tzn. žádná iterace se nekoná.

Pro jistotu zde přidám více kódu (zjednodušeného), který mi nefunguje.

protected function createComponentItemForm($name) {
	$form = new NAppForm;
	$items = array('lorem', 'ipsum', 'dolor');
	$form->addContainer('items');
	foreach($items as $k => $val) {
		$form->addText($k, $val, 5);
	}
	return $form;
}

Pak zkouším manuální vykreslení, které ale nefunguje (nejsem schopen se dostat k tomu poli uvnitř containeru). (formulář je předán do šablony pomocí $this->template->itemForm = $this['itemForm'];

<p n:foreach="$itemForm['items']->controls as $item">{$item->label}: {$item->control}</p>

Vše výše uvedené testuji v Nette 2

Editoval kravčo (6. 10. 2010 18:24)

22
Člen | 1478
+
0
-

Dneska sem s tim taky hrál v Nette 1.0 $form[‚item‘]->controls nefunguje, zkus $form[‚item‘]->components

kravčo
Člen | 721
+
0
-

Možno tie textové políčka chceš umiestniť do toho kontajneru items:

protected function createComponentItemForm($name) {
        $form = new NAppForm;
        $items = array('lorem', 'ipsum', 'dolor');
        $container = $form->addContainer('items');
        foreach($items as $k => $val) {
                $container->addText($k, $val, 5);
		// alternatívne: $form['items']->addText($k, $val, 5);
        }
        return $form;
}
ji_ri_k
Člen | 44
+
0
-

Jéé děkuji ti kravčo… taková hloupost :-)
Trochu jsem očekával, že se to chová podobně jako u groups, kde prvky stačí definovat pod ->addGroup() a automaticky se do té skupiny přidají (dokud nepřidám další skupinu).

Protože pokud jsem formulář nechal vykreslit rovnou přes makro {control itemForm} a zkontroloval odeslané hodnoty, tak byly správně v asociativním poli $items.

Takže už je to vyřešené… moc děkuji za spolupráci, taková hloupost a takové energie :-)

//edit: a díky i 22 – to je pro Nette 2 :-)

Editoval ji_ri_k (6. 10. 2010 19:10)