nastavit třídu pro Form control container u konkrétního inputu
- Oli
- Člen | 1215
Ahoj,
jde nějak nastavit container u konkrétního formulářového prvku? Uvedu
příklad jak to mám:
$zip = $form->addText('zip', 'zip', NULL, 6)
$renderer = $form->getRenderer();
$renderer->wrappers['control']['container'] = 'div class="col-xs-8 col-sm-8 col-lg-8 input-group"';
tohle mě vygeneruje něco jako:
<div class="col-xs-8 col-sm-8 col-lg-8 input-group">
<input type="text" name="zip">
</div>
A já bych potřeboval aby například tenhle konkrétní input zip byl dlouhý jen 4:
<div class="col-xs-4 col-sm-4 col-lg-4 input-group">
<input type="text" name="zip">
</div>
Můžu pomocí $zip->něco
přepsat tu defaultní třídu,
kterou nastavuju pro wrapper?
Díky
- chemix
- Nette Core | 1310
zkus getControlPrototype()
:
...
$ele = $form->addPassword('password', 'Password:')
->setRequired('Please enter your password.');
$ele->getControlPrototype()->addAttributes(['class'=>'moje-trida']);
...
...
<td><input type="password" name="password" class="moje-trida text" id="frm-signInForm-password" required data-nette-rules='[{"op":":filled","msg":"Please enter your password."}]'></td>
...
zkouseno na Nette/Sandbox
- David Matějka
- Moderator | 6445
@chemix to pouze ovlivni class inputu, ne wrapperu
@Oli afaik to nejde… musis manualne renderovat (nebo default renderer
rozsirit..)
- chemix
- Nette Core | 1310
@matej21 spatne jsem pochopil otazku :-/
@Oli osobne to resim vlastni sablonou na renderovani formu, kde si foreachem projedu vsechny prvky a vykreslim je a pripadne si prave dam nejakou tridu na input a pak mam jen jednoduchej if pokud se jedna o „tento typ“ prvku tak ho vykresli nasledovne… Me to prijde jako frontendakovi mnohem lepe citelnejsi nez nejake zapaseni v Custom Rendereru…
- David Matějka
- Moderator | 6445
Uprava rendereru by nemusela byt slozita. Zhruba
class MyRenderer extends DefaultRenderer
{
public function renderPair(Nette\Forms\IControl $control)
{
$oldWrappers = $this->wrappers;
$this->wrappers = array_replace_recursive($this->wrappers, $control->getOption('wrappers', array()));
$result = parent::renderPair($control);
$this->wrappers = $oldWrappers;
return $result;
}
}
- Oli
- Člen | 1215
Tak jsem se k tomu dostal po roce, ale přece. :-) @DavidMatějka díky za nakopnutí. Trochu jsem to upravil a funguje to parádně:
$renderer = $this->setRenderer(new FormRenderer())->getRenderer();
$renderer->wrappers['control']['container'] = 'div class="col-sm-6 input-group"';
// FormRenderer
class FormRenderer extends DefaultFormRenderer
{
public function renderPair(IControl $control)
{
$oldWrappers = $this->wrappers;
if (array_key_exists('resize', $control->getOptions()))
{
$this->wrappers['control']['container'] = Strings::replace($this->wrappers['control']['container'], '~col-sm-6~', $control->getOption('resize'));
}
$result = parent::renderPair($control);
$this->wrappers = $oldWrappers;
return $result;
}
}
Ve formuláři potom použiju jako:
$form->addText('title', 'title')->setOption('resize', 'col-sm-3');