Získání proměnné z layoutu

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

V layoutu vykresluji radky do tabulky pres foreach a na konec toho radku vkladam formular pres funkci z presenteru. Jde nastavit, aby se hodnota value ve vlozenem formulari dynamicky pridavala podle ID radku, ktere ziskavam z db?

Resp.: v kazdem radku je vykresleny tento formular:

protected function createComponentEditForm()
	{
		$form = new NAppForm();
		$form->addHidden('id', promenna_hodnota);
    		$form->addSubmit('edit', 'Upravit');

a me by se libilo, kdyby misto promenna_hodnota byla nejaka hodnota, kterou nadiktuje @layout.phtml.

Vyki
Člen | 388
+
0
-

Napadá mě taková ošklivá, ale jednoduchá konstrukce.

{foreach $radky as $hodnotaId} //nejaky tvuj foreach
	{? $presenter['editForm']->setDefaults(array('id' => $id))}
	{widget editForm}
{/foreach}

EDIT: Nebo si to můžeš připravit v presenteru což bude asi vhodnější

<?php
	protected function createComponentEditForm()
        {
                $form = new NAppForm();
                $form->addHidden('id', promenna_hodnota);
                $form->addSubmit('edit', 'Upravit');
		return $form;
	}

	public function renderDefault()
	{
		$frms = array();
		$rows = dibi::query('SELECT * FROM [tabulka]')->fetchAll();

		foreach($rows as $row){
	        	$this['editForm']->setDefaults(array('id' => $row->id));
			$frms[] = $this['editForm']->render();  //$this['editForm']->__toString();
		}

		$this->template->frms = $frms;
	}
?>

A v šabloně:

{foreach $frms as $frm}
	{$frm}
{/foreach}

Mělo by to fungovat ale netestoval jsem to.

Editoval Vyki (20. 11. 2010 11:41)

warp
Člen | 26
+
0
-

Kdyz to zkusim pres tu prvni variantu, kterou upravim obrazu svemu:

{? $presenter['editForm']->setDefaults(array($player->ID_hrace => $id))}
{widget editForm}

jak potom dostanu to $id v presenteru? Je potreba na to vytvaret specialni funkce setDefaults, ktera to bude v tom layoutu ukladat do promenne (asi by stacila promenna a ne array, jak si uvedl ty, protoze to ID bude v kazdem radku jen jedno), a nejakou getDefaults, ktera to potom dostane v tom presenteru nebo bych si to predstavoval moc ruzove? :)

Vyki
Člen | 388
+
0
-

Tento cyklus sám o sobě už představuje výpis tvých hodnot – těch řádek jak ty píšeš. Pokud to taháš z db např takto dibi::query('SELECT [ID_hrace], [name], [email] FROM [tabulka]')->fetchAll(); budeš mít v tom foreach cyklu v každé iteraci dostupné $row->ID_hrace, $row->name, $row->email. To $row->ID_hrace, to je id toho řádku, které chceš použít jako parametr do toho formuláře (předpokládám). Pro každý řádek bude to ID_hrace jiné, musí tedy hodnota toho hiddenfieldu formuláře nabývat na každém řádku jiné hodnoty.

Ten řádek $presenter['editForm']->setDefaults(array('ID_hrace' => $row->ID_hrace)) není nic magického. To $presenter['editForm'] ti vrátí tu továrničku s formulářem kterou vytváříš v presenteru pomocí createComponentEditForm. Je to ekvivalentní zápisu $presenter->getComponent('editForm'). Funkce setDefaults ti ve formuláři nastaví (výchozí) hodnoty. Když máš tedy v parametru array('ID_hrace' => $row->ID_hrace) nastaví to hodnotu toho hiddenfieldu ID_hrace na hodnotu požadovanou hodnotu v proměnné $row->ID_hrace. Ten {widget editForm} ti vypíše ten formulář, s tou danou hodnotu ID_hrace, kterou jsi nastavil v tom setDefaults.

Když tedy předáš templatu nějaký ten result z DB Vypíšeš si to jednoduše takto např. do tabulky.

<table>
{foreach $data as $row} //nejaky tvuj foreach
	<tr>
		<td>{$row->ID_hrace}</td>
		<td>{$row->name}</td>
		<td>{$row->email}</td>
        	{? $presenter['editForm']->setDefaults(array('ID_hrace' => $row->ID_hrace))}
		<td>{widget editForm}</td>
	</tr>
{/foreach}
</table>

Editoval Vyki (20. 11. 2010 15:48)

warp
Člen | 26
+
0
-

Ok, parada, diky moc za zevrubny vyklad! :)