Na Checkbox ani RadioList nelze nastavit atributy při manuálním vykreslování

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

Ahoj, narazil jsem na problém při manuálním vykreslování formuláře.

Mám formulář

		$form = new Nette\Application\UI\Form;
		$form->addText('text', 'text')
			->setAttribute('class', "automat");
		$form->addPassword('password', 'password')
			->setAttribute('class', "automat");
		$form->addTextArea('textarea', 'textarea')
			->setAttribute('class', "automat");
		$form->addCheckbox('checkbox', 'checkbox')
			->setAttribute('class', "automat");
		$form->addRadioList('radiolist', "radiolist", array(1, 2, 3))
			->setAttribute('class', "automat");
		$form->addSelect('select', "select", array(7, 8, 9))
			->setAttribute('class', "automat");
		$form->addMultiSelect('multiselect', "multiselect", array(10, 11, 12))
			->setAttribute('class', "automat");
		$form->addUpload('upload', "upload")
			->setAttribute('class', "automat");
		$form->addImage('image', 'http://www.seznam.cz/st/img/2011/logo.png?3.33.63')
			->setAttribute('class', "automat");
		$form->addButton('button', "button")
			->setAttribute('class', "automat");
		$form->addSubmit('submit', 'submit')
			->setAttribute('class', "automat");

A vykreslím jej pomocí kódu

{form formular}
	<table>
		<tr n:foreach="$form->controls as $input">
			<th>{label $input /}</th>
			<td>{input $input, class=>"manual"}</td>
		</tr>
	</table>
{/form}

Tím by se teoreticky měly vykreslit všechny komponenty s třídou manual, ale to se nestane.

V případě Checkbox a RadioList nelze v šabloně s vykreslením přes makro input přepsat atributy.

Nezkoušel jsem vypisovat pomocí n:name, pravděpodobně by to mělo jít. Také jsem neteslovat CheckboxList a nevím jestli to u něj funguje.

Příčinou nemožnosti změnit atributy je způsob zápisu kódu do třídy Nette\Utils\Html pomocí metody setHtml(). Tím se nenastaví proměnná name a při volání metody startTag()(součást metody render) se nepřepíšou atributy. A kód zůstane nepozměněn.

V dokumentaci se o této vyjímce nepíše, proto to považuji za chybu.

Nette 2.1.2

sKopheK
Člen | 207
+
0
-

Od Nette 2.1 se Checkboxy a RadioListy přes macro {input ...} vykreslují jinak, zkus je vykreslit přes {input nazev:}, nebo si napiš vlastní macro, které nahradí to existující, ovšem při další změně v budoucí verzi Nette ho možná budeš muset ručně měnit.

Jinak bych ti doporučil než každému prvku zvlášť dát css třídu raději celému formuláři a místo např.

.automat
{
	border: 1px solid #000;
}

měl např.

form.automat input,
form.automat textarea
{
	border: 1px solid #000;
}

Editoval sKopheK (7. 4. 2014 16:27)