Vlastni FormControl label

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

Pokouším vykreslit jeden formulář skládající se z většího počtu checkboxů, labelů a odesílacího tlačítka. Chtěl bych je zarovnat do tří sloupců.

Tedy bych potřeboval label i chackbox zvlášť obalit tagy ‚td‘ (s možností nastavení attributu class).

Výsledek by měl vypadat takto:

<tr>
    <td class="checkbox"><input type="checkbox" name="cat[]" value="1" id="cat-1" /></td>
    <td class="label"><label for="cat-1">Category 1</label></td>
    <td class="checkbox"><input type="checkbox" name="cat[]" value="2" id="cat-2" /></td>
    <td class="label"><label for="cat-2">Category 2</label></td>
    <td class="checkbox"><input type="checkbox" name="cat[]" value="3" id="cat-3" /></td>
    <td class="label"><label for="cat-3">Category 3</label></td>
</tr>
<tr>
    <td class="checkbox"><input type="checkbox" name="cat[]" value="4" id="cat-4" /></td>
    <td class="label"><label for="cat-4">Category with very very long name that don't fit</label></td>
    <td class="checkbox"><input type="checkbox" name="cat[]" value="5" id="cat-5" /></td>
    <td class="label"><label for="cat-5">Category 5</label></td>
    <td class="checkbox"><input type="checkbox" name="cat[]" value="0" id="cat-0" /></td>
    <td class="label"><label for="cat-0"><i>Uncategorized</i></label></td>
</tr>
<tr>
    <td class="checkbox"><input type="checkbox" name="cat[]" value="all" id="cat-all" /></td>
    <td class="label"><label for="cat-all"><i>All</i></label></td>
</tr>

V případě, že by checkboxy byly statické, vykreslil bych je ručně v šabloně, ale já je tahám z DB a je tedy potřeba formulář sestavit dynamicky, což by (imho) šablonu značně zaprasilo.

Tedy konečně k otázce: Je možné každý label a input zvlášť obalit nějakým kódem? Zkoušel jsem toto, ale chybí metoda setLabel() ;-(

$label_container = Html::el('td');
$label_container->class = 'label';
$checkbox = $form->AddCheckbox($name, $caption);
$label = $checkbox->getLabel();
$label->setHtml($label_container->add($label));

Jak byste to řešili vy?
Předem dík ;-)

Editoval Elijen (29. 8. 2010 3:41)

pEeLL
Člen | 23
+
0
-

v rámci ručního vykreslení tě to bude stát pár řádků a bude to bez problémů.

pokud trváš na řešení v php tak si pohraj s

$renderer = $form->getRenderer();
$renderer->wrappers['controls']['container']
$renderer->wrappers['pair']['container']
$renderer->wrappers['label']['container']
$renderer->wrappers['control']['container']

Editoval pEeLL (29. 8. 2010 9:06)

Elijen
Člen | 171
+
0
-

V šabloně nemam tušení jak bych to řešil … hlavně jak vyřešit to, aby se do každého řádku tabulky vypsali maximálně tři checkboxy?

S polem $wrappers jsem si hrát zkoušel, ale [‚label‘][‚container‘] funguje jinak, než bych očekával :-/

Při tomto nastavení (když chci další řádek zavolám $form->AddGroup())

$renderer->wrappers['control']['container'] = "td";
$renderer->wrappers['pair']['container'] = NULL;
$renderer->wrappers['label']['container'] = "td";
$renderer->wrappers['group']['container'] = "tr";
$renderer->wrappers['controls']['container'] = NULL;
$renderer->wrappers['form']['container'] = "table";

Dostanu toto (místo toho, aby se tagem ‚td‘ obalil label inputu se vytvoří <td>&nbsp;</td>

<tr>
	<td>&nbsp;</td>
	<td><input type="checkbox" name="0" id="frm-0" /><label for="frm-0">Category 1</label></td>
	<td>&nbsp;</td>
	<td><input type="checkbox" name="1" id="frm-1" /><label for="frm-1">Category 2</label></td>
	<td>&nbsp;</td>
	<td><input type="checkbox" name="2" id="frm-2" /><label for="frm-2">Category 3</label></td>
</tr>

Navíc potřebuju conatineru nastavit attribut class. Zatím mi přijde nejjednodušší podědit ConventionalRenderer a trochu ho upravit/doplnit.

Editoval Elijen (29. 8. 2010 15:50)

Elijen
Člen | 171
+
0
-

Tak vyřešeno rozšířením ConventionalReneru a přepsáním metody renderControl … stále mi ale nejde do hlavy, proč má Checbox vlastně dva labely. Jeden je HTML tag label (který se IMHO nešťastně vykresluje napevno současně s inputem) a druhý jakýsi popisek, který se zabalí do tagů definovaných v poli $wrappers['label']['container']. Nicméně text, který se do tagů vloží je buď prázdný řetězec nebo ‚&nbsp;‘. Dost podivné :-/

Editoval Elijen (30. 8. 2010 9:32)