Zend framework2 如何在Zend Framework 2中创建自定义表单元素?

Zend framework2 如何在Zend Framework 2中创建自定义表单元素?,zend-framework2,Zend Framework2,如何在ZF2中使用自定义验证器创建自定义表单元素?我想创建使用jQuery的自定义类别选择器,该元素的内容应该从phtml脚本呈现。在ZF1中非常简单,但在ZF2中我不知道从何处开始。表单元素必须实现Zend\form\element接口。默认类是Zend\Form\Element,可以将其用作基本表单: <?php namespace MyModule\Form\Element; use Zend\Form\Element; class Foo extends Element { }

如何在ZF2中使用自定义验证器创建自定义表单元素?我想创建使用jQuery的自定义类别选择器,该元素的内容应该从phtml脚本呈现。在ZF1中非常简单,但在ZF2中我不知道从何处开始。

表单元素必须实现
Zend\form\element接口。默认类是
Zend\Form\Element
,可以将其用作基本表单:

<?php
namespace MyModule\Form\Element;

use Zend\Form\Element;

class Foo extends Element
{
}
自定义渲染

目前,Zend Framework如何处理自定义表单元素类型的呈现有点复杂。通常,它只返回普通的
元素

有一个选项,那么您必须覆盖
Zend\Form\View\Helper\FormElement
Helper。它已注册为
formelement
,您必须在自定义模块中覆盖此视图辅助对象:

namespace MyModule;

class Module
{
    public function getViewHelperConfig()
    {
        return array(
            'invokables' => array(
                'formelement' => 'MyModule\Form\View\Helper\FormElement',
                'formfoo'     => 'MyModule\Form\View\Helper\FormFoo',
            ),
        );
    }
}
此外,Zend Framework 2中的每个表单元素都由视图辅助对象呈现。因此,您可以为自己的元素创建一个视图辅助对象,它将呈现元素的内容

然后您必须创建自己的表单元素帮助器(
MyModule\form\View\helper\FormElement
):

最后一步,创建视图辅助对象以呈现此特定表单元素:

namespace MyModule\Form\View\Helper;

use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\AbstractHelper;

class Foo extends AbstractHelper
{
    public function __invoke(ElementInterface $element)
    {
        // Render your element here
    }
}
例如,如果要为此表单元素呈现.phtml文件,请将其加载到此帮助程序中:

namespace MyModule\Form\View\Helper;

use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\AbstractHelper;

class Foo extends AbstractHelper
{
    protected $script = 'my-module/form-element/foo';

    public function render(ElementInterface $element)
    {
        return $this->getView()->render($this->script, array(
            'element' => $element
        ));
    }
}

它将呈现一个
my module/form element/foo.phtml
,在这个脚本中,您将有一个变量
$element
,其中包含您的特定表单元素。

我得到了可捕获的致命错误:传递给MyModule\form\View\Helper\FormElement::render()的参数1必须是MyModule\form\View\Helper\element接口的实例,Zend\Form\Element的实例给定当我添加Form元素时,它仍然是Zend\Form\Element而不是Element\Foo的实例,我添加如下内容:
$this->add(数组('name'=>'category','attributes'=>数组('type'=>'MyModule\Form\Elemen\Foo'));
@Maciej您是对的,我犯了两个错误:在
FormElement
视图帮助程序中,您也必须导入
ElementInterface
,否则您会收到上述警告。在视图帮助程序中,您的自定义表单元素出现了第二个错误。检查差异以查看差异,我认为这应该可以解决所有问题:是的更好的是,我仍然不能呈现元素,可能我在表单类中做了一些错误:
classmyform扩展了表单{public function}uuuu构造($name=null){//我们想忽略传递给父元素的名称::u构造('album');$this->setAttribute('method',post');$this->add(array)('name'=>'category','attributes'=>array('type'=>'Element\Foo',),'options'=>array('label'=>'category',););}}
它用于使用渲染()方法。现在所有表单视图帮助器显然都进行了彻底的修改,因此不再工作。我编辑了答案,因为render()应该重命名为_invoke()
namespace MyModule\Form\View\Helper;

use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\AbstractHelper;

class Foo extends AbstractHelper
{
    public function __invoke(ElementInterface $element)
    {
        // Render your element here
    }
}
namespace MyModule\Form\View\Helper;

use Zend\Form\ElementInterface;
use Zend\Form\View\Helper\AbstractHelper;

class Foo extends AbstractHelper
{
    protected $script = 'my-module/form-element/foo';

    public function render(ElementInterface $element)
    {
        return $this->getView()->render($this->script, array(
            'element' => $element
        ));
    }
}