Chyba v zivotnim cyklu presenteru?

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

Prosim o pomoc:

generuji formular s dynamickym poctem inputu dle db. Vse vali jak ma, jen kdyz padne chyba formulare a refreshne se, tak se me vyklesli jen jeden input a jeste k tomu bez labelu..

Co delam prosim spatne?

private $data;
private $formularPole;

public function renderFormular($id) {

	$this->data = $this->getModel('dataModel')->getData('akce')
			->where('id', $id)->fetch();

	$this->formularPole = $this->data->formular; //ziskam hodnoty z db
	$this->template->data = $this->data;
    }

    public function createComponentAkceForm($name) {

	$form = new Nette\Application\UI\Form($this, $name);
	$pole = explode(",", $this->formularPole); // vytvorim z hodnot pole

	for ($i = 0; $i <= count($pole) - 1; $i++) { //cyklus pro vytvareni inputu
	    $form->addText('data' . $i, $pole[$i] . ':')
		    ->setRequired('Zadejte ' . $pole[$i] . '!');
	}

	$form->addTextCaptcha();
	$form->addSubmit('send', 'Registrovat');
	$form->onSuccess[] = callback($this, 'akceFormSubmitted');
	return $form;
    }

Diky !

Editoval MW (11. 11. 2011 19:21)

Majkl578
Moderator | 1364
+
0
-

Chyba je v tvojí hlavě, ne životním cyklu presenteru, ten jsi zřejmě jen nepochopil. Odeslání formuláře = signál, tj. před render fází. Nemůžeš tedy očekávat, že $this->formularPole bude obsahovat hodnoty, které tam sypeš až v render fázi.
Mimochodem, tvé řešení je naprostá ohavnost, měl by ses za něj stydět. Zejména za ten cyklus továrně a české proměnné a české všechno.

MW
Člen | 626
+
0
-

Nenarazel jsem na chybu v cyklu, ale spis, kde tu chybu delam ja.
Prosil jsem o radu a ne o flamy na me… proc se prosim musis takhle povysovat? Kazdej nejak zacina a nez hanit cyklus a promene, proc me prosim treba nezkusis poradit, jak toto resit nejlepe?

z render jsem udelal action, a to jde a chova se to, jak potrebuji.(To byla bazne moje blba chyba a nepozornost). Otazka tedy je, proc je tedy cyklus v tovarne tak ohavny ? Jak to resit jinak?
Kdyz uz to bylo nakousnute.

Dekuji

Editoval MW (13. 11. 2011 12:48)

Jan Jakeš
Člen | 177
+
0
-

On to asi myslel takhle:

foreach ($data as $key => $value) {
	$form->addText("data$key", "$value:")
		->setRequired("Zadejte $value!");
}
Filip Procházka
Moderator | 4668
+
0
-

Ale kdepak… Řešením je rozdělit tvé renderFormular na akci, kde data získáš a render, kde data předáš šabloně.

private $data;
private $dataForm;

public function actionDefault($id)
{
	$this->data = $this->getModel('dataModel')->getData('akce')
		->where('id', $id)->fetch();
	$this->dataForm = $this->data->formular;
}

public function renderDefault() // když máš $id v action, tak tady už být nemusí
{
	$this->template->data = $this->data;
}

A pánové, naučte se prosím používat containery

protected function createComponentForm()
{
	$form = new Nette\Application\UI\Form;

	$data = $form->addContainer('data');
	foreach (explode(",", $this->dataForm) as $key => $value) {
		$data->addText($key, $value . ':')
			->setRequired('Zadejte ' . $value . '!');
	}

	$form->addTextCaptcha();

	$form->addSubmit('send', 'Registrovat');
	$form->onSuccess[] = callback($this, 'formSubmitted');

	return $form;
}

Editoval HosipLan (13. 11. 2011 15:04)

Jan Jakeš
Člen | 177
+
0
-

Já reagoval na:

Otazka tedy je, proc je tedy cyklus v tovarne tak ohavny ?

Tedy, že cyklus v továrně není ohavný, ale jeho cyklus opravdu poněkud ohavný je :)

Filip Procházka
Moderator | 4668
+
0
-

Na cyklu v továrně není nic špatného. Na foru taky ne. Jenom je tu mnohem lepší cesta: foreach + container

MW
Člen | 626
+
0
-

super, moc dekuji. Uz je me to jasnejsi… Diky !