0

我的问题ZF2 FormInput to show error class on validation failed的答案是创建我自己的表单视图助手,覆盖该render函数。虽然这对于使用 渲染的元素非常有效forminput,但对于继承自forminput. 例如,FormCheckbox继承自forminput但不是 MY forminput

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

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

除了创建多个视图助手之外,是否可以创建单个视图助手并告诉 ZF2 在由 ZF2 视图助手进行的所有对原始视图助手的调用中使用它?

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

4

3 回答 3

0

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

在 autoload 函数中,您添加了一个额外的检查来检查请求的类是否为\Zend\Form\View\Helper\FormInput,如果是,则加载您的自定义 FormInput。

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

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

于 2017-01-18T12:54:40.100 回答
0

我使用的是部分视图。使用部分,您可以为每个输入元素定义自己的 html,并且您可以访问输入元素的所有属性和消息(例如错误消息):

在您的部分 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');
于 2017-01-18T13:44:37.300 回答
0

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

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

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

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

于 2017-05-04T11:48:57.433 回答