Custom TextInput složený s více TextInputů
- tprochazka
- Člen | 13
Potřeboval bych formulář, kde bude jako jeden řádek formuláře vstupní prvek tvořený z více samostatných textových polí na jednom řádků, pro zadání několika samostatných čísel.
Vím, že mohu použít Latte makro {formPrint changeForm}
a
formulář si poskládat úplně podle svého gusta.
Ale tím přijdu o budoucí snadnou úpravu všech formulářů na webu.
Vím, že mohu udělat custom Control aka
class MultipleIntegerInputs extends BaseControl {
Ale chtěl bych zachovat to co Nette poskytuje out of the box, tedy zachovat
validaci a všechno okolo.
Tedy ideálně kdyby šlo udělat custom Control , který bude jako constructor
brát pole Controlů a při renderování delegovat validaci a další věci na
jednotlivé prvky, mohl bych tak na jeden řádek dát třeba checkbox a
inputfield.
Nette form už něco takové dělá s Button, dá všechny automaticky na
jeden řádek.
Taky by se to asi dalo řešit, kdybych šlo nějak konfigurovat renderování
$monthsContainer = $form->addContainer("months");
for ($i = 1; $i <= 12; $i++) {
$monthsContainer->addInteger($i, Formatter::formatMonthName($i));
}
Jedině přetížit a přepsat metodu
DefaultFormRenderer->renderControls()
.
Nevím, zda bys šlo znásilnit Latte vykreslování formulářů, tak aby
vykreslovalo jeden Container ja nedej řádek.
Ale on je tam i zásadní problém, že Container nemá „label“.
Nebo prosím existuje ještě jiná možnost, která mi uníká?
Editoval tprochazka (12. 2. 0:28)
- m.brecher
- Generous Backer | 871
@tprochazka
Nebo prosím existuje ještě jiná možnost, která mi uníká?
Efektivní automatické a současně profesionální vykreslování Nette formulářů je oříšek. Také jsem to řešil a skončil jsem u trochu složitější obecné Latte vykreslovací šablony, která formuláře vykresluje automaticky v uspokojivé kvalitě, html jednotlivých inputů mám definováno ve vlastních blocích a není problém na základě nastavení nějakého flagu na inputu přepnout latte šablonu inputu. Takže jsem si v latte udělal vlastní univerzální renderer.
Jít cestou modifikace defaultního formulářového rendereru vyzkoušené nemám, ale myslím, že tato cesta nikam moc nevede, ale nevím.
- tprochazka
- Člen | 13
Zkoušel jsem mezitím jít cestou Latte šablony, přímo nad
$forms
je metoda getComponents()
, která obsahuje
místo daného Controlu opravdu Container, takže by se dalo v latté udělat
{if $ctrl instanceof Nette\Forms\Conntainer}
, ale bohužel když
chce člověk i groupy, tak má smůlu protože
$form->getGroups
, už pak vrací jen pole Control
a
ke Container
už se nedá dostat.
- Kamil Valenta
- Člen | 820
$form->addGroup('Měsíce');
$monthsContainer = $form->addContainer('months');
for ($i = 1; $i <= 12; $i++) {
$monthsContainer->addInteger($i, Formatter::formatMonthName($i));
}
{foreach $form->getComponents() as $cmp}
{if $cmp instanceof \Nette\Forms\Container}
{$cmp->getCurrentGroup()->getOptions()['label']}
{foreach $cmp->getControls() as $ctrl}
{label $ctrl}
{input $ctrl}
{/foreach}
{/if}
{/foreach}