Formulářová makra {label} a {input} v případě formulářového kontejneru

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

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

Jan Endel
Člen | 1016
+
0
-

mělo by jít:

{label group-neco /}
{input group-neco}
radas
Člen | 225
+
0
-

Paráda, skutečně funguje. To mě nenapadlo. Díky!

Filip Procházka
Moderator | 4668
+
0
-

A přitom se stačilo podívat na Honzovu přednášku :)

David Grudl
Nette Core | 8228
+
0
-

Mělo by jít i {formContainer group} {label neco}

radas
Člen | 225
+
0
-

Super, {formContainer group} je paráda pro renderování více prvků po sobě. Díky.

Ještě jeden dotaz: dá se formulářovým makrem vyrenderovat např. první radiobutton ze skupiny radiobuttonů? Dříve jsem to řešil pomocí

{$form['radiobtn']->getControl(0)}
Filip Procházka
Moderator | 4668
+
0
-

Na tohle žádné zkratka není, zkus to postaru :)

radas
Člen | 225
+
0
-

Postaru to funguje, jenom mě zajímalo, jestli není pohodlnější zápis :-)

uestla
Backer | 799
+
0
-

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
+
0
-

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)