[Solved] Po odeslani formulare chyba DB dotazu uvnitr odesilaneho formulare
- radmax
- Člen | 9
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
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.
- Vojtěch Dobeš
- Gold Partner | 1316
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.
- první GET požadavek: sestavení formuláře a vykreslení
- první POST požadavek: sestavení formuláře a zpracování ⇒ redirect
- druhý GET požadavek: jiná stránka
- Vojtěch Dobeš
- Gold Partner | 1316
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)