如何在 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/