实际上我无法理解,zend框架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,我该怎么做?
答案 0 :(得分: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
非常简单,您只需要覆盖those lines以下内容:
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;
}