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

标签 zend-framework2

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

最佳答案

表单元素必须实现 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 Framework 如何处理自定义表单元素类型的呈现有点复杂。通常,它只返回简单的 <input type="text">元素。

有一个选项,然后您必须覆盖 Zend\Form\View\Helper\FormElement helper 。注册为formelement并且您必须在自定义模块中覆盖此 View 助手:
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 中的每个表单元素都由 View 助手呈现。因此,您为自己的元素创建了一个 View 助手,它将呈现元素的内容。

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

作为最后一步,创建 View 助手来呈现这个特定的表单元素:
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其中包含您的特定表单元素。

关于zend-framework2 - 如何在 Zend Framework 2 中创建自定义表单元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13776458/

相关文章:

zend-framework2 - Zend 框架 2 中的子句 ORWhere

php - 将 Web 应用程序 (ZF2) 转换为 PHAR

zend-framework2 - 如何在 Zend2 的删除查询中使用 limit 和 order by

mysql - Zend 2 子查询列

zend-framework2 - zend framework 2 简单集成

php - ZF2 初始化器和 TranslatorAwareInterface

php - Zend框架2 : How much unit testing to do on controllers?

php内置网络服务器错误日志(Zend Framework 2 App)

php - ServiceLocator,让我们在 ZF2 上下文中考虑一下

php - ZF2中MySQL长连接的使用