Zmena renderovania Control-u

zerb
Člen | 7
+
0
-

Ahojte,

v aplikácii potrebujem urobiť formuláre v štýle material design.

Na formuláre používam bootstrap4 renderer z examplov na githube nette forms.

Potrebujem prinútiť TextInput, aby vyrenderoval takýto zápis:

<input>
<label>
<span class="xx">

Aktuálne sa mi TextInput vyrenderuje takto:

<label>
<input>

Potrebujem teda zmeniť poradie vyrenderovaného inputu a labelu a pridať za ne span.

Manuálny rendering formov nie je pre mňa riešenie, nakoľko má mať tento štýl každý formulár v aplikácii.

Vie mi niekto poradiť, ako by som toto mohol dosiahnuť? Vopred ďakujem.

lightteka
Backer | 17
+
+1
-

Ja bych na to sel asi upravou (prepsanim) metody renderPair() v rendereru. Rad se ale poucim o lepsim postupu.

class MyRenderer extends \Nette\Forms\Rendering\DefaultFormRenderer
{
    public function renderPair(Nette\Forms\IControl $control)
    {
        if ($control instanceof Nette\Forms\Controls\TextInput) {
            $pair = $this->getWrapper('pair container');

            // Prohozeni poradi
            $pair->addHtml($this->renderControl($control));
            $pair->addHtml($this->renderLabel($control));
            // pridani vlastniho spanu
            $pair->addHtml(Nette\Utils\Html::el('span')->setAttribute('class', 'xx'));

            $pair->class($this->getValue($control->isRequired() ? 'pair .required' : 'pair .optional'), TRUE);
            $pair->class($control->hasErrors() ? $this->getValue('pair .error') : NULL, TRUE);
            $pair->class($control->getOption('class'), TRUE);
            if (++$this->counter % 2) {
                $pair->class($this->getValue('pair .odd'), TRUE);
            }
            $pair->id = $control->getOption('id');

            return $pair->render(0);
        }

        return parent::renderPair($control);
    }
}

class MyForm extends \Nette\Application\UI\Form
{
    public function __construct(Nette\ComponentModel\IContainer $parent = null, $name = null)
    {
        parent::__construct($parent, $name);
        $this->setRenderer(new MyRenderer());

    }
}
public function createComponentForm($name)
{
    $form = new MyForm();
    $form->addText('test', 'Label');

    $form->addSubmit('send', 'Odeslat');

    $form->onRender[] = 'makeBootstrap4';

    return $form;
}