2015-06-12 43 views
1

的陣列我有一個SELECT2字段(標記)至極需要與EmailAddress的驗證器從Zend框架進行驗證2.驗證EmailAddress的可以驗證電子郵件

從SELECT2字段後是這樣的:

'[email protected], [email protected]' 

從這裏,我的形式所具有的輸入濾波器至極看起來是這樣的:

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我STR進入一個循環中有效每個電子郵件的數組。

一個問題,我不知道如何以及在哪裏驗證這個數組。在這個例子中,我得到錯誤'invalid type. String expected'意味着這個驗證器只接受一封電子郵件。

可以做到這一點嗎?我可以將一個foreach插入選項回調來驗證我的每封電子郵件嗎?

嘗試:

從我的字段集:

$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, 
     ) 
    ) 
); 

我VUE:

<?=$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的\表格\電子郵件,甚至與...沒有按預期工作

而且我收到了以前的錯誤消息:

- '[email protected],lol' ne correspond pas au format dot-atom 
- '[email protected],lol' ne correspond pas au format quoted-string 
- '[email protected],lol' n'est pas une partie locale valide pour l'adresse email 

對不起它在法國,基本上它說,該字符串不匹配點原子模式,引用列模式,而不是有效的電子郵件地址。但是

[email protected]是第一封電子郵件,而[email protected]是第二封。所以逗號是個問題

+1

伊莫使用Zend的\表格\元素\電子郵件與多個真實。見http://framework.zend.com/manual/current/en/modules/zend.form.element.email.html – venca

+0

@venca我編輯我的文章與你的想法,很好的提示btw,但它似乎我做錯了或者它沒有按預期工作。 – Hooli

回答

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], 
      ], 
     ], 
    ]; 
    }