Pro každý výsledek z db jeden formulář – jak na to?
- Kaja
- Člen | 6
Potřebuji si vydolovat data z db, a pro každý záznam vytvořit jeden formulář. Nevím jak to vyřešit přes továrničku, nadefinoval jsem tedy formuláře v action
<?php
public function actionDefault()
{
$result = $this->reader->getStreams();
foreach ($result as $n => $row) {
$addItemForms[$n] = new AppForm;
$addItemForms[$n]->addText("text","Text");
$addItemForms[$n]->addSubmit('ok', 'Add Item');
$addItemForms[$n]->onSubmit[] = array($this, 'addItemSubmitted');
}
}
?>
kde $addItemForms je zamýšleno jako pole všech formulářů.
ve fázi render celé pole odešlu do template
<?php
public function renderDefault()
{
$this->template->streams = $this->reader->getStreams();
$this->template->addItemForms = $this->addItemForms;
}
?>
a ve formuláři se tyto formuláře pokouším zobrazit pomocí $iterator ve foreach
{foreach $streams as $stream}
<h3>Stream Name: {$stream->name}</h3>
<?php debug::dump($addItemForms[$iterator->getCounter()]); ?>
{$addItemForms[$iterator->getCounter()]}
{/foreach}
Nezobrazí se ani jeden formulář, hodnoty ze $streams jsou ok. V debug:dump se zobrazuje null. Ověřil jsem zdali se v presenteru hodnoty nastavují správně – nastavují.
Editoval Kaja (19. 1. 2010 12:55)
- PetrP
- Člen | 587
Přes továrničku bys to vyřešil jedině přepsáním createComponent(), tedy nějak takto:
//presenter
protected function createComponent($name)
{
if (preg_match('#^nazev_([0-9]+)$#',$name, $match))
{
$streamId = $match[1];
$form = new AppForm($this,$name);
return $form;
}
return parent::createComponent($name);
}
{foreach $presenter->reader->getStreams() as $stream}
<h3>Stream Name: {$stream->name}</h3>
{control "nazev_".$stream->id}
{/foreach}
Jinak co vydím tvuj kód tak mě napadá třeba že máš
$addItemForms
ale nikde nedefinuješ
$this->addItemForms
které pak předáváš šabloně (mimo
jiné ti tam chybí i $addItemForms = array()
)
Mimochodem existuje macro {dump )
.
A neurčoval bych název componenty podle counteru, ale třeba podle ID (jestli je) nebo name (jestli je unikátní)