Při ajaxu postová hodnota pole formuláře přebije getový parametr presenteru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Honza Marek
Člen | 1664
+
0
-
class TestPresenter extends Presenter {

	public $oldLayoutMode = FALSE;

	public function actionDefault($param) {
		Debug::fireLog("Presenter param:");
		Debug::fireLog($param);
	}

	protected function createComponentTestForm() {
		$form = new AppForm;

		$form->addText("param", "Param")->setDefaultValue(4);

		$form->addSubmit("s", "OK")->onClick[] = array($this, "submitTestForm");

		$form["s"]->getControlPrototype()->onclick = '$.post(this.form.action, {param: this.form.param.value});return false';

		return $form;
	}

	public function submitTestForm(SubmitButton $btn) {
		Debug::fireLog("Form param:");
		Debug::fireLog($btn->form->values["param"]);
	}
}

Šablona:

{extends none}
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js" type="text/javascript"></script>
</head>

<body>
	{control testForm}
</body>
</html>

Pokud mám presenter zavolaný s parametrem, který má stejné jméno jako pole právě postem odeslaného formuláře, tak se presenteru přepíše ten parametr na hodnotu toho pole.

Doporučuju pustit si ukázku na adrese třeba {plink Test: param => 3} a pak zkusit porovnat ajaxový a bezajaxový provoz.

Řešení mě napadají tři:

  1. dávat do formulářových polí názvy typu testForm-param
  2. u odkazovaného řádku v api prohodit sčítance (dát tedy get parametrům vyšší prioritu než těm post)
  3. nepřidávat postové parametry vůbec nikdy k normálním parametrům

Nejmenší problémy by dělala asi možnost číslo 2, možná tak byl ten řádek i původně myšlen.

Editoval Honza M. (9. 10. 2009 12:26)

Honza Kuchař
Člen | 1662
+
0
-

Já osobně jsem tedy pro řešení 1)

Honza Marek
Člen | 1664
+
0
-

Řešení 2 funguje dobře. U #1 si nejsem jistý, jestli to jen neposune problém o úroveň jinam a nezmenší počet kolizí.

Honza Kuchař
Člen | 1662
+
0
-

Máš pravdu, sice ta pravděpodobnost je potom malinká, ale je tam. Tzn. jsem taky pro 2). 3) mi přijde dost drastická.

Honza Marek
Člen | 1664
+
0
-

Ohledně bodu 3.

Dovolím si doplnit Davidův příspěvek, kterým argumentoval proti předávání postových hodnot do parametrů při neajaxovém provozu.

David Grudl

Co by to způsobilo? Jako nevýhoda je zásadní BC break, všechny aplikace by se museli zkontrolovat, jestli ve formuláři nepoužívají prvek se stejným názvem, jako má parametr metod render—, action— nebo persistentní parametr. A výhoda? V podstatě mě žádná nenapadá – jaké by to mělo výhody?

Dodám, že v ajaxu je to úplně to samé.