验证者EmailAddress可以验证电子邮件数组

时间:2015-06-12 13:19:28

标签: php validation email zend-framework2 jquery-select2

我有一个select2字段(标签),需要使用Zend框架2中的EmailAddress验证器进行验证。

select2字段的帖子是这样的:

'email@domain.com, email2@domain.com'

从这里开始,我的表单有一个输入过滤器,如下所示:

public function getInputFilterSpecification()
    {
        return array(
            'name'  => array(
                'required'   => true,
                'filters'    => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                ),
            ),
            'emailList'  => array(
                'required'   => true,
                'filters'    => array(
                    array('name' => 'StripTags'),
                    array('name' => 'StringTrim'),
                    array(
                        'name' => 'Callback',
                        'options' => array(
                            'callback' => function($value) {
                                if (is_string($value)) {
                                    $value = explode(',', $value);
                                }
                                return $value;
                            },
                        ),
                    )
                ),
                'validators' => array(
                    array(
                        'name' => 'EmailAddress',
                    ),
                ),
            ),
        );
    }

就像你看到的那样,我想验证我从表单中获得的所有邮件,所以我explode将我的字符串放入一个数组中,以便循环播放每封电子邮件。

我不知道如何以及在何处验证此数组的一个问题。在此示例中,我收到错误'invalid type. String expected'表示此验证程序只接受一封电子邮件。

可以这样做吗?我可以将foreach放入选项回调中以验证我的每封电子邮件吗?

试过:

来自我的Fieldset:

$this->add(
    array(
        'name'    => 'emailList',
        'type' => 'Zend\Form\Element\Email',
        'options' => array(
            'label' => 'email_list',
            'label_attributes' => array(
                'class'  => 'control-label col-xs-5'
            ),
        ),
        'attributes' => array(
            'class' => 'form-control select-tags col-xs-5 nopadding',
            'multiple' => true,
        )
    )
);

我的观点:

<?=$this->formEmail($reporting->get('emailList'));?>
<p class="col-xs-4 help-block">
  <?php 
    if ($this->formElementErrors($reporting->get('emailList'))) {
      echo $this->formElementErrors()
        ->setMessageOpenFormat('- ')
        ->setMessageSeparatorString('<br/>- ')
        ->setMessageCloseString('')
        ->render($reporting->get('emailList'));
    }
  ?>
</p>

我尝试将类型更改为Zend \ Form \ Email,即使这样......也没有按预期工作

我得到了之前的错误信息:

- 'test@domain.com,lol' ne correspond pas au format dot-atom
- 'test@domain.com,lol' ne correspond pas au format quoted-string
- 'test@domain.com,lol' n'est pas une partie locale valide pour l'adresse email

抱歉,这是法语,基本上它表示该字符串与点原子模式,引用字符串模式和无效的电子邮件地址不匹配。但是

test@domain.com是第一封电子邮件,lol @ test.com是第二封电子邮件。所以逗号是个问题

1 个答案:

答案 0 :(得分:3)

你为什么不接受OOP?为此创建新的验证器:

namespace YourApp\Validator;

use Zend\Validator\EmailAddress;

class EmailAddressList extends EmailAddress
{
    public function isValid($value)
    {
        $emails = array_map('trim', explode(',', $value));
        foreach ($emails as $email) {
            if (!parent::isValid($email)) {
                return false;
            }
        }

        return true;
    }
}

并在您的验证器规范中:

public function getInputFilterSpecification()
{
    return [
        // other fields
        'emailList'  => [
            'required'   => true,
            'validators' => [
                ['name'=> EmailAddressList::class],
            ],
        ],
    ];
    }