2012-06-27 11 views
12

Tengo un formulario con 2 selecciones. En función del valor de la primera selección, actualiza los valores de la segunda selección usando AJAX. Hacer esto hace que la forma no sea válida. Por lo tanto, hice el siguiente cambio:Zend: Validación de formulario: el valor no se encontró en el error del pajar

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

Básicamente, puedo comprobar si es válida y no es si el usuario cambia el valor de la primera selección. Obtengo las opciones que poblaron la segunda selección y llené el formulario con ellas. Luego trato de validarlo nuevamente. Sin embargo, esto no funciona. ¿Alguien puede explicar por qué? El mismo "valor no se encontró en el pajar" está presente.

+0

Pruebe 'var_dump ($ options);' y luego 'var_dump ($ assignMilestone-> getValue());' y vea qué resultados obtiene. Debe ser que las teclas de matriz para '$ options' no contengan el valor correcto establecido. – drew010

Respuesta

31

Se podría tratar de desactivar el validador:

en su form.php

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

La tercera línea se desactivará el validador y debería funcionar.

+1

Esto fue EXTREMADAMENTE útil, muchas gracias. – SoluableNonagon

+0

No creo que sea seguro eliminar la validación, pero si decide eliminarla, al menos debe cambiar los validadores. Por ejemplo, si ya no verifica si el elemento está en la matriz de selección, debe asegurarse de que la opción seleccionada sea (al menos) válida para su caso ... una "fecha" o "número" o "correo electrónico" o lo que sea . –

+0

esta opción es muy útil cuando se monta dinámicamente el elemento de selección con jquery. – vandersondf

1

También puede agregar opciones para seleccionar el elemento antes de comprobar la validación del formulario. De esta forma está asegurado que el valor de selección está dentro del rango.

8

También puede desactivar el validador InArray usando 'disable_inarray_validator' => true:

Por ejemplo:

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

    )); 
+0

Esta es la única solución que funcionó para mí – Ruwantha

3

Adicionalmente se debe añadir es el propietario InArray Validador con el fin de proteger su base de datos, etc.

En Zend Framework 1 que tiene el siguiente aspecto:

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

Donde $ nestedArrayOptions es usted multiOptions y $ flatArrayOptionsKeys contiene todas las claves.

Cuestiones relacionadas