如何在 Zend Framework 2 中创建自定义表单元素? [英] How to create custom form element in Zend Framework 2?

查看:26
本文介绍了如何在 Zend Framework 2 中创建自定义表单元素?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How can I in ZF2 create custom form element with custom validator? I want to create custom category picker that uses jQuery and content of this element should be rendered from phtml script. In ZF1 it was quite easy but in ZF2 I don't know from where to start.

推荐答案

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

A form element must implement a Zend\Form\ElementInterface. A default class is the Zend\Form\Element which you can use as a base form:

<?php
namespace MyModule\Form\Element;

use Zend\Form\Element;

class Foo extends Element
{
}

自定义验证器

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

You can let the element directly assign a custom validator. Then you must implement the 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 Framework 如何处理自定义表单元素类型的呈现有点复杂.通常,它只返回普通的 元素.

At this moment it is a bit complex how Zend Framework handles the rendering of custom form element types. Usually, it just returns plain <input type="text"> elements.

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

There is one option, then you have to override the Zend\Form\View\Helper\FormElement helper. It is registered as formelement and you must override this view helper in your custom module:

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 中的每个表单元素都由视图助手呈现.因此,您为自己的元素创建了一个视图助手,它将呈现元素的内容.

Furthermore, every form element in Zend Framework 2 is rendered by a view helper. So you create a view helper for your own element, which will render the element's content.

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

Then you have to create your own form element 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);
    }
}

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

As a last step, create your view helper to render this specific form 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 文件,把它加载到这个助手中:

If you want to render a .phtml file for example for this form element, load it inside this helper:

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

It will render a my-module/form-element/foo.phtml and in this script you will have a variable $element which contains your specific form element.

这篇关于如何在 Zend Framework 2 中创建自定义表单元素?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