Nevygeneruje se action – formulář se neodešle

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

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
+
0
-

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;
?>
22
Člen | 1478
+
0
-

a jaké tlačítko používáš?? co je s Nette tlačítkama špatně?

frosty22
Člen | 373
+
0
-

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
+
0
-

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)

22
Člen | 1478
+
0
-

..oddělej ten název

$form = new Form("addTextForm");
//
$form = new Form();
Darkry
Člen | 101
+
0
-

22: tak jsem to měl na začátku. Pro jistotu jsem to ještě vyzkoušel, ale změna žádná…

22
Člen | 1478
+
0
-

u máš tam správný namespace?

use Nette\Application\UI\Form;
frosty22
Člen | 373
+
0
-

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.

frosty22
Člen | 373
+
0
-

:) 22 koukám se docela scházíme :) Sotva něco odešlu, napíšeš v podstatě to samé :)

22
Člen | 1478
+
0
-

akorát v kratší verzi teda :-) ok, už to s ním dořeš, mě dneska nebaví ani psát.

Darkry
Člen | 101
+
0
-

Vyřešeno. Používal jsem

use Nette\Forms\Form;
teď už se to generuje v pořádku.

Díky moc