Redirect a následná vyjímka 404 po úpravě řádku v db
- Usoplesk
- Člen | 13
Zdravím,
mám v presenteru formulářovou továrničku na editování testů:
protected function createComponentEditorForm()
{
$form = new Form;
$form->addHidden('id_testy');
$form->addText('nazev', 'Název testu')->setRequired();
$form->addText('predmet', 'Předmět')->setRequired();
$form->addText('trida', 'Třída')->setRequired();
$form->addSubmit('submit', 'Uložit test');
$form->onSuccess[] = [$this, 'editorFormSucceeded'];
return $form;
}
dále pak presenterovou funkci na předání dat modelu:
public function editorFormSucceeded($form, $values)
{
try {
$test = $this->testManager->saveTest($values);
$this->flashMessage('Test by úspěšně uložen.');
$this->redirect('test', $test['id_testy']);
} catch (UniqueConstraintViolationException $ex) {
$this->flashMessage('Test s tímto id již existuje.');
}
}
a modelová funkce na uložení testu vypadá takto:
public function saveTest($test)
{
if(!$test[self::COLUMN_ID])
{
$savedTest = $this->database->table(self::TABLE_NAME)->insert($test);
}
else
{
$savedTest = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_ID, $test[self::COLUMN_ID])->update($test);
}
return $savedTest;
}
A problém nastává u presenterové funkce, která se provede při redirectu:
public function renderTest($id)
{
if(!($test = $this->testManager->getTest($id))) throw new BadRequestException();
$this->template->test = $test;
$this->template->otazky = $this->testManager->getQuestions($id);
$this->template->odpovedi = $this->testManager->getAnswers($this->testManager->getQuestions($id));
}
ta totiž pokaždé při redirectu vyhodí BadRequestException vyjímku, jako
kdyby proměnná $id nic neobsahovala.
Tracy debugger zobrazuje, že dotaz vypadal takto:
SELECT 'id_testy', 'nazev', 'predmet', 'trida', 'autor' FROM 'testy' WHERE ('id_testy' IS NULL)
Takže z toho soudím, že proměnná $id_testy se musela zkrátka při běhu
programu někde vytratit. Ale kde?
- CZechBoY
- Člen | 3608
Metoda update totiž vrací počet aktualizovaných řádků, nikoliv
nějaký řádek z databáze.
https://api.nette.org/…ion.php.html#…
Nebo je problém už při vytváření nového testu?
- Michal Hlávka
- Člen | 190
Usoplesk napsal(a):
Díky za odpověď, to je možná příčina.
Ale při vytváření nového testu problém není. Po vložení řádku do databáze to bez problému redirectne na nově vytvořený test.
Protoze volas metodu insert, ta vraci uz radek. Update vraci cislo aktualizovanych zaznamu.
- Usoplesk
- Člen | 13
Díky, za odpovědi. Problém byl opravdu v tom, že metoda update vracela počet ovlivněných řádků. Nyní jsem poupravil trochu model a presenter jsem upravil pomocí podmínek:
public function editorFormSucceeded($form, $values)
{
try {
$test = $this->testManager->saveTest($values);
$this->flashMessage('Test by úspěšně uložen.');
if ($test['id_testy']) //Jestliže proměnná id_testy vytvořená z modelu existuje
{
$this->redirect('test', $test['id_testy']);
}
else //Jestli ne, tak použij proměnnou id_testy z formuláře
$this->redirect('test', $values['id_testy']);
} catch (UniqueConstraintViolationException $ex) {
$this->flashMessage('Test s tímto id již existuje.');
}
}
Editoval Usoplesk (27. 10. 2016 16:23)