Flastní formrender implements Nette\Forms\IFormRenderer

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

Zdravím,

pokouším se o vlastní formRenderer zápasím s vykreslením addRadioList:

    protected function createComponentTaskForm() {

        $form = new Form();

        $form->setRenderer( new \Nette\Forms\Rendering\MyFormRenderer() );

        $sex = array(
            'm' => 'muž',
            'f' => 'žena',
        );

        $form->addRadioList('gender', 'Pohlaví:', $sex);

        $form->addSubmit('create', 'Vytvořit');
        return $form;
    }

<?php

namespace Nette\Forms\Rendering;

use Nette,
    Nette\Utils\Html;

class MyFormRenderer extends Nette\Object implements Nette\Forms\IFormRenderer {

    /** @var Nette\Forms\Form */
    protected $form;

    public function render(Nette\Forms\Form $form, $mode = NULL) {
        $this->form = $form;
        return $this->renderControls($this->form);
    }

    public function renderControls($parent) {
        $container = Html::el("form");

        foreach ($parent->getControls() as $control) {
            $container->add($this->renderControl($control));
        }

        $s = '';
        if (count($container)) {
            $s .= "\n" . $container . "\n";
        }
        return $s;
    }

    public function renderControl(Nette\Forms\IControl $control) {
        $body = Html::el("div");

        $el = $control->getControl();
        return $body->setHtml($el);
    }

}

vygeneruje následující kód:

<form novalidate="">
   <div>
      <label for="frm-taskForm-gender-m">
         <input type="radio" name="gender" id="frm-taskForm-gender-m" value="m">muž
      </label>
      <label for="frm-taskForm-gender-f">
         <input type="radio" name="gender" id="frm-taskForm-gender-f" value="f">žena
      </label>
   </div>
   <div>
      <input type="submit" name="create" value="Vytvořit">
   </div>
<div>
<input type="hidden" name="do" value="taskForm-submit"></div>
</form>

Já bych chtěl každý label ještě obalit do <div class=„radio“>:

   <div>
      <div class="radio">
         <label for="frm-taskForm-gender-m">
            <input type="radio" name="gender" id="frm-taskForm-gender-m" value="m">muž
         </label>
      </div>
      <div class="radio">
         <label for="frm-taskForm-gender-f">
            <input type="radio" name="gender" id="frm-taskForm-gender-f" value="f">žena
         </label>
      </div>
   </div>

Nevěděl by někdo jak na to?