Ztráta parametru po odeslání formuláře
- ondrakrajcik
- Člen | 45
Dobrý den,
nenašel jsem nikde vyřešen následující problém.
mám templatu formular.latte, na ni odeslu parametr pres url
…neco/www/homepage/formular?parametr=1
poté kliknu na tlačitko ve formuláři a odešlu formulář. Po odeslání přicházím o parametr a url vypadá takto:
www/homepage/uprav-web-zaznam?do=formular-submit
Proč se ztrácí můj parametr? Jak se dá udržet?
Našel jsem něco s nastavením v adresaři Router, sobuor RouterFactory:
Zkusil jsem tam přidat řádek
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:formular');
Ale bezvýsledně
- Tomáš Kolinger
- Člen | 136
Tak to funguje. Pokud si předáváš parametr v URL, tj. pomocí GET a při generování formuláře ho nevložíš do „cílové“ URL. Tak se ztratí.
Pokud chceš docílit předávání parametru mezi HTTP požadavky, tak musíš v presenteru označit atribut (který reprezentuje parametr) anotací @persistent.
Tj. něco jako
/**
* @persistent
* @var int
*/
public $id;
Pokud ti jde čistě jen o formulář a jinde parametr předávat nechceš,
tak si vygeneruj požadovanou URL přes
$presenter->link('this', array('id' => $presenter->getParameter('id'), 'do' => 'formular-submit'))
a nastav jako $form->setAction().
Editoval Tomáš Kolinger (22. 2. 2014 10:40)
- ondrakrajcik
- Člen | 45
Jde mě čistě jen o formulář, takže perzistentní proměnné nechci.
Zkusil jsem dát do továrničky co jsi poradil.
Pak se už nevolá metoda formularSubmitted(UI\Form $form), ale volá se handler
handleFormularSubmitted()
čímž se připravím o data z formuláře, protože tato metoda
nepříjímá parametr UI\Form $form, když ji přepíšu na
handleFormularSubmitted(UI\Form $form), tak vyskočí error.
Můžete mně někdo poradit ještě s touto maličkostí?
- Tomáš Kolinger
- Člen | 136
Handle? A má určitě formulář nastaveno
$form->setMethod('post')
?
Jak vypadá vygenerovaný formulář, tedy aspoň <form> značka.
- ondrakrajcik
- Člen | 45
$form->setMethod(‚post‘) nastaveno mám, ale i když to nastaveno není tak jsem si všiml, že se defaultně nastaví post.
<form action="neco/www/homepage/formular?wID=1&do=formularSubmitted" method="post" id="frm-formular">
Vypsaný error je
Argument 1 passed to App\HomepagePresenter::handleFormularSubmitted() must be an instance of Nette\Application\UI\Form, null given
s tím, že handle vypadá takto:
public function handleFormularSubmitted(UI\Form $form)
Editoval ondrakrajcik (22. 2. 2014 11:34)
- Tomáš Kolinger
- Člen | 136
To určitě ne. Handle tady nemá vůbec co dělat, nesmí tu být a to o co se pokoušíš je nesmysl. Musíš donutit formulář aby zpracoval požadavek. Tam se děje mnoho operací (ošetření dat, validace atp.) – handle jen veme parametr z GET a tím končí.
Zakomentuj „$form->setAction()“, nech si vygenerovat formulář a
okopíruj hodnotu ?do parametru, protože ho máš špatně. Připadá mě jako
kdyby si tam okopíroval jméno metody… Což nefunguje, jelikož v do
parametru má být identifikátor formuláře (což je většinou
nazev_formulare-submit
) a ne jedné z mnoha metod, které sis dal
onSuccess
Editoval Tomáš Kolinger (22. 2. 2014 11:46)
- ondrakrajcik
- Člen | 45
Nechápu. Jsem v nette úplný nováček.
Přikládám přímo svůj kód. Nevím teda jeslti mám ten handle používat
nebo ne. můžete mě nějak pomoct jak zachovat ten parametr?
protected function createComponentUpdateWebForm()
{
$wID = 1;
$db_values = $this->database->table("web")->get($wID);
$form = new UI\Form;
$form->setMethod('post');
$form->addText("wID","ID")->setAttribute("class","textField")->setValue($wID)->setRequired();
$form->addText("url","URL")->setAttribute("class","textField")->addRule($form::URL, "Zadejte adresu ve správném formátu.")->setValue($db_values->url)->setRequired();
$form->addCheckbox("mysql","MySQL")->setAttribute("class","checkBox")->setValue($db_values->mysql);
$form->addCheckbox("ftp","FTP")->setAttribute("class","checkBox")->setValue($db_values->ftp);
$form->addCheckbox("emaily","Emaily")->setAttribute("class","checkBox")->setValue($db_values->emaily);
$form->addText("cena","Cena")->setType('number')->setAttribute("class","textField")->addRule($form::INTEGER, "Cena musí být číslo.")->setValue($db_values->cena)->setRequired();
$form->addText("platnostOd","Platnost od")->setType("date")->setAttribute("class","textField")->setValue($db_values->platnostOd)->setRequired();
$form->addText("platnostDo","Platnost do")->setType("text")->setAttribute("class","textField")->setValue($db_values->platnostDo)->setRequired();
$form->addSubmit("submit","Upravit")->setAttribute("class","submitButton");
$this->presenter->link('this', array('wID' => $this->presenter->getParameter('wID'), 'do' => 'updateWebFormSubmitted'));
$form->onSuccess[] = array($this,"updateWebFormSubmitted");
return $form;
}
public function UpdateWebFormSubmitted(UI\Form $form)
{
$values = $form->getValues();
}
- Jan Mikeš
- Člen | 771
Tento radek tam mas uplne zbytecne
$this->presenter->link('this', array('wID' => $this->presenter->getParameter('wID'), 'do' => 'updateWebFormSubmitted'));
Metoda $presenter->link ti vraci tvar odkazu, sama o sobe ale nic neprovadi, takze tam pouze zbytecne provadis zjiseni linku pro tebou zadane parametry ale dale s nim nepracujes.
Chybi ti tam ten $form->setAction()
, tim obal ten
$presenter->link
Dale mas typo v nazvu metody, UpdateWebFormSubmitted mas velke ‚U‘, ale chces volat updateWebFormSubmitted s malym ‚u‘
- ondrakrajcik
- Člen | 45
Jenže když tam nastavím ten setAction, tak se volá handler metoda, což nechci. Ono by mě to nevadilo, že se volá, kdyby uměla příjmout jako parametr ten formulář, který odesílám.
protected function createComponentUpdateWebForm()
{
$wID = 1;
$db_values = $this->database->table("web")->get($wID);
$form = new UI\Form;
$form->setMethod('post');
$form->addText("wID","ID")->setAttribute("class","textField form-control")->setValue($wID)->setRequired();
$form->addText("url","URL")->setAttribute("class","textField form-control")->addRule($form::URL, "Zadejte adresu ve správném formátu.")->setValue($db_values->url)->setRequired();
$form->addCheckbox("mysql","MySQL")->setAttribute("class","checkBox")->setValue($db_values->mysql);
$form->addCheckbox("ftp","FTP")->setAttribute("class","checkBox")->setValue($db_values->ftp);
$form->addCheckbox("emaily","Emaily")->setAttribute("class","checkBox")->setValue($db_values->emaily);
$form->addText("cena","Cena")->setType('number')->setAttribute("class","textField form-control")->addRule($form::INTEGER, "Cena musí být číslo.")->setValue($db_values->cena)->setRequired();
$form->addText("platnostOd","Platnost od")->setType("date")->setAttribute("class","textField form-control")->setValue($db_values->platnostOd)->setRequired();
$form->addText("platnostDo","Platnost do")->setType("text")->setAttribute("class","textField form-control")->setValue($db_values->platnostDo)->setRequired();
$form->addSubmit("submit","Upravit")->setAttribute("class","submitButton btn btn-default");
$form->setAction($this->presenter->link('this', array('wID' => $this->presenter->getParameter('wID'), 'do' => 'updateWebFormSubmitted')));
$form->onSuccess[] = array($this,"updateWebFormSubmitted");
return $form;
}
/* debuger vyhazoval chybu, že nemůže najít handler, tak jsem ho přidal a fungovalo to, ale pokud dám do závorek "UI\Form $form", aby příjmal ten formulář, tak to vyhodí opět chybu, takže vůbec netuším jak ho zpracovat
*/
public function handleUpdateWebFormSubmitted(UI\Form $form)
{
$values = $form->getValues();
}
// rad bych aby se zavolala tato metoda
public function updateWebFormSubmitted(UI\Form $form)
{
$values = $form->getValues();
}
Už mě tady někdo psal, že handle tam nemá vůbec co dělat, ale když ho smažu tak vyskočí error, že handle neexistuje. Po vytvoření handlu se volá handle, což nechci, protože neumí příjmout jako parametr ten formulář
Editoval ondrakrajcik (22. 2. 2014 17:48)
- Tomáš Kolinger
- Člen | 136
Měl by sis čísti co píši :D. Handle metoda nemá s formulářem vůbec nic společného. A nikdy v životě ti nepřijde do parametru instance Form!
V tvém kódu máš špatný ?do= parametr. Obsahem není jméno metody callbacku! Má tam být identifikátor formuláře!
Přepiš řádek se $from->setAction na následující a mohlo by to fungovat:
$form->setAction($this->presenter->link('this', array('wID' => $this->presenter->getParameter('wID'), 'do' => 'updateWebForm-submit')));
Třetí alternativou je předat do routy parametr wID a on se vloží do action sám.
Editoval Tomáš Kolinger (22. 2. 2014 18:28)