Vykreslení formuláře ručně

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

Zdravím,

mám docela složitý formulář napsaný jako komponentu v App/Forms

Formulář musím vykreslovat ručně, protože je netradičně uspořádaný, takže nemůžu použít makro {control}

ale říkám si, že by asi nebylo pěkné kdybych měl zaprasených 50 řádků v šabloně.

Chtěl bych si vykreslení formuláře udělat bokem a pak to jen jedním řádkem v šabloně zavolat.

Napadlo mně dát si do templates/components nějaký latte soubor, kde si formulář vykreslím a pak ve svojí šabloně zavolám jen {include}

Je to dobrá cesta nebo existuje nějaká lepší?

David Matějka
Moderator | 6445
+
0
-

Kdyz mas formular jako komponentu, tak at se o vykresleni postara komponenta a ne presenter.

ondrej256
Člen | 187
+
0
-

Spletl jsem se. Není to komponenta. Normálně je to třída, která dědí z UI/Form

David Matějka
Moderator | 6445
+
+1
-

a nejlepsim resenim je… obalit to komponentou :)

ondrej256
Člen | 187
+
0
-

No já mám u toho formuláře interface s metodou create, která vrací instanci formuláře a mám to zaregistrované jako službu. A teď nějak nevím jak to obalit komponentou aby v tom nebyl zmatek.
To mám udělat komponentu se skoro stejným názvem jako je název formuláře a dát ji do stejné složky? tzn. App/Forms ? a pak místo toho formuláře mám zaregistrovat tu komponentu jako službu?

To mě připadá zmatené. Přímo v komponentě vyrábět formulář nechci, protože bych ve složce Forms měl samé formuláře, jeden by chyběl a místo něho by byla komponenta, ale to by byla asi nejlepší varianta.

Nebo nějaká lepší cesta?

Zax
Člen | 370
+
0
-

Obecně formuláře by se neměly tvořit poděděním UI\Form. Lepší je vytvořit si komponentu a ten formulář vyrobit v ní. Továrnu na komponentu zaregistruješ jako službu, injectneš do presenteru a je to.

class MujBezvaForm extends UI\Control {

   function createComponentForm() {
      $form = new UI\Form;
      ...
   }

}

Editoval Zax (22. 9. 2014 21:10)

Šaman
Člen | 2666
+
0
-

Zax napsal(a):

Obecně formuláře by se neměly tvořit poděděním UI\Form. Lepší je vytvořit si komponentu a ten formulář vyrobit v ní.

S tím nesouhlasím, oba přístupy mají své místo na slunci. Vytvářet formulář jako komponnety je jednodušší na použití, ale mít továrnu přímo na Form se může hodit, pokud se od toho formuláře bude dál dědit, nebo jinak používat. Třeba BookForm (formulář) a s jeho pomocí NewBookFormControl a EditBookFormControl. Takže znovupoužitelné formuláře rozhodně ničím neobalovat, obalovat až finální jednoúčelový formulář.

Vojtěch Dobeš
Gold Partner | 1316
+
+1
-

Na to, co popisuješ, se zase lépe hodí továrnička na BookForm, kterou si jako závislost můžu předat jak do NewBookFormControl, tak do EditBookFormControl.

Šaman
Člen | 2666
+
0
-

Proti továrničkám jsem nic neřekl, taky bych to řešil tovární třídou na BookForm, nikoliv poděděným formulářem. Ale to obalování se někdy prostě nehodí, není pravda, že je dobré formuláře vytvářet vždy jen jako komponenty.

Zax
Člen | 370
+
0
-

@Šaman já třeba tento typ formulářů (přidávací a editační) řeším abstraktní komponentou, kde mám veškerý společný kód, a co se liší, to vyčlením do abstraktních metod, které si pak doplním v konkrétní komponentě (typicky se liší popisek pro potvrzovací tlačítko a flashMessage). Jinak továrna na form samozřejmě použít jde, proti tomu žádná, ale není to úplně odpověď na původní dotaz.

Když použije komponentu, docílí toho, že si může „vykreslení formuláře udělat bokem (v jiné šabloně) a pak to jen jedním řádkem v šabloně (presenteru) zavolat“. Jestli si ten formulář napíše přímo v komponentě nebo jestli si to vyrábění vyčlení do samostatné továrny, kterou si pak injectne a jen zavolá create(), to už je na něm, já jen předložil nejjednodušší řešení jeho problému.

A BTW vyrábění továrnou nemá nic společného s děděním UI\Form.

Editoval Zax (22. 9. 2014 22:12)

Šaman
Člen | 2666
+
0
-

Ok, nebudu to tu zbytečně zesložiťovat.

  • Na to, na co se ptal, se nejlépe hodí komponenta.
  • Vytváření formuláře je vhodnější dělat pomocí továrničky/tovární třídy, ne dědit Form.
  • Občas se hodí Form neobalovat komponentou, ale to není tento případ.