Grafické oddělení prvků ve formuláři
- Ja
- Člen | 260
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
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
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
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:
- pridal bys je do
AppForm
na zaklade poctu obrazku (tedy by byly soucasti formulare jako takoveho, v handleru by ti tyto checkboxy pritekly) - 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
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
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)
- wdolek
- Člen | 331
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
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
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
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)
- wdolek
- Člen | 331
{$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
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:)