ZF2 更改扩展 class

ZF2 change extends class

我的问题 的答案是创建我自己的表单视图助手,覆盖 render 函数。虽然这对于使用 forminput 呈现的元素非常有效,但它对继承自 forminput 的元素没有帮助。例如,FormCheckbox 继承自 forminput 而不是 MY forminput:

<?php
namespace Zend\Form\View\Helper;
//...
class FormCheckbox extends FormInput {
    //...
}

在这种情况下,我需要专门为 formcheckbox 创建另一个表单视图助手来扩展我的 forminput。再次对于我想包括的任何其他视图助手(formdateformemailformpassword 等)。

是否可以创建单个视图助手并告诉 ZF2 在 ZF2 视图助手对原始视图助手的所有调用中使用它,而不是创建多个视图助手?

\Zend\Form\View\Helper\FormCheckbox 将扩展 \RPK\Form\View\Helper\FormInput,这将扩展 \Zend\Form\View\Helper\FormInput.

我能想到的一个解决方案是重写自动加载器的一部分。

在自动加载函数中,您添加额外的检查以检查请求的 class 是否为 \Zend\Form\View\Helper\FormInput,如果是,则加载您的自定义 FormInput。

在您自己的 FormInput 中,您没有扩展 Zend FormInput,而是创建了它的一个副本,并修改了需要修改的部分。

除非 ZF2 为其表单助手使用依赖注入,否则这是我能想到的唯一方法(无需更改基础库代码)。

我用的是局部视图。使用 partials,您可以为每个 input-element 定义自己的 html,并且您可以访问 input-element:

的所有属性和消息(例如 error-messages)

在你的部分 phtml:

<?php
    $options = $element->getOptions();
    $t = $this->t();
    $value = $element->getValue();
    $messages = $element->getMessages();
    $attr = $element->getAttributes();

你可以像这样使用部分:

$this->formRow($form->get('myelement'), null, null, 'mypartial');

我正在使用 composer 安装 ZF2。当作曲家生成我的自动加载函数时,我可以在 composer.json 文件中指定一个自动加载路径:

"autoload": {
    "psr-4": {
        "Zend\Form\View\Helper\": "vendor/rpk/Rpk/Form/View/Helper"
    }
},

这将在我的供应商文件夹中搜索 class,然后再查看 zend 文件夹。

这不允许我扩展 FormInput,而是在它的位置调用我的 FormInput。在我的 FormInput 上调用 extends 会使应用程序进入无限循环,因此我们需要将 FormInput 的内容复制到我的 class 并在那里进行更改。