Persistentní parametry – samonastavování hodnot

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

Zdravím, mám v presenteru formulářík s třemi selecty a odesílacím tlačítkem. V presenteru mám tři persistentní parametry (jmenují se stejně jako selecty) odpovídající údajům, podle kterých chci filtrovat vypisovaný obsah. Po odeslání formuláře přesměrovávám na signál filter!. A děje se taková WTF věc, nikde ty persistentní parametry nenastavuji a hodnota je jim automaticky nastavována podle hodnot v selectech. Akorát jako defalutní hodnotu selectu dávám hodnotu toho pers. parametru. Pro představu:

class MujPresenter extends BasePresenter
{
	/** @persistent string */
	public $param1 = 'hodnota11';

  	/** @persistent string */
  	public $param2 = 'hodnota21';

  	/** @persistent int */
  	public $param3 = 'hodnota31';

	public function createComponentMujForm()
	{
		$form = new AppForm;
		// atd...
		$form->addSelect('param1', array('hodnota11' => 'Hodnota11', 'hodnota12' => 'Hodnota12'))->setDefaultValue($this->param1);
		$form->addSelect('param2', array('hodnota21' => 'Hodnota21', 'hodnota22' => 'Hodnota22'))->setDefaultValue($this->param2);
		$form->addSelect('param3', array('hodnota31' => 'Hodnota31', 'hodnota32' => 'Hodnota32'))->setDefaultValue($this->param3);
		// atd...
		$this->onSubmit[] = array($this, 'mujFormSubmitted');
	}

	public function mujFormSubmitted(AppForm $form)
	{
		$this->redirect('filter!');
	}

	public function handleFilter()
	{
		// tady si jenom vypíšu hodnoty $this->param1, $this->param2 a $this->param3
	}
}

Když v selectech vyberu jiné hodnoty, než výchozí a formulář odešlu, nastaví se persistentním parametrům odeslané hodnoty. Samy. Selecty se však musí musí jmenovat stejně jako persistentní parametr, jinak jim zůstane výchozí hodnota. Když jsem dopsal dotaz, tak vlastně ani nevím, na co se chci ptát. Snad jen jestli to tak má být.

umrlec
Člen | 56
+
0
-

Aha, takže to bude nejspíš proto, že formulář odesílám metodou GET a pak se to nějak spáruje.

bojovyletoun
Člen | 667
+
0
-

GET metoda za to může zdánlivě. V presenteru totiž máš param1(nezáleží, zda je persistent). Když klikneš na odkaz ve tvaru {link ‚this‘, param1=>66}, tak se automaticky spáruje param1 z požadavku (Přesněji z PresenterRequest) s proměnnou param1 deklarovanou v Třídě XYPresenter.** To je rozhodně super vlastnost nette.**

No a to se stane při get metodě „samovolně“, při odeslání formu se vytvoří požadavek www.x.cz/Xy/default/?…. Takže ještě před zrpacováním formuláře jsou nastaveny $this->param, protože nette při spuštění presenteru vyhledá v něm deklarované properties a naplní je těmi z požadavku. Myslím, že při post se nestane tak.

Otázka je, zda je to feature nebo bug. Já jsem se s tím nesetkal, takže nemám názor, spíš se mi to líbí.

umrlec
Člen | 56
+
0
-

Díky za vysvětlení :)

Filip Procházka
Moderator | 4668
+
0
-

Je to rozhodně feature, nelze to odlišit, proto při odeslání formuláře, který má stejné prvky, jako má presenter persistentní parametry, tak mají stejné hodnoty (při get se to prostě dostane do request, nezávisle na tom, jestli je to z odkazu, nebo formuláře). Není to ani tak feature, jako spíše výchozí chování php.