Formulářová makra: jak přidat třidu?

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

Ahoj, potřebuji v šabloně přidat třídu do formuláře. Nasledující kód mi však zahodí všechny původní třídy a nastaví jen tu ze šablony. Já ji chci ale přidat k těm, které si nese formulář. Víte někdo jak na to, pls?

{input dateTo} <!-- vyrenderuje <input ... class="date hasDatepicker"> -->
{input dateTo, class=>'form-control'} <!-- vyrenderuje <input ... class="form-control"> -->
<!-- chci dosáhnout: <input ... class="date hasDatepicker form-control"> -->
Zax
Člen | 370
+
0
-

Tohle jsem taky nedávno řešil a trochu blíž zkoumal chování.

Mějme formulářový prvek

$form->addText('name', 'Jméno')
	->getControlPrototype()
		->addClass('test');
<input n:name="name" class="form-control">
<!-- vygeneruje class="form-control" -->

<input n:name="name" n:class="form-control">
<!-- vygeneruje class="test" -->

{input name, class => form-control}
<!-- vygeneruje class="form-control" -->

První příklad vygeneruje pouze „form-control“, protože když Latte vidí v elementu class, tak automaticky zruší cokoliv bylo nastavené v inputu, aby ve výsledném html nebyly dva stejné atributy (ve zkompilované šabloně je cca toto: echo $control->addAttributes(['class' => NULL])->attributes()).

Druhý příklad s n:class jsem podrobně nezkoumal.

Třetí příklad se správně přeloží do echo $control->addAttributes(['class' => 'form-control']), kámen úrazu je ale v tom, že metoda addAttributes používá funkci array_merge, nikoliv array_merge_recursive. Těžko říct, zda je to tak správně…

Editoval Zax (11. 3. 2015 3:35)

Jan Tvrdík
Nette guru | 2595
+
+5
-

Možná bychom mohli do Nette přidat kromě class, taky +class a pro konzistenci i -class.

David Grudl
Nette Core | 8218
+
0
-

Z pohledu Latte parseru není +class symbol, takže je třeba parametry ve FormMacros zpracovat ručně, podobně jako to dělá třeba macroVar. Není to nijak zásadně složitý úkol, tak to třeba někdo implementuje.