Formuláře: seskupování prvků, fieldset a vlastní renderování
- David Grudl
- Nette Core | 8218
Novinkou revize 63 je schopnost seskupovat prvky formulářů do skupin (zobrazené v HTML třeba jako fieldset) a možnost definovat vlastní vykreslovací funkce.
Seskupování elementů je velmi snadné. Stačí vytvořit skupinu a přidat do ní libovolné elementy:
$form->addGroup('Personal data')
->add($form['name'], $form['age'], $form['gender'], $form['email']);
Vlastně je to ještě jednodušší. Po vytvoření nové skupiny se tato stává aktivní a každý nově přidaný prvek je zároveň přidán i do ní. Takže formulář lze stavět tímto způsobem:
$form = new Form;
$form->addGroup('Personal data');
$form->addText('name', 'Your name:');
$form->addText('age', 'Your age:');
$form->addText('email', 'E-Mail:')->emptyValue = '@';
$form->addGroup('Shipping address');
$form->addCheckbox('send', 'Ship to address');
$form->addText('street', 'Street:', 35);
$form->addText('city', 'City:', 35);
$form->addSelect('country', 'Country:', $countries);
Skupina, kterou reprezentuje třída FormGroup, představuje množinu prvků IFormControl bez specifického sémantického významu. Význam jí tedy dodá až například renderovací rutina, která prvky vykreslí seskupené do elementů fieldset a podobně.
Tím se dostáváme k vykreslování.
Nyní je možné si definovat vlastní vykreslovací handler
$form->setRenderer($ownRenderer)
, což je objekt s rozhraním
IFormRenderer
. Výchozím vykreslovačem je
ConventionalRenderer
, který není nutné explicitně nastavovat.
Ten vykreslí formulář stejným způsobem, jako starší verze.
Důležité upozornění: rozhraní
IFormRenderer
by mělo být co nejjednodušší a nevynucovat si
implementaci metod jako třeba renderBegin(), renderEnd() (ačkoliv právě
třída ConventionalRenderer
je mít může a také má. Kvůli
tomu jsou všechny vykreslovací metody třídy Form
zastaralé! Zatím sice fungují, ale jejich volání je doprovázeno
varováním.
Form definuje jedinou metodu render()
a lze jej nyní vykreslit
i konstrukcí echo $form
.