Stejně pojmenovaný parametr akce presenteru a persistentní – odlišné chování v Nette 2.0 oproti aktuálnímu

Václav Mašín
Člen | 26
+
0
-

Zdravím,

v rámci předělávky jednoho projektu ze starého Nette na soudobé tady mám jeden tak trochu „zákys“.

Demonstrační kód ve 2.0:

class TestPresenter extends NPresenter
{
	/** @persistent */
	public $param;

	public function renderDefault($param)
	{
		print($this->link('this'));
	}

	public function createComponentTestForm()
	{
		$form = new NAppForm;
		$form->addSubmit('submit', 'TEST');
		$form->onSuccess[] = [$this, 'onTestFormSubmit'];
		return $form;
	}

	public function onTestFormSubmit()
	{
		$this->param = 2;
	}
}

a obdobný kód v aktuálním:

namespace App\FrontModule\Presenters;

use Nette\Application\UI\Presenter,
	Nette\Application\Attributes\Persistent;

class TestPresenter extends Presenter
{
	#[Persistent]
	public $param;

	public function renderDefault($param)
	{
		print($this->link('this'));
	}

	public function createComponentTestForm()
	{
		$form = new \Nette\Application\UI\Form;
		$form->addSubmit('submit', 'TEST');
		$form->onSuccess[] = [$this, 'onTestFormSubmit'];
		return $form;
	}

	public function onTestFormSubmit()
	{
		$this->param = 2;
	}
}

Přičemž v prvním případě je výstupem toho printu() v renderDefault() po submit formuláře „/test/?param=2“ a v tom druhém „/test/“. Takže jakoby se v novém Nette preferoval ten parametr metody oproti tomu parametru persistentnímu.

Což samozřejmě při klasickém „celostránkovém“ zpracování není problém – přesměrování s novou hodnotou parametru v onTestFormSubmit() vše podle očekávání řeší. Ten „zákys“ mi ale nastává při odeslání formuláře přes AJAX, protože tady pak nevím, jak té metodě renderDefault() vnutit tu novou hodnotu. Jediné co jsem objevil je $this->request->setParameters(), ale to beztak jaksi nezabírá.

Poradil by někdo, jak na to?

Díky.

nightfish
Člen | 472
+
0
-

@VáclavMašín Zkus odebrat $param ze signatury renderDefault().

David Grudl
Nette Core | 8116
+
0
-

Opraveno

Václav Mašín
Člen | 26
+
0
-

nightfish napsal(a):

@VáclavMašín Zkus odebrat $param ze signatury renderDefault().

Díky, tohle jsem vlastně tuším zkoušel a zdá se, že by i fungovalo, ale nakonec zavrhl, protože pak nelze na akci odkazovat s nepojmenovaným default parametrem. Tj. $this->link(‚Test:default‘, 1) vyhodí „Invalid link: Passed more parameters than method“. Což by pro mě znamenalo úpravy na vícero místech, takže jsem raději pátral dál po jiném řešení.

Václav Mašín
Člen | 26
+
0
-

David Grudl napsal(a):

Opraveno

Díky, počkám tedy na novou verzi (předpokládám balíku „Application“).

Václav Mašín
Člen | 26
+
0
-

David Grudl napsal(a):

Opraveno

Zdravím, mohl bych se prosím zeptat, jestli ten nedávný update nette/application má řešit tady tuto záležitost?

Díky.

Marek Bartoš
Nette Blogger | 1166
+
0
-

Mělo by jít o tento commit https://github.com/…837e1a906de6

Zatím je dostupný jen v masteru

Václav Mašín
Člen | 26
+
0
-

Marek Bartoš napsal(a):

Mělo by jít o tento commit https://github.com/…837e1a906de6

Zatím je dostupný jen v masteru

Aha, děkuji za bleskovou reakci a rozumím. Ta úprava problém zdá se skutečně řeší.