Grafické oddělení prvků ve formuláři

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

Ahoj,
mam komponentu na vykresleni formulare a vzdy se mi standartne vykresli:

<tr class=„required“>
<th><label class=„required“ for=„frmphotoForm-popis1“>Popis fotografie*:</label></th>

<td><input type=„text“ size=„30“ maxlength=„100“ class=„text“ name=„popis1“ id=„frmphotoForm-popis1“ value="" /></td>
</tr>

  • rad bych uploadoval vice fotek najednou a graficky kazdy formular oddelil, nejlepe necim jako je <tr><th colspan=„2“>Fotka cislo x</th></tr> – je nejaky zpusob jak to do te tovarnicky zapsat?

Dekuji, Ja

blacksun
Člen | 177
+
0
-

Co třeba generovat prvky formuláře v nějakém cyklu? K tomu si přes wrappers nastavit nějaké obalení párů prvků a je to. Viz dokumentace k formulářům.
Případně lze využít grupy https://forum.nette.org/…ni-formularu?…

Ja
Člen | 260
+
0
-

jjjj, v cyklu to samozrejme je:-)

jo, ty grupy v podstate plni ucel, kterej pozaduju, diky moc

…nicmene, co delat v pripade, ze bych treba to doopravdy chtel oddelit stylem, ktery jsem napsal vyse? treba bych do toho th chtel umistit nejaky oddelovaci obrazek…

Jeste bych mel jednu otazecku, tak nechci zakladat novy thread:
Mam template show.phtml kde zobrazuji fotky z databaze. Rad bych u kazdy fotky udelal checkboxy, abych mohl pripadne oznacit vice fotek a ty naraz smazat – mohl by me nekdo prosim navest, jak to udelat po nettovsku? (Myslenka, ze bych rucne do toho template vypisoval <form><input text>…<input submit>… je chybna, ne?)

Editoval Ja (2. 8. 2010 0:30)

wdolek
Člen | 331
+
0
-

Ja: neni mi znam zpusob, kterym by to slo udelat… samozrejme by slo vzit z Html objekt z formulare ($form->getElementPrototype()) a zkusit to naklohnit pres to. ale obavam se, ze nejake obecne reseni proste neni. toto uz je precejen ponekud specificka zalezitost. ja bych si asi proste rucne v sablone vykreslil prvky…

{block #content}
	{widget $form begin}
	{widget $form errors}

	...
	{$form['field']->label} {$form['field']->control}
	...

	{widget $form end}
{/block}

k tem obrazum – pouzil bych vyse uvedeny priklad – tedy misto <form ...>...<input type="submit" ...></form> bych spis pouzil widgetovani, s tim, ze ty checkboxy k obrazkum by se mohly resit:

  1. pridal bys je do AppForm na zaklade poctu obrazku (tedy by byly soucasti formulare jako takoveho, v handleru by ti tyto checkboxy pritekly)
  2. pridal bys checkboxy v sablone rucne – pri zpracovani bys pak jejich hodnoty musel vyzobat z toho, co bylo odeslano – nebyly by soucasti AppForm
Ja
Člen | 260
+
0
-

Dekuju moc za odpoved, za navedeni, nicmene jeste bych potreboval vedet jak presne s temi widgety pracovat – nemuzu tady nalezt zadny kloudny material a odpovedi mi casto jsou mrtve linky – jako napr. https://wiki.nette.org/cs/faq/widgety
jde mi o to, jak vytvorit ty „stycne“ body jako je begin, end atd.. v te tovarnicce, muzete me jeste prosim nekdo navest?
Diky.

wdolek
Člen | 331
+
0
-

Ja: pro pouziti v sablone

{widget $form begin}
...
{widget $form end}

musis v presenteru vyrobit „tovarnicku“ pojmenovanou createComponent... a pak ji v nejakem render... zavolat.

ja to pouzivam takto (presenter):

public function renderFooForm() {
	$this->template->form = $this->createComponentFooForm();
}

public function createComponentFooForm() {
	$form = new AppForm($this, 'FooForm');
	...
	return $form;
}

mno a to je v podstate vsechno… vic v podstate nemusis. v sablona, kdyz napises to s tim widget, tak te sablone rikas „vem widget (komponentu) z promenne a zavolej na nem metodu renderBegin“… a to je cela magie

casem si takhle muzes vyrabet vlastni komponenty :)


edit: vlastne nemusis mit primo createComponent.... to co cpes do widget proste musi byt nejaka komponenta (Control) :) a je jedno, jestli si k ni prisel pomoci createComponentFooForm nebo treba createComponent('fooForm')… a nebo uplne jinak

a vlastne doufam, ze jsem v nejakem deliriu nepopletl nejaka slovicka :)

Editoval wdolek (2. 8. 2010 17:36)

Ja
Člen | 260
+
0
-

