2017-10-19 78 views
0

我不確定發生了什麼。我使用Zend Form 2和多選字段。當我提交代碼時,這些值在post中存在。當我通過zend表單2運行這些值時,我得不到驗證錯誤,但多選字段突然變空。驗證後,Zend Form 2多選字段爲空

class Form extends \Zend\Form\Form 
{ 
    // input filter to set up filters and validators 
    protected $myInputFilter; 

    public function __construct() 
    { 
     // create the zend form 
     parent::__construct(); 

     // make it a bootstrap form 
     $this->setAttribute('class', 'form-horizontal'); 
     $this->setAttribute('role', 'form'); 

     // set the default objects we'll use to build the form validator 
     $this->myInputFilter = new \Zend\InputFilter\InputFilter(); 
    } 
} 

class AddPublicationForm extends Form 
{ 
    public function __construct() 
    { 
     // create the zend form 
     parent::__construct(); 

     $this->setAttribute('class', 'form-horizontal'); 
     $this->setAttribute('id', 'add-publication-form'); 

     $this->add([ 
      'name' => 'author[]', 
      'attributes' => [ 
       'class' => 'form-control', 
       'data-placeholder' => 'Author', 
       'multiple' => 'multiple', 
       'placeholder' => 'Author', 
      ], 
      'required' => false, 
      'type'  => \Zend\Form\Element\Select::class, 
      'options' => [ 
       'value_options' => [ 
        'check1' => 'check1', 
        'check2' => 'check2', 
       ], 
      ], 
     ]); 

     $this->myInputFilter->add([ 
      'filters' => [], 
      'name' => 'author[]', 
      'required' => false, 
      'validators' => [], 
     ]); 

     // attach validators and filters 
     $this->setInputFilter($this->myInputFilter); 

     // prepare the form 
     $this->prepare(); 
    } 
} 

這些是我正在使用的zend窗體對象。我使用Slim Framework 2作爲我的後端。這裏是控制器對象:

public function addAction() 
{ 
    $request = $this->app->request; 
    $form = new Form\AddPublicationForm(); 

    if ($request->isPost()) { 
     $params = $request->params(); 
     // DUMP 1: exit('<pre>'.print_r($params, true).'</pre>'); 
     $form->setData($params); 

     if ($form->isValid()) { 
      $data = $form->getData(); 
      // DUMP 2: exit('<pre>'.print_r($data, true).'</pre>'); 
     } 
    } 
} 

DUMP 1:

Array 
(
    [author] => Array 
     (
      [0] => check1 
      [1] => check2 
     ) 
} 

DUMP 2:

Array 
(
    [author[]] => 
) 

我意識到,我可以很容易地只是繞過驗證在這裏,因爲我不使用該領域的任何驗證器。儘管如此,我更關心的是潛在的原因。

爲什麼驗證的作者數據是空的?

回答

0

當您在屬性中指定multiple時,Zend\FormZend\InputFilter在名稱後添加[]。否則,您不應該自己動手,在html代碼中,該元素出現在名稱author[][]setData方法不匹配。 要查看它,請用true替換required,然後查看錶單的html代碼。

$this->add([ 
     'name' => 'author', 
     'attributes' => [ 
      'class' => 'form-control', 
      'data-placeholder' => 'Author', 
      'multiple' => 'multiple', 
      'placeholder' => 'Author', 
     ], 
     'required' => false, 
     'type'  => \Zend\Form\Element\Select::class, 
     'options' => [ 
      'value_options' => [ 
       'check1' => 'check1', 
       'check2' => 'check2', 
      ], 
     ], 
    ]); 

    $this->myInputFilter->add([ 
     'filters' => [], 
     'name' => 'author', 
     'required' => false, 
     'validators' => [], 
    ]); 
+0

This Works!謝謝! – lokisapocalypse