Získání proměnné z layoutu
- warp
- Člen | 26
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
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
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
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)