2012-06-27 6 views
12

nicht gefunden Ich habe ein Formular mit 2 Auswahlmöglichkeiten. Basierend auf dem Wert der ersten Auswahl aktualisiert er die Werte der zweiten Auswahl unter Verwendung von AJAX. Dadurch wird das Formular ungültig. Also machte ich die nächste Änderung:Zend: Formularvalidierung: Wert wurde im Heuhaufen Fehler

 $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 
      } 

Grundsätzlich ich überprüfen, ob es gültig ist und es ist nicht, wenn der Benutzer den Wert der ersten Auswahl geändert. Ich bekomme die Optionen, die die zweite Auswahl bevölkerten und füllte das Formular mit ihnen. Dann versuche ich es erneut zu bestätigen. Dies funktioniert jedoch nicht. Jeder kann erklären warum? Der gleiche "Wert wurde nicht im Heuhaufen gefunden" ist vorhanden.

+0

Probieren Sie 'var_dump ($ options);' und dann 'var_dump ($ assignMilestone-> getValue());' und sehen Sie, welche Ergebnisse Sie erhalten. Es muss sein, dass die Array-Schlüssel für "$ options" nicht den richtigen Wert enthalten, der gesetzt ist. – drew010

Antwort

31

Sie könnten versuchen, den Validator zu deaktivieren:

in Ihrem form.php

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

Die dritte Zeile wird den Validator deaktivieren und es sollte funktionieren.

+1

Dies war sehr hilfreich, vielen Dank. – SoluableNonagon

+0

Ich glaube nicht, dass es sicher ist, die Validierung einfach zu entfernen, aber wenn Sie sich entscheiden, es zu entfernen, sollten Sie zumindest die Validatoren ändern. Wenn Sie beispielsweise nicht mehr prüfen, ob sich das Element im Select-Array befindet, müssen Sie sicherstellen, dass die ausgewählte Option (zumindest) für Ihren Fall gültig ist ... ein "Datum" oder eine "Nummer" oder "E-Mail" oder was auch immer . –

+0

Diese Option ist sehr nützlich, wenn Sie das select-Element dynamisch mit jquery mounten. – vandersondf

1

Sie können auch Optionen zum Auswählen des Elements hinzufügen, bevor Sie die Formularvalidierung überprüfen. Auf diese Weise sind Sie versichert, dass der ausgewählte Wert in Reichweite ist.

Zum Beispiel:

8

Sie können auch die InArray Prüfung mit 'disable_inarray_validator' => true deaktivieren

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

    )); 
+0

Dies ist die einzige Lösung, die für mich funktioniert – Ruwantha

3

Additionaly sollten Sie hinzufügen, besitzen Sie InArray Validator, um Ihre db usw. zu schützen

In Zend 1-Framework es sieht wie folgt aus:

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

Wo $ nestedArrayOptions ist Sie multiOptions und $ flatArrayOptionsKeys enthält Sie alle Schlüssel.