Nevygeneruje se action – formulář se neodešle
- Darkry
- Člen | 101
Zdravím,
mám takový problém s formuláři. Udělal jsem si formulář
public function createComponentAddTextForm() {
$config = \Nette\Config\NeonAdapter::load(__DIR__."/../config.neon"); //TODO: cachování configu + zkusit zjistit, jestli není lepší řešení jak sem config dostat
$form = new Form("addTextForm");
$form->addText("name","Název:")
->addCondition(Form::FILLED, "Název textu musí být vyplněn!");
if($config["texts"]["autoUrl"] == FALSE) {
$form->addText("url","URL adresa:")
->addRule(Form::PATTERN, "URL adresa je vyplněna ve špatném tvaru (může obsahovat pouze čísla, písmena anglické abecedy a znak - a _)",'[0-9a-zA-Z-_]*');
}
if($config["texts"]["date"] == TRUE) {
$form->addDatePicker("date","Datum:")
->addCondition(Form::FILLED, "Datum musí být vyplněno!");
}
if($config["texts"]["shortVersion"]) {
$form->addTextArea("shortVer","Krátká verze:")
->getControlPrototype()->class = "ckeditor";
}
$form->addTextArea("text",($config["texts"]["shortVersion"] ? "Plná verze:" : "Text:"))
->getControlPrototype()->class("ckeditor")
->addCondition(Form::FILLED, ($config["texts"]["shortVersion"] ? "Plná verze textu musí být vyplněna!" : "Text musí být vyplněn!"));
$form->getElementPrototype()->class = "ajaxSubmit";
$form->onSuccess[] = callback($this, "addTextFormSubmit");
return $form;
}
V šabloně pak jednoduše:
<div id="dialog-form" title="Přidat text">
{control addTextForm}
</div>
Snažím se formulář odeslat AJAXově a to navíc v jQuery UI dialogu. Tj. pro odeslání používám v nastavení dialogu toto:
<script>
buttons: [
{
text: "Přidat text",
click: function() { $("form.ajaxSubmit").ajaxSubmit($("#dialog-form").dialog("close")); }
}
</script>
Bohužel po vygenerování formuláře vypadá moje HTML takto:
<form action="" method="post" id="frm-addTextForm" class="ajaxSubmit">
Přičemž se ani validace neprovede a po kliknutí na tlačítko se pouze
zavře dialog (a pošle se AJAX požadavek, který ale ani nezavolá metodu
addTextFormSubmit
). Nevím jestli je chyba v tom, že pro
odeslání nepoužívám přímo tlačítko vygenerované od nette, ale chtěl
bych to mít takto.
Nevíte, kde by mohla být chyba?
Díky moc
- frosty22
- Člen | 373
No bohužel ti přímo neporadím, jelikož asi používáš tedy plugin pro jQuery, která přidává metodu ajaxSumbmit (tento? http://be.twixt.us/…bmission.php, či http://jquery.malsup.com/form/).
Jinak tedy chybu bych hledal asi zde, respektive zda například nezahodí z volané URL, onen signál (resp. vše co je za ?), tam je důležitý ten ?do=neco, co určuje, že se má zavolat onen formulář, případně otestuj, zda ti proběhne ona metoda createComponentAddTextForm, při ajaxové požadavku, pokud proběhne, ale nezavolá se onSuccess, tak tedy formulář neobdržel validně data, čili onen plugin možná upravil odesílanou datovou strukuturu POSTu.
Případně se ještě podívej, zda onen formulář má správnou action (pokud jsi ho nezkoušel bez ajaxu), čili by měl mít něco jako „/presenter/action/?do=addTextForm-submit“, pokud tam není onen parametr „do“, tak onu továrničku (předpokládám, že jí máš v presenteru) udělej:
<?php
public function createComponentAddTextForm($name) {
$form = new Form($this, $name);
...
}
?>
Co se týče tohoto:
<?php
$config = \Nette\Config\NeonAdapter::load(__DIR__."/../config.neon");
?>
tak takhle opravdu ne :) Samozřejmě, že jsou přístupné parametry, akorát záleží na to v jaké části, máš onu továrničku, pokud je to presenter, tak jsou přístupné přes:
<?php
$config = $this->context->params;
?>
- frosty22
- Člen | 373
Až teď koukám na ten vygenerovaný form:
<form action="" method="post" id="frm-addTextForm" class="ajaxSubmit">
tohle určitě ne, máš asi určitě chybu ve vytváření instance toho formuláře, jak jsem psal zkus:
<?php
public function createComponentAddTextForm($name) {
$form = new Form($this, $name);
...
}
?>
Editoval frosty22 (8. 8. 2011 22:38)
- Darkry
- Člen | 101
frosty22:
Používám jenom pluginy z nette. Metodu ajaxSubmit přidává plugin pro
nette jQuery Ajax Forms se to jmenuje tušim.
Právě, že action je prázdná psal jsem to už nahoře.
Ten config neni nette config jak by se mohlo zdát, ale můj vlastní config, ne ten ve složce app :-).
22:
Používám tlačítka od jQuery UI Dialogu (kvůli designu) zadávaj se v js a
jsou generovaný do spodní lišty dialogu.
Edit:
frosty22:
Mám nejnovější nette a to co navrhuješ mi
hází: Object of class AdminModule\TextsPresenter could not be converted to string
Editoval Darkry (8. 8. 2011 22:41)
- frosty22
- Člen | 373
Též možnost, jak píše 22, můžeš připojovat formuláře k presenterům dvěma základními způsoby (třetí přes attach, či jak je ta metoda, ale to bych neřešil) a to:
<?php
public function createComponentAddTextForm($name) {
$form = new Form($this, $name);
...
}
?>
nebo
<?php
public function createComponentAddTextForm() {
$form = new Form();
...
return $form;
}
?>
Pouze tedy předpokládám, že voláš:
Nette\Application\UI\Form
který právě slouží k připojení k presenteru, alternativně možná vytváříš instanci přímo:
Nette\Forms\Form
,ale zde si nejsem přímo jist rozdílu, teoreticky by to také mohlo jít, podle zdrojového kódu v API.