0

实际上我不明白,zend framework 2 如何为表单元素生成 HTML。例如,

$others = new Element\MultiCheckbox('others');
$others->setLabel('Others')
        ->setAttribute('name', 'others');
$others->setValueOptions(array(
    '1' => 'Contacts',
    '2' => 'Who viewd my profile'
));

此代码生成 -

<label><input type="checkbox" value="1" name="others[]">Contacts</label>
<label><input type="checkbox" value="2" name="others[]">Who viewd my profile</label>

但我需要按如下方式制作 HTML -

<input type="checkbox" value="1" name="others[]"><label>Contacts</label>
<input type="checkbox" value="2" name="others[]"><label>Who viewd my profile</label>

那么如果我想更改生成的 HTML,我该怎么做呢?

4

1 回答 1

2

对于这种功能,您需要覆盖Zend\Form\View\Helper\MultiCheckbox或更准确地说renderOptions()是它的功能。

然后,您会ViewHelperManager告知$this->formMultiCheckbox()应该调用您自己的ViewHelper方法来获得所需的结果。

但是我想提一下,您非常不鼓励您尝试做的事情。用户绝对应该能够点击标签!如果您要更改标记,至少要这样做:

<input type="checkbox" value="1" name="others[]" id="cbOthers1"><label for="cbOthers2">Foo</label>
<input type="checkbox" value="2" name="others[]" id="cbOthers1"><label for="cbOthers2">Bar</label>

永远不要忘记您的应用程序的可用性!另一个提示:就浏览器对样式的支持而言,标签内的 CB 会自动使您拥有更广泛的受众!话又说回来,一切都取决于你。ViewHelper无论如何,您都必须自己编写。

PS:ViewHelper会很容易,您只需将这些行覆盖为以下内容:

  switch ($labelPosition) {
     case self::LABEL_PREPEND:
        $template  = $labelOpen . '%s'. $labelClose .'%s';
        $markup    = sprintf($template, $label, $input);
     break;
     case self::LABEL_APPEND:
     default:
        $template  = '%s' . $labelOpen . '%s'. $labelClose;
        $markup    = sprintf($template, $input, $label);
      break;
 }
于 2013-06-03T05:44:27.140 回答