Rozlisenie typu inputu pri manualnom vykresleni formu

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

Caute,

neviem nejak rychlo prist nato ako rozlisim pri manualnom vykreslovani formulara cez (

foreach $form->getComponents()

ci sa jedna napr. o hidden input, csrf, button atd.. Neporadi mi niekto?

marioff
Člen | 69
+
0
-

je to mozne, prosim, ci mam pisal vlastny Renderer (ale tato moznost mi absolutne nevyhovuje) ? … prosim o akukolvek radu :(

Jan Endel
Člen | 1016
+
+2
-

jednoduše v if na instanceof tedy:

{if $control instanceof \Nette\Forms\Controls\TextInput}
{* input je textové pole *}
h4kuna
Backer | 740
+
+1
-

Když potřebuješ iterovat nad skupinou prvků, tak by mohlo stačit dát je do vlastního kontejneru a pak iterovat nad tímto kontejnerem. Tím právě odstíníš hidden inputy, csrf, submity aj.

{foreach $form['myContainer']->getComponents() as $input}
	{formContainer $input}
	    {input foo}
	{/formContainer}
{/foreach}
marioff
Člen | 69
+
0
-

h4kuna to vyzera dost dobre riesenie… ak by som vsak v buducnosti potreboval realne pouzivat tie kontajneri tak mozem do toho kontajnera ‚myContainer‘ normalne zanorit dalsie kontajneri? lebo teraz to mam tak ze mam Abstractnu tovarnicku na formulare , ktora riesi v podstate vsetko co treba (normalizovanie dat , upload atd) a potom samotna tovarnicka ktora ju zdedi ma len metodu obsahujucu jednotlive inputy, nic viac… aby som v buducnosti nieco nelutoval ak su tam nejake obmedzenia

marioff
Člen | 69
+
0
-

Resp. mal by som otazku ako docielit vlastne renderovanie formulara ak mi nestaci sposob ktorym ho mozem renderovat upravou Nette\Forms\Rendering\DefaultFormRenderer

najidealnejsie by bolo nejak takto.. mam sablonu kde iterujem nad prvkami a do tej sablony by som vlozil komponentu form, cim sa mi vykresli presne ako chcem…

da sa to nejak? skusal som vlastnu komponentu rozsirenim UI\Control ale tam zase nedostanem ten form do sablony :(

h4kuna
Backer | 740
+
0
-

Ano další zanoření kontejnerů je možné. Píšeš že dědíš továrničky a jak rozšiřuješ formulář? Doporučuji kouknout na kompozice. Manuální vykreslování je naprosto v pohodě ukázka je v předchozím postu. Automatické rendrování nerozlišuje kontejnery, ty si je sám můžeš oddělit pomocí addGroup(‚Nějaký název‘).

Vlastní šablona a vykreslení půjde určitě přes UI\Control, to tam máš jenom něco špatně.

marioff
Člen | 69
+
0
-

abstraktna trieda obsahuje celu zakladnu pracu s formami.. spracovanie, sanitovanie atd.. a rozsirim ho dedicnostou..

ako prakticky dostanem do metody render(Form $form) komponenty ktora dedi od UI\Control… najlepsie v sablone…

napr. {control NAZOV, $form} – ale ako ziskat ten $form aby som ho dostal na spracovanie tou komponentov?

h4kuna
Backer | 740
+
0
-

Pokud máš formulář tvořený továrničkou, tak si ve své třídě která dědí od UI\Control vyžádej továrničku přes kontruktor. V šabloně presenteru je pozdě a tohle opravdu nefunguje.

Editoval h4kuna (23. 2. 2015 10:08)

h4kuna
Backer | 740
+
0
-

Tvůj formulář se tvoří někde v presenteru v metodě createComponent? Nebo je v samostatné třídě?

marioff
Člen | 69
+
0
-

vytvori sa v presenteri v metode createComponent*

h4kuna
Backer | 740
+
0
-

Takže záleží na charakteru použití formuláře, ale určitě nebude správně mít přípravu formuláře v createComponent v presenteru nýbrž v nějakém Factory objektu. Tím pak můžeš dosáhnout lepšího rozšíření formuláře a tím pak máš volnější ruce poslat si Factory do UI\Control a dát mu vlastní šablonu. Teď nevím zda je někde nějaký článek, takže ukázku ti nepošlu.

Osnova

  • Založ si jednoduchou třídu FormFactory
  • Založ si UI\Control (MyControl) a v constructoru předej FormFactory a vytvoř si požadovanou šablonu
  • MyControl injektni do Presenteru a tuto instanci vrať v createComponent*

Pokud to nepůjde napiš mi na mail v profilu a vyřešíme přes skype.

Editoval h4kuna (23. 2. 2015 11:32)

marioff
Člen | 69
+
0
-

oki vecer ked pridem z prace vyskusam :) zatial velmi pekne dakujem

marioff
Člen | 69
+
0
-

tak som sa s tym pohral ale nevyhovuje mi to.. je to viac pisania ako mam teraz a celkovo sa mi to zda nejake zlozitejsie..

jedine, pre mna idealne riesenie, na ktore som „prisiel“ , je vykreslit formular v sablone takto:

{includeblock '../components/sablona_formulara.latte', form => nazov_formulara}

a samotna sablona_formulara.latte:

{form $form}

	{foreach $form->getComponents() as $input}
// iterovanie nad prvkami
......

nemal by som tym nic pokazit do buducnosti? Budu tam fungovat napr. snippety?

este asi treba pripomenut ze pouzivam FormMacros od Filipa Prochazku