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

Mac*_*iej 10 zend-framework2

我如何在ZF2中使用自定义验证器创建自定义表单元素?我想创建使用jQuery的自定义类别选择器,并且应该从phtml脚本呈现此元素的内容.在ZF1中它很容易但在ZF2中我不知道从哪里开始.

Jur*_*man 26

表单元素必须实现一个Zend\Form\ElementInterface.默认类是Zend\Form\Element您可以用作基本表单的类:

<?php
namespace MyModule\Form\Element;

use Zend\Form\Element;

class Foo extends Element
{
}
Run Code Online (Sandbox Code Playgroud)

CUSTOM VALIDATOR

您可以让元素直接指定自定义验证器.然后你必须实现Zend\InputFilter\InputProviderInterface:

<?php
namespace MyModule\Form\Element;

use Zend\Form\Element;
use Zend\InputFilter\InputProviderInterface;
use MyModule\InputFilter\Bar as BarValidator;

class Foo extends Element implements InputProviderInterface
{
    protected $validator;

    public function getValidator()
    {
        if (null === $this->validator) {
            $this->validator = new BarValidator;
        }
        return $this->validator;
    }

    public function getInputSpecification()
    {
        return array(
            'name'       => $this->getName(),
            'required'   => true,
            'validators' => array(
                $this->getValidator(),
            ),
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

定制渲染

目前,Zend Framework处理自定义表单元素类型的呈现方式有点复杂.通常,它只返回普通<input type="text">元素.

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

namespace MyModule;

class Module
{
    public function getViewHelperConfig()
    {
        return array(
            'invokables' => array(
                'formelement' => 'MyModule\Form\View\Helper\FormElement',
                'formfoo'     => 'MyModule\Form\View\Helper\FormFoo',
            ),
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

此外,Zend Framework 2中的每个表单元素都由一个视图助手呈现.因此,您为自己的元素创建一个视图助手,它将呈现元素的内容.

然后你必须创建自己的表单元素helper(MyModule\Form\View\Helper\FormElement):

namespace MyModule\Form\View\Helper;

use MyModule\Form\Element;
use Zend\Form\View\Helper\FormElement as BaseFormElement;
use Zend\Form\ElementInterface;

class FormElement extends BaseFormElement
{
    public function render(ElementInterface $element)
    {
        $renderer = $this->getView();
        if (!method_exists($renderer, 'plugin')) {
            // Bail early if renderer is not pluggable
            return '';
        }

        if ($element instanceof Element\Foo) {
            $helper = $renderer->plugin('form_foo');
            return $helper($element);
        }

        return parent::render($element);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果要为此表单元素呈现.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
        ));
    }
}
Run Code Online (Sandbox Code Playgroud)

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