在不丢失元素的默认输入过滤规范的情况下,不需要zend2设置字段

jba*_*ros 7 php zend-framework zend-framework2

使用ZF2,我编写了一个自定义表单元素并将其包含在一堆表单中.问题是,如果我指定我不想要表单元素,我会丢失元素上的默认验证器.

class MyForm extends Zend\Form\Form implements Zend\InputFilter\InputFilterProviderInterface
{
    public function __construct()
    {
        parent::__construct("my-form");
        $this
        ->add(array(
            'type' => 'Me\Custom\EmailList',
            'name' => 'emails',
            'options' => array(
                'label' => _t('Email List'),
            ),
        ));
    }

    public function getInputFilterSpecification()
    {
        return array(
            'emails' => array(
                'required' => false,
             ),
        ));
    }
}
Run Code Online (Sandbox Code Playgroud)

"EmailList"元素是一个简单的文本字段,它接受以逗号分隔的电子邮件地址列表.

class EmailList extends \Zend\Form\Element\Email
{
    protected $attributes = array(
        'type' => 'email',
        'multiple' => true,
    );
    public function getInputSpecification()
    {
        $this->getEmailValidator()
            ->setMessage('"%value%" is not a valid email address');

        $validator = $this->getValidator();
        if ($validator instanceof ExplodeValidator) {
            $validator->setValueDelimiter(', ');
        }

        return array(
            'name' => $this->getName(),
            'required' => true,
            'validators' => array(
                $validator,
            ),
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,在我的MyForm类中,似乎通过包含"电子邮件" getInputSpecification(),EmailList上的默认验证器完全被删除并且从未使用过.

如何将所需标志设置为false并维护元素的默认验证器?

请注意,此自定义字段以多种形式使用,并且大多数时间都是必需的,这就是为什么其默认规范包括将required标志设置为true.

谢谢

Tim*_*ain 3

所以您希望电子邮件字段是可选的,但如果填充,它可以使用您的验证器?

假设我已经正确理解了这个问题,那么您的代码对我来说工作得很好(在 ZF 2.2.5 上),只需一个很小的更改:

class EmailList extends \Zend\Form\Element\Email
{
    protected $attributes = array(
        'type' => 'text', // <- I changed type from 'email' to 'text'
        'multiple' => true,
    );

[...]
Run Code Online (Sandbox Code Playgroud)

HTMLtype="email"是 HTML5 中添加的字段类型之一,并且(至少在 Webkit 浏览器中)这会在浏览器本身中触发一些客户端验证。浏览器对这种类型的字段要做的一件事就是删除所有空格。然后您的表单将无法验证,因为您希望使用,(逗号空格)作为分隔符。通过更改类型,text浏览器会将其视为纯旧文本字段,ZF 将在服务器端处理所有验证。

如果这是问题所在,您可能会发现将值分隔符设置为,(或根本不设置)也可以解决该问题。

如果这不能解决问题,请验证应用程序是否会进入该if ($validator instanceof ExplodeValidator) {状态。您还可以尝试使用以下命令查看附加到控制器中表单元素的验证器:

var_dump($form->getInputFilter()->get('emails')->getValidatorChain());
Run Code Online (Sandbox Code Playgroud)