如何在Zend框架2创建自定义表单元素?(How to create custom form ele

2019-08-03 17:44发布

可我怎么在ZF2创建自定义的验证自定义表单元素? 我想创建一个使用jQuery和这个元素的内容应从PHTML脚本呈现自定义类别选择器。 在ZF1这是很容易的,但在ZF2不知从哪里开始知道。

Answer 1:

表单元素必须实现Zend\Form\ElementInterface 。 默认类是Zend\Form\Element ,你可以作为一个基本形式使用:

<?php
namespace MyModule\Form\Element;

use Zend\Form\Element;

class Foo extends Element
{
}

自定义的验证

您可以让元素直接指定一个自定义的验证。 然后,你必须实现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(),
            ),
        );
    }
}

自定义呈现

这时它是一个有点复杂Zend框架如何处理自定义表单元素类型的渲染。 通常情况下,它只是返回纯<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',
            ),
        );
    }
}

此外,在Zend框架2的每个表格单元由视图助手渲染。 所以,你创造自己的元素视图助手,这会使元素的内容。

然后,你必须创建自己的表单元素助手( 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);
    }
}

作为最后一步,创建视图助手来解析这个特定的表单元素:

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包含特定表单元素。



文章来源: How to create custom form element in Zend Framework 2?