我正在使用zend_form(Zend Framwork的一部分)创建一个表单,当我使用Zend_Form的multiheckbox元素(Zend_Form_Element_MultiCheckbox)添加一组复选框时,会发现这样输出的代码:
<label for="subjects-maths">
<input type="checkbox" value="maths" id="subjects-maths" name="subjects[]">
Maths
</label>
<label for="subjects-english">
<input type="checkbox" value="maths" id="subjects-english" name="subjects[]">
English
</label>
即。输入在标签内。虽然代码在技术上是正确的,但是就W3c看到它并且也不是我想要它的方式而言它是违反良好做法的,因为它使得造型更难。我想要的是以下内容:
<div>
<label for="subjects-maths">
Maths
</label>
<input type="checkbox" value="maths" id="subjects-maths" name="subjects[]">
</div>
<div>
<label for="subjects-english">
English
</label>
<input type="checkbox" value="maths" id="subjects-english" name="subjects[]">
</div>
因此,如何将复选框输入移出标签,以及如何在div中包围每个选项。我已经在互联网上查看了所谓的解决方案的许多页面,但没有在多个盒子上工作,因为它只针对周围的标签(即本例中的主题)不是实际的选项标签和输入。
请帮忙。
由于 保罗
答案 0 :(得分:4)
默认情况下,装饰器Zend_Form_Decorator_ViewHelper
使用视图帮助器Zend_View_Helper_FormMultiCheckbox
来渲染您的multiheckbox元素。该视图助手从Zend_View_Helper_FormRadio
扩展而来,由于某种原因,该助手已经过硬编码,可以在<label>
标记周围添加<input>
个标记。
您需要编写自己的视图助手,从Zend_View_Helper_FormRadio::formRadio()
复制大部分代码,但在元素周围编写没有<label>
标记的HTML。来自另一个答案的Here's a snippet显示了您可能想要进行的修改。
您的自定义助手应命名为Some_Prefix_Helper_FormMultiCheckbox
但是
如果不知道您的应用是如何构建的,很难确切地说出Some_Prefix
应该是什么,或者如何确保加载它而不是Zend_View_Helper_FormMultiCheckbox
。有关一些提示,请查看loading plugins上的文档。
答案 1 :(得分:3)
看来最好的解决方案是基于松鼠的上述答案。由于标签内的输入是硬编码的,因此最佳解决方案是改变这种行为。您可以通过修改Zend_View_Helper_FormRadio类或使用您自己的自定义视图标头覆盖它来执行此操作。我建议使用自定义头选项,因为修改zend框架会是一个坏主意,因为每次更新框架时都需要更新,对使用框架副本的任何人或任何项目都有影响。通过使用自定义帮助程序将特定于项目,它不会影响任何其他内容,也不会受到更新框架的影响(但是,如果框架更新已更改某些行为,您可能会发现需要更新帮助程序)。我做得很好的是:
1 - 在库中创建了一个模型/模块,我称之为我的网站。这首先涉及在库中创建与模型同名的文件夹。因此我有图书馆&gt;网站
编辑:忘了说你需要通过bootstrap或application.ini注册插件库。我觉得最简单的就是添加:
autoloaderNamespaces [] =“网站_”
appnamespace下面的任何地方
2 - 我为类Website_View_Helper_FormRadio创建了相关的子文件夹和文件,它将覆盖Zend_View_Helper_FormRadio。因此文件夹和文件结构是
网站&gt;视图&gt;助手&gt; FormRadio.php
3 - 然后我将formRadio函数的内容从Zend_View_Helper_FormRadio复制到了类中的Website_View_Helper_FormRadio。然后,我使用squirrel引用的代码修改它,因此继承自Zend_View_Helper_FormRadio的Website_View_Helper_FormRadio类,如下所示:
class Website_View_Helper_FormRadio extends Zend_View_Helper_FormRadio
{
public function formRadio($name, $value = null, $attribs = null, $options = null, $listsep = "<br />\n")
{
// The code from the formRadio function in Zend_View_Helper_FormRadio with
// the modification from the code squirrel referred to
}
}
然后,这为我们提供了我们自己的类副本,其中包含我们修改过的代码,该代码继承自FormRadio元素的zend版本。
您现在可以像普通一样使用Zend Form Radio元素,它将使用我们的改进
请注意,如果您希望对MultiCheckbox或复选框产生相同的效果,则需要使用我们的表单无线电版本,因为这些元素使用表单无线电作为基础。为此,我们在库中创建自己的这些版本,并使它们继承自我们的版本。因此,我们将为multiheckbox提供以下内容:
库&gt;网站&gt;视图&gt;助手&gt; FormMultiCheckbox.php
将是Zend_View_Helper_FormMultiCheckbox
的副本然后更换一行:
class Zend_View_Helper_FormMultiCheckbox extends Zend_View_Helper_FormRadio
使用:
class Website_View_Helper_FormMultiCheckbox extends Website_View_Helper_FormRadio
我希望能帮助别人。
答案 2 :(得分:3)
以下是有关multiCheckBox渲染自定义的一些额外信息
我希望复选框的标签为 prepend 而不是追加(此默认行为是硬编码的)。由于ZF参考指南不是很健谈,我最终进入核心代码来弄清楚如何定制它。有关详细信息,请查看Zend_View_Helper_FormRadio::formRadio()
。
可以通过 multiCheckBox选项修改复选框decorator :添加一些前缀为label_
的选项。
这是我的表单元素:
$this->addElement('multiCheckbox', 'stars_number', array(
'filters' => array('Int'),
'escape' => false, // to allow html in the labels
'separator' => '', // to keep everything inline
'label_placement' => 'prepend',
'label_class' => 'stars', // custom css needed
'decorators' => $decorator_chain, // decorators array defined upper, and passed to many elements of the form
));
我希望这可以帮助一些人节省数小时不成功的谷歌抓取......
答案 3 :(得分:-1)
我认为你需要删除装饰器标签并创建自己的装饰器,它将像Label装饰器一样工作,但在需要时一起使用div和label标签