Custom TextInput složený s více TextInputů

tprochazka
Člen | 13
+
0
-

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

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

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.

Taco
Člen | 50
+
0
-

Já bych to řešil javascriptem. Nechat input jak je, schovat ho, a použít ho jako model pro mé vlastní javascriptové řešení, které bude vypadat jak potřebuji

Kamil Valenta
Člen | 815
+
0
-
$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}