Formulářová makra {label} a {input} v případě formulářového kontejneru
- radas
- Člen | 225
Začal jsem přepisovat starý způsob manuálního renderování formulářových prvků v šabloně, tzn. z tohoto:
{$form['neco']->label}
{$form['neco']->control}
na toto:
{label neco /}
{input neco}
Narazil jsem ale ve chvíli, kdy je ve formuláři definován kontejner:
$con = $form->addContainer('group');
$con->addText('neco', ...);
Pak jsem hledal způsob, jak vyrendrovat formulářový prvek, když je v poli. Starým způsobem takto:
{$form['group']['neco']->label}
{$form['group']['neco']->control}
Po chvíli zkoušení se mi podařilo najít způsob, jak vykreslit i toto novými makry:
{label 'group']['neco' /}
{input 'group']['neco'}
protože Nette použije argument jako index pole $_form, ale přijde mi to jako velká prasárna. Neexistuje čistější způsob? Díky.
Nette 2.0.1 pro PHP 5.2
- uestla
- Backer | 799
Teď jsem např. potřeboval kromě konkrétního prvku radiolistu ještě přistoupit i k jeho labelu a controlu…
Nevím, jestli na to jdu špatně, ale vzhledem k tomu, že se při přístupu ke konkrétnímu prvku vkládají do prázdného HTML elementu dva potomci (nejdřív control, pak label), měl bych mít přeci možnost se k nim dostat, ni?
API: https://api.nette.org/…ist.php.html#164
$form->addRadioList('list', 'Vyberte', array(
'prvni' => 'ahoj',
'druhy' => 'kamaradi',
));
V šabloně pak:
{form myForm}
{dump $form['list']->getControl('prvni')->children}
{/form}
Dumpuje NULL
:-(
- uestla
- Backer | 799
Och, pardon…
Staré známé properties → chce to ->getChildren()
.
Chápu, že to není častý požadavek, a že vykreslovat nejdříve label a pak control je málokdy třeba, proto se na to musí takto krkolomně…
$list = $form->addRadioList('list', 'Vyberte:', array(
'prvni' => 'ahoj',
'druhy' => 'kamaradi',
));
$children = $list->getControl('prvni')->getChildren();
$children[0]; // <input /> (coby instance Html)
$children[1]; // <label /> (--||--)
Hlavní ale je, že to jde :-)
Editoval uestla (1. 3. 2012 19:32)