php validation zend-framework2 zend-form zend-form-element

php - Zend Framework 2-El elemento de formulario eliminado hace que la validación falle



validation zend-framework2 (4)

Debe haber un validador definido para este elemento en particular que está tratando de eliminar.

En su controlador donde está agregando nuevos elementos al formulario, debe haber una llamada addValidator como:

$ element-> addValidator (''alnum'');

Eso está causando la falla de la validación. Por lo tanto, eliminó el elemento del formulario, pero todavía tiene la validación definida en ese elemento para ser verificado.

Si no puede encontrar esta función de validación en el controlador, intente ver si se ha definido a través del archivo de configuración.

Puede leer más sobre la validación de formularios en zf aquí: http://framework.zend.com/manual/1.12/en/zend.form.elements.html

Uso una cierta forma en varios lugares. En uno de ellos tengo que ignorar un elemento de formulario que programé programáticamente después de la validación.

Debido a que es solo una excepción, no quiero crear un formulario nuevo. Así que pensé, simplemente eliminé este elemento en el controlador como:

$myForm->remove(''myElement'');

El problema es que el formulario ahora no se validará. No obtengo ningún error, pero $myForm->isValid() simplemente devuelve un valor vacío.

¿Alguna idea de lo que podría estar haciendo mal?

¡Gracias!


Ok, finalmente encontré una solución ! Puede definir un ValidationGroup que le permita establecer los atributos que desea validar. Los otros no están validados:

$form->setValidationGroup(''name'', ''email'', ''subject'', ''message''); $form->setData($data); if ($form->isValid()) { ...


En la class ValidatorChain implements Countable, ValidatorInterface , agrega un nuevo método:

public function remove($name){ foreach ($this->validators as $key => $element) { $validator = $element[''instance'']; if($validator instanceof $name){ unset($this->validators[$key]); break; } } }

Use esto:

$form->getInputFilter()->get("xxxxx")->getValidatorChain()->remove(''xxxxxx'');


Lo primero que pensé fue eliminar el validador de ValidatorChain de myElement. Puede obtenerlo dentro del controlador con:

$form->getInputFilter()->get( ''myElement'' )->getValidatorChain()

Parece que no puedes eliminar del ValidatorChain, solo agrega. Revisa esta publicación Matthew Weier O''Phinney, de Zend, explica por qué no se puede hacer y una posible solución para su escenario.

La forma en que resuelvo este problema es verificar la ''condición de eliminación'' cuando creo el validador en la clase FormFilter. Si usa anotaciones, creo que no funciona para usted, por lo que las sugerencias de Matthew son las que debe usar.

O puede probar el de esta publicación de @Stoyan Dimov: defina dos formularios, un tipo de BasicForm y ExtendedForm. El primero tiene todos los elementos de forma común, el segundo es uno extendido del otro con el resto de campos. Dependiendo de su condición, podría usar uno u otro.