Jo, uz se zacinam do toho dostavat, jeste prosimte, kde bych nalezl seznam dostupnych parametru, popr nejakych dalsich metod? V api jsem to nenalezl.
Jinak diky za tvuj cas, moc si toho vazim a vsechny novy informace hltam!

wdolek
Člen | 331
+
0
-

Ja: zrovna to zalezi na typu rendereru – napriklad Form pouziva
Nette\Forms\ConventionalRenderer … u formularu je to tedy bezne begin, end, errors…

u vlastni komponenty si muzes vyrobit vic rendereru :) ale s tim ted nebudu moc obtezovat.

jinak snad sem prilis nemystifikoval – pouziti widget funguje jen na te komponente. nelze tim vykreslit prvky formulare! prvky formulare musis vykreslovat:

{$form['jmeno']->label}
{$form['jmeno']->control}

:) samozrejme za predpokladu, ze objekt formulare si do sablony posles jako promennou $form

Editoval wdolek (2. 8. 2010 17:33)

Ja
Člen | 260
+
0
-

Tve odpovedi oteviraji dalsi prostory pro nove otazky :-)
Musim rict, ze to je teda pekne tuhej start:)

S ohledem na info, ktery jsem psal vyse, predstava je takova, ze ke kazdy vylistovany fotce se da checkbox a pri zaskrtnuti a odeslani formulare se zaskrtnute fotky smazou.
Chtel jsem odeslat vsechny checkboxy jako array, nicmene Nette mi to nedovolilo. Nebo jsem se znovu vydal spatnym smerem?

Component name must be non-empty alphanumeric string, ‚idFotky[]‘ given.

zapis:

v komponente: $form->addCheckbox(„idFotky[]“);

v template: {$form[‚idFotky[]‘]->control}

wdolek
Člen | 331
+
0
-

Ja: :) jo na to sem take kdysi narazil – reseni je proste, vytvor ve formulari kontejner

$form->addContainer('idFotky'); // od ted do ->addContainer(NULL) se bude vse klast do tohoto kontejneru
$form->addCheckbox('1', '');

toto vyrobi checkbox se jmenem idFotky[1]… k hodnote se pak dostanes v handleru jako k prvku pole $form['idFotky'][1] (tedy alespon myslim ;D)… a napriklad pruchod vsema hodnotama:

foreach ($form['idFotky']->getComponents() as $id => $control) {
	echo $id, ':', $control->getValue(), PHP_EOL;
}

vice treba zde: https://dev.nette.org/…larove-prvky#…

Ja
Člen | 260
+
0
-

Tendle problem se zda byt delikatesou:) Kor pro zacatecnika:)

{$form[‚idFotky[1]‘]->value($photo->id)}

Component with name ‚idFotky[1]‘ does not exist.

samozrejme pokud zkusim {$form[‚1‘]->control->value($photo->id)}, tak to v pohode z komponenty veme checkbox, vykresli, ale neni to ta array, kterou pozadujeme :-/ Jeste nejaky napad? Kazdopadne prostuduju odkaz, diky za nej.

EDIT:

jeste teda upraveno podle manualu:

<?php
$form->addContainer('idFotky'); // od ted do ->addContainer(NULL) se bude vse klast do tohoto kontejneru
$form['idFotky']->addCheckbox('1', '');
?>

Editoval Ja (2. 8. 2010 23:34)

Ja
Člen | 260
+
0
-

ze by?

{$form->getComponent(‚idFotky‘)->getComponent(‚1‘)->control->value($photo->id)}

wdolek
Člen | 331
+
0
-

{$form->getComponent(‚idFotky‘)->getComponent(‚1‘)->control->value($photo->id)}

zkusil bych spise: {$form['idFotky'][1]} – je to kratsi :)

hodnotami bych ty checkboxy naplnil uz v rendereru (a ne v sablone, jestli dobre chapu ten kus kodu) – respektive v action... predchazejici renderovani (mam pocit, ze nastaveni hodnot v render... by se asi nepovedlo)

co to ma vlastne presne delat? je seznam tech obrazku nejak dynamicky generovany na strance, nebo to cele vzdy projde zpracovanim a vzdy se uzivateli vrati nejake vygenerovane HTML?

Ja
Člen | 260
+
0
-

renderShow preda vysledky z databaze a pak je pres cyklus v template vykresluju… nazev obrazku, obrazek samotnej a tendle checkboxy, kam predava id fotky…
pak pri zpracovani projdu cely to pole a smazu fotky diky jejich IDeckum, takle uz ten kod vypada stravitelne a i to dava smysl – a to naplneni funguje bezvadne (a to jsem s tim ->value strilel od boku).
zitra rano to zkusim zpracovat, ale verim, ze uz nenastane zadnej problem, jeste jednou diky moc! netusim, jak bych se tim sam prokousal:)