Formulář v obsahu stránky
- Honza Kuchař
- Člen | 1662
Ahoj,
řeším už chíli problém jak vytvořit formulář až v šabloně (view).
Mám prostě článek a do něho chci umístit formulář (ale protože je
použit pouze v tomto článku, říkal jsem si, že je nesmysl aby se
generoval už v presenteru – ten je pro všechny články společný). Tzn.
do view jsem si z presenteru předal proměnou $presenter
, pak
jsem si vytvořil ve view komponentu new dotaznikForm($presenter)
,
která vytvoří formulář (AppForm). Formulář se mi vyrendruje, funguje akce
onSubmit[]
, ale když vypnu JS, tak se mi nevypisují chyby a
formulář se vymaže. :( Nevíte čím by to mohlo být? Prostě, když odešlu
formulář s nevalidními daty (a je vypnutý JS), formulář se vymaže a
nezobrazí žádnou chybu, pokud ale odešlu správná data, formulář se taky
vymaže, ale v $form->getValues()
jsou data a spustí se akce
onSubmit[]
… → formulář přijímá signály.
Netušíte někdo, jak je to možné?
P.S.: Článek se rendruje do proměné už ve fázi
actionDefault()
, protože ve fázi renderDefault()
se
předává jeho výsledek (string), do další šablony. → zde se pokud vím
zpracovávají komponenty – nevidím důvod proč by to nemělo fungovat.
P.P.S.: Má být v té šabloně použit AppForm
s tou
předanou proměnou $presenter, nebo má být rači použit klasický
Form
?
Tak mi připadá, že to dělám nějak strašně složitě. Jak byste řešili zobrazení článku s formulářem vy?
//EDIT:
Tak zdá, že jsem ještě pořád příliš skaženej procedurálním
programováním v PHP → možná jsem nepochopil princip nette.
Tak mi to porosím když tak zkuste vysvětlit, popřípadě odkázat do patřičných míst. ;) Díky
Editoval honzakuchar (18. 4. 2009 22:50)
- Honza Kuchař
- Člen | 1662
Takže už jsem přišel na to proč se mi zezobrazovaly ty chybový hlášky. Nette je totiž zpracovává až, před rederováním. Takže to bychom měli. Ale ještě je stále jedna věc. Komponentu/form nemůžu definovat až při jedrování – jasný logický, ale jak na to, když tedy protřebuji udělat ten form ve view – je jenom pro tuhle jednu stránku – článek? Prostě mi připadá takový divný, definovat ten formulář pro celej presenter se všemi články. Co vy na to?
- pmg
- Člen | 372
Možná by šlo utilizovat továrnu
na komponenty. Při odeslání formuláře si Nette metodu
getComponent
zavolá samo, takže bude formulář vždy dostupný
včas. Verstanden?
- Honza Kuchař
- Člen | 1662
Tak to jsem zase já.
Udělal jsem si továrničku:
protected function createComponent($name)
{
if(class_exists($name,TRUE))
{
$component = new $name($this);
$this->addComponent($component, $name);
return;
}else
{
parent::createComponent($name);
return;
}
}
Potom v šabloně volám:
$dotaznik = $presenter->getComponent("dotaznikForm");
→ to vytvoří Control dotaznikForm
class dotaznikForm extends Control {
private $presenter;
private $form;
function __construct(Presenter $presenter) {
$this->presenter = &$presenter;
$this->form = new AppForm($presenter,"DotaznikAppForm");
/*definice tlačítek pravidal atd.*/
}
/*další fce*/
}
Formulář se normálně v pořádku vyrendruje, ale po jeho odeslání nette zahlásí:
BadSignalException #403
The signal receiver component 'DotaznikAppForm' is not found.
Tzn. to co se definuje v Control už nette nezajímá?? :(
Ale podle Nette\Application\Control
by to mělo fungovat. Ne? Nebo jsem to nepochopil? Nebo musím ten formulář
definovat přímo už v createComponent($name)
(popřípadě
proč?)?
- Honza Kuchař
- Člen | 1662
honzakuchar napsal(a):
→ to vytvoří Control dotaznikFormclass dotaznikForm extends Control { private $presenter; private $form; function __construct(Presenter $presenter) { $this->presenter = &$presenter; $this->form = new AppForm($presenter,"DotaznikAppForm"); /*definice tlačítek pravidal atd.*/ } /*další fce*/ }
Formulář se normálně v pořádku vyrendruje, ale po jeho odeslání nette zahlásí:
BadSignalException #403 The signal receiver component 'DotaznikAppForm' is not found.
Takže už jsem doma :) AppForm(rodič,název). Tzn. nemusí tam být ten presenter. A v tom byla chyba. (nepřiřadilo se to asi správně do hiearchie objektů) → upravil jsem ten řádek na:
$this->form = new AppForm($this,"DotaznikAppForm");
už je vše v pořádku
- Honza Kuchař
- Člen | 1662
Nevíte někdo jak je možný, že vždycky přijdu na to proč mi to nefunguje hned po tom co to napíšu na fórum? Ale před tím u toho sedím hodinu, dvě a nic. :(
- kravčo
- Člen | 721
Chyba je v tom, že máš zvláštny strom komponentov.
Vytváraš komponent „dotaznikForm“, ktorý patrí pod prezenter a v ňom vytváraš AppForm, ktorý patrí taktiež pod prezenter. V momente, keď sa má spracovať signál ani jeden z komponentov neexistuje. Volá sa teda $presenter->getComponent($name), aby sa získal príjemca signálu. To vyvolá metódu createComponent($name) s $name = „DotaznikAppForm“, keďže on je príjemca signálu. Továrnička zahrká, no samozrejme nič nespraví, keďže vie len to, ako vytvoriť „dotaznikForm“…
Zrejme by si mal ako rodiča AppFormu uvádzať komponent „dotaznikForm“. Tiež, rovnako ako v prezenteri, môžeš aj v komponente využiť továrničku na vytvorenie AppFormu.
- romansklenar
- Člen | 655
honzakuchar napsal(a):
Nevíte někdo jak je možný, že vždycky přijdu na to proč mi to nefunguje hned po tom co to napíšu na fórum? Ale před tím u toho sedím hodinu, dvě a nic. :(
Já to mám taky tak ;) když se člověk hodně snaží něco rozlousknout tak většinou nepochodí dokud nad tím usilovně přemýšlí, proto se vyplatí dát si pauzu na chvíli a ono se občas rozsvítí dřív než stihnu dojít k ledničce ;)
- David Grudl
- Nette Core | 8228
To je osvědčený postup, když ti něco nejde vyřešit, zkus ten problém říct někomu jinému (a může to být klidně antiIT přítelkyně nebo pes) ;)