2017-10-19 18 views
0

Je ne suis pas sûr de ce qui se passe. J'utilise Zend Form 2 avec un champ multisélect. Lorsque je soumets le code, les valeurs existent dans la publication. Lorsque j'exécute les valeurs via zend form 2, je n'obtiens aucune erreur de validation mais le champ multiselect est soudainement vide.Zend Form 2 champ multi-sélection est vide après validation

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(); 
    } 
} 

Ce sont les objets de formulaire zend que je me sers. J'utilise Slim Framework 2 comme mon backend. Voici l'objet de commande:

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[]] => 
) 

Je me rends compte que je pouvais très facilement simplement contourner la validation ici parce que je ne suis pas en utilisant n'importe quel validateur sur ce champ. Je suis plus préoccupé par la cause sous-jacente cependant.

Pourquoi les données d'auteur validées sont-elles vides?

Répondre

0

Lorsque vous spécifiez multiple dans les attributs, Zend\Form et Zend\InputFilter ajoutez [] après le nom. Vous ne devriez pas le faire vous-même sinon, dans le code html, l'élément apparaît sous le nom author[][] et la méthode setData ne correspond pas. Pour le voir, remplacez required par true et regardez le code html du formulaire.

$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

Cela fonctionne! Merci! – lokisapocalypse