Při ajaxu postová hodnota pole formuláře přebije getový parametr presenteru
- Honza Marek
- Člen | 1664
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:
- dávat do formulářových polí názvy typu testForm-param
- u odkazovaného řádku v api prohodit sčítance (dát tedy get parametrům vyšší prioritu než těm post)
- 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 Marek
- Člen | 1664
Ř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
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
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é.