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
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?