Egoblog.cz - Petr Kobelka

Nette Form - nefunguje onClick událost

Dnes jsem se setkal se zajímavou chybou. Ve skutečnosti byla moje a Nette funguje dobře, ale když se o ni podělím, jiný ji už neudělá.


Tipy na výlet | Komentáře (1) | Shlédnuto 2559 × | Vloženo: 22. září 2015

V nette můžete mít na formuláři více různých tlačítek typu submit. Na každé takové tlačítko pak můžete navázat volání jiné události metodou onClick, což s sebou nese spoustu krásných výhod nejen pro Nette weby, ale i pro jejich programátory.

Teoretický příklad - Nette formulář s více tlačítky

$form = new Form($this, 'cast1Form');
$form->addHidden('id', $id);
$form->addText('name', 'Jmeno');
$form->addText('prijmeni', 'Prijmeni')->setRequired();
$form->addSubmit('submit', 'Uložit');
$form->addSubmit('overitVAres', 'Overit v ARES')
     ->onClick[] = [$this, 'overitVAres'];

Ještě šablona v Latte. Také jen pro ukázku

{form form}
{input id}
{input name}
{input submit}
{input overitVAres}
{/form}

Šablona je pouze ilustrační a proto nemá kolem sebe další formátovací značky, které by jste jistě čekali

V ukázkovém formuláři je tlačítko pro odeslání formuláře standardní cestou submit a druhé, které zavolá metodu overitVAres.

Hlavním úkolem je odeslat informace do metody overitVAres. V tomto ilustračním příkladu ale nebude toto tlačítko fungovat. Kdo již ví, proč?

Řešení nefunkčního onClick v Nette formuláři

Stačí se podívat do dokumentace: "Handlery událostí onSuccess a onClick se volají pouze v případě, že je odeslání validní. Uvnitř obslužných metod tedy nemusíme validitu ověřovat. Formulář má ještě událost onSubmit, která se volá vždy nezávisle na validitě." (citace dokumentace 22.9.2015, nette.org).

Z toho je jasné, že problém je v definici formuláře, kdy definujete pole prijmeni, ale již nedáte uživateli možnost jej vyplnit. OnClick se volá POUZE v případě validního formuláře.

Řešením tedy je přidat pole prijmeni do šablony formuláře, nebo jeho definici odstranit z definice formuláře.

I vzhledem k tomu, že je to v dokumentaci popsáno, více se o tom nerozepisuji. Jen na tuto vlastnost upozorňuji, aby jste si dali pozor :-)

 

Petr Kobelka | Egoblog.cz | Tvorba www stránek - www.petrkobelka.cz

Petr Kobelka
Autor je zkušeným web developerem a programátorem s více než 10 letými zkušenostmi. Pracuje jako programátor pro známou Olomouckou společnost zabývající se tvorbou internetových a intranetových řešení. Spolu se zaměstnáním pracuje na volné noze a zabývá se tvorbou internetových stránek. Ve volném čase rád fotí, jezdí na kole, plave a cestuje.

Komentáře

E-mail je potřeba pouze pro vygenerování Gravataru!

1
Petr | vloženo 14. listopadu 2015
Neni treba nic z formulare odstranovat. Staci u tlacitka nastavit ->setValidationScope(FALSE), validace se preskoci a onClick se provede. Jen pozor na to, ze HTML5 validaci timto vypnout nelze, musi se vypnout rucne v definici formulare pomoci $form->getElementPrototype()->novalidate = 'novalidate';

Blog píše Petr Kobelka

Petr Kobelka - egoblog.cz

Žádám všechny, kteří mají zájem vkládat komentáře, aby se řídili pravidly NETikety. Komentáře, porušující tato pravidla můžou být bez varování smazány.