3

我正在使用 zend_form(Zend Framwork 的一部分)创建一个表单,当我使用 Zend_Form 的多复选框元素(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

4 回答 4

4

装饰器Zend_Form_Decorator_ViewHelper默认使用视图助手Zend_View_Helper_FormMultiCheckbox来呈现您的多复选框元素。该视图助手被扩展Zend_View_Helper_FormRadio,由于某种原因被硬编码以在<label>标签周围放置标签<input>

您需要编写自己的视图帮助程序,该帮助程序从其中复制大部分代码,但在元素周围Zend_View_Helper_FormRadio::formRadio()编写不带标签的 HTML 。这是另一个答案的片段,显示了您可能想要进行的修改。<label>

您的自定义助手应该被命名Some_Prefix_Helper_FormMultiCheckbox,但在不知道您的应用程序的结构的情况下,很难确切地说Some_Prefix应该是什么,或者您将如何确保加载它而不是Zend_View_Helper_FormMultiCheckbox. 查看有关加载插件的文档以获取一些提示。

于 2011-06-03T20:40:55.230 回答
3

以下是有关 multiCheckBox 呈现自定义的一些附加信息

我希望复选框的标签预先添加而不是附加(此默认行为是硬编码的)。由于 ZF 参考指南对它不感兴趣,我终于进入了核心代码来弄清楚如何自定义它。查看Zend_View_Helper_FormRadio::formRadio()更多信息。

可以通过multiCheckBox 选项修改复选框装饰器:添加一些前缀为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
));

我希望这将有助于一些人节省数小时不成功的谷歌抓取......

于 2012-10-05T00:21:10.250 回答
3

看来最好的解决方案是基于松鼠上面的答案。由于标签内的输入是硬编码的,因此最好的解决方案是改变这种行为。您可以通过修改 Zend_View_Helper_FormRadio 类或用您自己的自定义视图标题覆盖它来完成此操作。我建议使用自定义标头选项,因为修改 zend 框架将是一个坏主意,因为每次更新框架时都需要更新,对使用该框架副本的任何人或任何项目都有影响等。通过使用自定义帮助程序将特定于项目,它不会影响其他任何东西,也不会受到更新框架的影响(但是,如果框架更新改变了某些行为,您可能会发现需要更新帮助程序)。我所做的运行良好的是:

1 - 在库中创建了一个模型/模块,我调用了我的网站。这首先涉及在库中创建一个与模型同名的文件夹。因此我有图书馆>网站

编辑:忘了说您需要通过引导程序或 application.ini 注册插件库。我发现这是最简单的,只需添加:

autoloaderNamespaces[] = "网站_"

appnamespace 下面的任何地方

2 - 我为将覆盖 Zend_View_Helper_FormRadio 的类 Website_View_Helper_FormRadio 创建了相关的子文件夹和文件。因此文件夹和文件结构是

网站 > 视图 > 助手 > FormRadio.php

3 - 然后我将 formRadio 函数的内容从 Zend_View_Helper_FormRadio 复制到类中的 Website_View_Helper_FormRadio 中。然后我用松鼠引用的代码修改了它,因此继承自 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 或复选框具有相同的效果,则需要使它们使用我们的表单单选版本,因为这些元素使用表单单选作为基础。为此,我们在库中创建了我们自己的版本,并使它们继承自我们的版本。因此,对于 multicheckbox,我们将具有以下内容:

库 > 网站 > 视图 > 助手 > 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

我希望这对某人有所帮助。

于 2011-06-07T14:05:48.240 回答
-1

I think you need remove decorator Label and create own decorator which will work like Label decorator but use div and label tags together as you need

于 2011-06-03T15:56:06.907 回答