用于多检查框的zend表单从标签中删除输入

时间:2011-06-03 15:48:42

标签: php html zend-framework zend-form zend-form-element

我正在使用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中包围每个选项。我已经在互联网上查看了所谓的解决方案的许多页面,但没有在多个盒子上工作,因为它只针对周围的标签(即本例中的主题)不是实际的选项标签和输入。

请帮忙。

由于 保罗

4 个答案:

答案 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标签