setDefaults z DB – u vykreslovani funguje, pri zpetnem ukladani ne

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

Zdravim, mam form ve kterem nastavim vychozi hodnoty:

$form->setDefaults(array(
                    'id' => $this->template->post['id'],
                    'title' => $this->template->post['title'],
                    'body' => $this->template->post['body']
                ));

stranka se vykresli a vychozi hodnoty v polozkach formu jsou v poradku, po zmacknuti submit tlacitka mi to ale vyhodi chybu „The variable ‚post‘ does not exist in template“

cast callbacku:

$values = $form->getValues();
                        $id = $values['id'];
                        $data = array(
                            'title' => $values['title'],
                            'body' => $values['body'],
                        );

co delam spatne?

Editoval shargath (2. 8. 2011 14:52)

Filip Procházka
Moderator | 4668
+
0
-

Když se vykresluje formulář, pokud ho nevoláš v action nebo v render, tak se volá až v šabloně. To znamená jako poslední.

Když takový formulář odešleš, jeho zpracování probíhá pomocí signálu. Signály se zpracovávají mezi action a render. Pokud naplňuješ šablonu až v render. Logicky v šabloně ještě neexistuje proměnná post.

Nejlepší bude. Pokud si ty data, co máš v post v šabloně uložíš do presenteru.

private $post = array();

public function actionDefault($id)
{
	$this->post = $this->nejakyModel->find($id);

	// pokud nevykresluješ formulář vždy, tento řádek můžeš mít v továrničce.
	$this['myForm']->setDefaults($this->post);
}

public function renderDefault()
{
	$this->template->post = $this->post;
}

protected function createComponentMyForm()
{
	$form = new Form();
	// ...

	return $form;
}
shargath
Člen | 8
+
0
-

HosipLan: dik, uz mi to funguje, zivotni cyklus presenteru jsem nejak opomenul

jeste bych mel dotaz ohledne $this->nejakyModel->find($id); ja jsem zatim pouzival
jen \NejakyModel::find($id); pristup pres $this mi nefunguje, delam totiz modularni aplikaci… chapu to spravne ze v teto situaci se dela modelLoader?

Jan Endel
Člen | 1016
+
0
-

Bud pres model loader nebo si muzes model pridat v configu a pak ho pres $this->context->fooModel->find($id) normalne volat

shargath
Člen | 8
+
0
-

a v cem je to lepsi? efektivita?

Editoval shargath (2. 8. 2011 17:41)

Filip Procházka
Moderator | 4668
+
0
-

Je to v podstatě jedno. Když je registruješ po jednom do configu, je to lepší pro pozdější úpravy. Pokud máš model loader, je to snadnější na používání.