2012-06-27 17 views
12

Ho un modulo con 2 selezioni. In base al valore della prima selezione, aggiorna i valori della seconda selezione utilizzando AJAX. In questo modo il modulo non è valido. Così, ho fatto il prossimo cambiamento:Zend: convalida del modulo: valore non trovato nell'errore del pagliaio

 $form=$this->getAddTaskForm(); //the form 

     if(!$form->isValid($_POST)) { 
      $values=$form->getValues(); 

      //get the options and put them in $options 

       $assignMilestone=$form->getElement('assignedMilestone'); 
       $assignMilestone->addMultiOptions($options); 

     } 

     if($form->isValid($_POST)) { 
       //save in the database 
      }else { 
       //redisplay the form 
      } 

Fondamentalmente, controllare se è valido e non è se l'utente ha cambiato il valore della prima select. Ottengo le opzioni che hanno popolato la seconda selezione e compilare il modulo con loro. Quindi provo a convalidarlo di nuovo. Tuttavia questo non funziona. Qualcuno può spiegare perché? È presente lo stesso "valore non trovato nel pagliaio".

+0

Prova 'var_dump ($ options);' e poi 'var_dump ($ assignMilestone-> getValue());' e vedi quali risultati ottieni. Deve essere che le chiavi dell'array per '$ options' non contengano il valore corretto impostato. – drew010

risposta

31

Si potrebbe provare a disattivare il validatore:

nel vostro form.php

$field = $this->createElement('select', 'fieldname'); 
$field->setLabel('Second SELECT'); 
$field->setRegisterInArrayValidator(false); 
$this->addElement($field); 

La terza linea si disattiva il validatore e dovrebbe funzionare.

+1

Questo è stato ESTREMAMENTE utile, grazie mille. – SoluableNonagon

+0

Non penso che sia sicuro rimuovere solo la validazione, ma se decidi di rimuoverlo dovresti almeno cambiare i validatori. Ad esempio, se non controlli più se l'elemento si trova nell'array selezionato, devi assicurarti che l'opzione selezionata sia (almeno) valida per il tuo caso ... una "data" o "numero" o "email" o qualsiasi altra cosa . –

+0

questa opzione è molto utile quando si monta dinamicamente l'elemento select con jquery. – vandersondf

1

È inoltre possibile aggiungere opzioni per selezionare l'elemento prima di verificare la convalida del modulo. In questo modo sei assicurato che il valore selezionato è nel range.

8

È possibile anche disattivare il validatore inArray usando 'disable_inarray_validator' => true:

Ad esempio:

$this->add(array(
     'name'  => 'progressStatus', 
     'type'  => 'DoctrineModule\Form\Element\ObjectSelect', 
     'options' => array(
      'disable_inarray_validator' => true, 
     ), 

    )); 
+0

Questa è l'unica soluzione che ha funzionato per me – Ruwantha

3

Additionaly si dovrebbe aggiungere il proprio inArray Validator al fine di proteggere il vostro db ecc

In Zend Framework 1 sembra che questo:

$this->addElement('select', $name, array(
      'required' => true, 
      'label' => 'Choose sth:', 
      'filters' => array('StringTrim', 'StripTags'), 
      'multiOptions' => $nestedArrayOptions, 
      'validators' => array(
       array(
        'InArray', true, array(
         'haystack' => $flatArrayOptionsKeys, 
         'messages' => array(
          Zend_Validate_InArray::NOT_IN_ARRAY => "Value not found" 
         ) 
        ) 
       ) 
      ) 
     )); 

Dove $ nestedArrayOptions è multiOptions e $ flatArrayOptionsKeys contiene tutte le chiavi.

Problemi correlati