Redirect a následná vyjímka 404 po úpravě řádku v db

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

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
+
+1
-

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?

Usoplesk
Člen | 13
+
0
-

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.

Michal Hlávka
Člen | 190
+
+1
-

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
+
0
-

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)