2011-11-05 33 views
7

Creo que sería muy útil crear una validación del formulario del lado del cliente en los componentes symfony2 Form y Validator.Crear validación combinada del lado del cliente y del lado del servidor en Symfony2

La mejor manera de hacerlo sería pasar las restricciones de validación a la vista de formulario. Con esa información, sería posible hacer una plantilla que la muestra un campo de formulario a algo como esto:

<div> 
    <label for="form_email">E-Mail</label> 
    <input 
     id="form_email" type="text" name="form[email]" value="" 
     data-validation-constraints='{"NotBlank":{},"MinLength":{"limit":6}}' 
    /> 
</div> 

La parte Javascript a continuación, sería encontrar todos <input> elementos que tienen el atributo data-validation-constraints y crear la validación correcta para ellos.

Para pasar las restricciones de validación a la vista de formulario, pensé que la mejor manera sería crear una extensión de tipo de formulario. Ese es el punto de mi pregunta: ¿Es esta la manera correcta? ¿Y cómo es esto posible?

En el momento en que mi solicitud de prórroga tipo se parece a esto:

use Symfony\Component\Form\FormInterface; 
use Symfony\Component\Form\FormView; 
use Symfony\Component\Form\FormBuilder; 

class FieldTypeExtension extends \Symfony\Component\Form\AbstractTypeExtension{ 

    public function getExtendedType(){ 
     return 'field'; 
    } 

    public function buildView(FormView $view, FormInterface $form) 
    { 
     // at this point i didn't find a way to get the 
     // validation constraints out of the $form 
     // the `getAllValidationConstraints` here is just an example 
     $view->set('validation_constraints', $form->getAllValidationConstraints()); 
    } 

} 

¿Cómo puedo obtener todas las restricciones de validación aplicados a un campo de formulario fuera del objeto FormInterface?

+0

@ alessandro1997 este paquete trata de resolver el mismo problema como he descrito, pero de una manera muy diferente. Actualmente funciona solo con restricciones definidas en anotaciones en la entidad. Quiero obtener todas las restricciones, sin importar de dónde vienen. Quiero usar el mismo mecanismo para encontrar los constantes que usa el método 'isValid'. – ausi

Respuesta

0

Puede hacer algo más simple:

El FieldType ya se pasa un attr atributo de la forma que se pasa directamente como attr var a ver. Es mejor que modifique este atributo de formulario attr para agregar su atributo restricciones de validación de datos, ya que evitará que se le solicite que también personalice el tema del formulario para manejar su nueva var.

<?php 

namespace MyBundle\Form\Type; 

use Symfony\Component\Form\AbstractTypeExtension; 
use Symfony\Component\Form\FormBuilder; 

class FieldTypeJsValidationExtension extends AbstractTypeExtension 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $attr = $builder->getAttribute('attr'); 
     $attr = array_merge(
      array(
       'data-validation-constraints' => $this->aMethodThatRenderTheFinalContentOfTheValidationAttribute(), 
      ), 
      $builder->getAttribute('attr') 
     ); 

     $builder->setAttribute('attr', $attr); 
    } 

    public function getExtendedType() 
    { 
     return 'field'; 
    } 

} 
+0

Está utilizando el método buildForm. En este punto, no tiene referencia al objeto FormInterface. Creo que necesitaré una referencia a este objeto para obtener todas las restricciones del campo de formulario actual. Pero no estoy seguro ... Mi pregunta era cómo obtener todas las restricciones de validación aplicadas a un campo de formulario fuera del objeto FormInterface – ausi

2

Comprobar la cuestión abierta correspondiente "[Form] JavaScript validation" que contiene una referencia a SimpleThingsFormExtraBundle (o más bien un PR específico, abierto de ese paquete) que lo hace.

Cuestiones relacionadas