nastavit třídu pro Form control container u konkrétního inputu

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

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

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
+
+2
-

@chemix to pouze ovlivni class inputu, ne wrapperu
@Oli afaik to nejde… musis manualne renderovat (nebo default renderer rozsirit..)

Oli
Člen | 1215
+
0
-

Kvůli tomuhle se mě manuálně renderovat nechce :-) Zkusím rozšířit, díky

chemix
Nette Core | 1310
+
0
-

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

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

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');