Formulář v obsahu stránky

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

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

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

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

No jasně! :) Díky moc

kravčo
Člen | 721
+
0
-

Továrnička je presne to, čo potrebuješ. S ňou sa formulár vytvorí len v prípade, že bude potrebný = v prípade toho jediného článku.

Honza Kuchař
Člen | 1662
+
0
-

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

honzakuchar napsal(a):
→ 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.

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

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

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

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 ;)

pmg
Člen | 372
+
0
-

Ale na druhou stranu není k zahození, když to takhle pěkně sepíšeš pro druhé. Buď pro ponaučení, nebo jen pro zábavu. :-)

Tentokrát mě ale slušně zamrazilo, když jsi psal, že to nefunguje. Kdybys to býval nerozchodil, musel bych si sypat popel na hlavu. 8^)

David Grudl
Nette Core | 8145
+
0
-

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) ;)