[Solved] Po odeslani formulare chyba DB dotazu uvnitr odesilaneho formulare

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

Ahoj,

mám problém s odesláním formuláře, který generuju z DB (takový seznam radio buttonů). Formulář se vytvoří, ale po při pokusu o odeslání mi Nette hlásí chybu Call to a member function related() on a non-object na řádku:

foreach ($this->testy->get($this->test_id)->related('otazky', 'testy_id') as $otazka) {

Proč se Nette snaží vytvářet/zpracovávat formulář znova, když ho již vyplněný odesílám? Je chyba v tom, kde načítám pro radio buttony z DB, která formulář zobrazuje? Kam tu část kdyžtak přesunout nebo je chyba úplně někde jinde?

PHP 5.3.9
Apache/2.2.21 (Win32) PHP/5.3.9
Nette Framework 2.0.3 (revision eb558ae released on 2012-04-04)

use Nette\Application\UI\Form;

class FrontendPresenter extends BasePresenter {

	private $testy;
	private $test_id;

	protected function startup() {
		parent::startup();
		$this->testy = $this->context->createTesty();
		$this->test_id = (int) $this->getParameter('test_id');
	}

	protected function createComponentExamForm() {
		$form = new Form();
		foreach ($this->testy->get($this->test_id)->related('otazky', 'testy_id') as $otazka) {
			foreach ($otazka->related('moznosti', 'otazky_id') as $moznost) {
				$moznosti[$moznost->id] = $moznost->text;
			}
			$form->addRadioList('otazka' . $otazka->id, $otazka->text, $moznosti)
				->addRule(Form::FILLED, 'Je nutné vybrat odpověď na otázku.');
			unset($moznosti);
		}
		$form->addSubmit('save', 'Odeslat')
			->onClick[] = callback($this, 'examFormSubmitted');
		$form->addSubmit('cancel', 'Zrušit')
			->setValidationScope(FALSE)
			->onInvalidClick[] = callback($this, 'examFormCancelled');;
		return $form;
	}

	public function examFormSubmitted(Nette\Forms\Controls\SubmitButton $button) {

		...

		$this->flashMessage('Test odeslán.', 'success');
		$this->redirect('default');
	}
}

Díky za radu.

Editoval radmax (6. 5. 2012 17:49)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

To bude tím, že parametr test_id to odeslání nepřežije. Zkus ho dát jako public. Respektive doplň si metodu actionDefault($test_id). Snad pomůže, ale neručím za to.

jtousek
Člen | 951
+
0
-

Nette už z principu musí formulář po odeslání znovu vytvořit, aby mohlo provést validaci.

radmax
Člen | 9
+
0
-

Přesně tak, nepřežije to. Mě spíš zajímá, proč ten parametr musím řešit, když se přesměruju tam, kde už formulář nemám. Jde o nějaké z mé strany nepochopení toho, jak formuláře fungují.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Nette formuláře téměř vždy přesměrují na tu samou stránku, respektive na this. Všimni si, že nikde nenastavuješ <form action=..., protože ten si zajišťuje Nette automaticky. Nevím, co myslíš tím, že přesměruješ tam, kde už formulář nemáš: pokud máš na mysli $this->redirect('default'), tak to je ve zpracování formuláře, logicky tedy musel být před voláním tohoto kódu sestaven.

  1. první GET požadavek: sestavení formuláře a vykreslení
  2. první POST požadavek: sestavení formuláře a zpracování ⇒ redirect
  3. druhý GET požadavek: jiná stránka
radmax
Člen | 9
+
0
-

Aha, díky za vysvětlení. Takže kam je tem parametr nejlepší schovat, aby byl k dispozici i při zpracování formuláře?
Poznámkou o přesměrování mimo jsem měl na mysli, že v default tento formulář nepoužívám.

Editoval radmax (6. 5. 2012 17:29)

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Jak jsem psal, určitě ho mít v definici odpovídající action/render metody, mít ho public… to by mělo stačit, pokud vím. Ty ho totiž schováváš právě nyní, spíš ho potřebuješ veřejně deklarovat (a tím Nette sdělit) jako parametr, který očekáváš a chceš. Teď ho vlastně tajně lovíš pomocí getParameter() a Nette odnikud nepozná, že je to něco, co očekáváš. Proto ho nezahrne do požadavku, na který se formulář odešle, a $test_id je v něm prázdný.

Editoval vojtech.dobes (6. 5. 2012 17:51)

radmax
Člen | 9
+
0
-

Tak už to funguje, dodělal jsem si potřebnou action s parametrem $test_id a nastavil si ho jako public.

Díky za tvůj čas.

Editoval radmax (6. 5. 2012 17:50)