Pro každý výsledek z db jeden formulář – jak na to?

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

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
+
0
-

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í)