Stejně pojmenovaný parametr akce presenteru a persistentní – odlišné chování v Nette 2.0 oproti aktuálnímu
- Václav Mašín
- Člen | 28
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.
- Václav Mašín
- Člen | 28
nightfish napsal(a):
@VáclavMašín Zkus odebrat
$param
ze signaturyrenderDefault()
.
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 | 28
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 | 28
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 | 1260
Mělo by jít o tento commit https://github.com/…837e1a906de6
Zatím je dostupný jen v masteru
- Václav Mašín
- Člen | 28
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ší.