【问题标题】:zend form for multicheckbox remove input from labels多复选框的zend表单从标签中删除输入
【发布时间】:2011-09-07 22:28:57
【问题描述】:

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

请帮忙。

谢谢 保罗

【问题讨论】:

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


    【解决方案1】:

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

    我希望复选框的标签 prepend 而不是 append(此默认行为是硬编码的)。由于 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
    ));
    

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

    【讨论】:

      【解决方案2】:

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

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

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

      autoloaderNamespaces[] = "Website_"

      应用命名空间下的任意位置

      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
      

      我希望对某人有所帮助。

      【讨论】:

        【解决方案3】:

        装饰器Zend_Form_Decorator_ViewHelper 默认使用视图助手Zend_View_Helper_FormMultiCheckbox 来呈现您的多复选框元素。该视图助手是从 Zend_View_Helper_FormRadio 扩展而来的,由于某种原因,它被硬编码为将 &lt;label&gt; 标签放在 &lt;input&gt; 标签周围。

        您需要编写自己的视图助手,该助手从Zend_View_Helper_FormRadio::formRadio() 复制大部分代码,但在元素周围编写不带&lt;label&gt; 标记的HTML。 Here's a snippet 来自另一个答案,显示了您可能想要进行的修改。

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

        【讨论】:

        • 硬编码的原因是当有许多多选项时它会非常慢(如果是动态的)。 (我们的 Intranet 应用程序中有 250 多个选项,无法降低这个数字 - ajax 负载会在繁忙时间杀死服务器请求限制)
        • 自定义助手似乎很有意义,但不确定如何使其工作。自定义助手是否需要完全替换 Zend_View_Helper_FormRadio 中的所有内容,还是只替换 html 输出的部分?另外我将如何注册自定义助手?我试图在 application.ini 中注册它,但它忽略了它,但不确定正确的代码是什么。
        【解决方案4】:

        我认为你需要删除装饰器标签并创建自己的装饰器,它可以像标签装饰器一样工作,但根据需要一起使用 div 和标签标签

        【讨论】:

        • 不起作用,因为 multiCheckBox 是一个包含多个复选框的复杂元素。这些复选框装饰器是硬编码的。
        猜你喜欢
        • 1970-01-01
        • 2019-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-07
        • 2017-05-19
        • 1970-01-01
        • 2014-08-15
        相关资源
        最近更新 更多