Foros del Web » Programando para Internet » PHP » Symfony »

Validacion de Formularios embebidos

Estas en el tema de Validacion de Formularios embebidos en el foro de Symfony en Foros del Web. Buenos dias colegas, preguntar acerca de la validacion de formularios embebidos, por ejemplo tengo un formulario que datos personales y otro de telefonos, pero al ...
  #1 (permalink)  
Antiguo 06/10/2014, 08:55
 
Fecha de Ingreso: noviembre-2013
Mensajes: 83
Antigüedad: 11 años
Puntos: 0
Validacion de Formularios embebidos

Buenos dias colegas, preguntar acerca de la validacion de formularios embebidos, por ejemplo tengo un formulario que datos personales y otro de telefonos, pero al integrarlos, no es obligacion de que se metan telefonos y ahi es donde me da error, se queda en blanco la pantalla, pongo parte del condigo
Código PHP:
use MyBundle  Form  EmailType;

class 
MemberType extends AbstractType
{
    public function 
buildForm(FormBuilderInterface $builder, array $options)
    {
    
$builder
        
->add('member', new PersonType(), array(
            
'data_class' => 'MyBundle\Entity\Person'
        
))
        ->
add('emails''collection', array(
                
'type'           => new EmailType(),
                
'label'          => false,
                
'by_reference'   => false,
                
'allow_delete'   => true,
                
'allow_add'      => true,                            
            ))
public function 
setDefaultOptions(OptionsResolverInterface $resolver)
    {
        
$resolver->setDefaults(array(
            
'data_class' => 'MyBundle\Entity\Members',
            
'validation_groups' => array('default')
        ));
    } 
  #2 (permalink)  
Antiguo 06/10/2014, 09:48
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Validacion de Formularios embebidos

EmailType esta asociado a una entidad ???
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 06/10/2014, 10:21
 
Fecha de Ingreso: noviembre-2013
Mensajes: 83
Antigüedad: 11 años
Puntos: 0
Respuesta: Validacion de Formularios embebidos

Si esta asociado a una entidad, incluyo cada una de las entidades en la definicion del formulario, al mostrarlo en la vista si los pone, pero cuando se va a l controler donde se hara la persistencia se queda en blacno y el log no muestra nada
  #4 (permalink)  
Antiguo 06/10/2014, 10:43
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Validacion de Formularios embebidos

Eso si es muy raro. Puedes publicar el método del controlador que esta dando ese comportamiento ?
recuerda colocar la propiedad required a false en todas las formas.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 06/10/2014, 11:19
 
Fecha de Ingreso: noviembre-2013
Mensajes: 83
Antigüedad: 11 años
Puntos: 0
Respuesta: Validacion de Formularios embebidos

Código PHP:
public functionContactoAction($id)
    {
        
$em $this->getDoctrine()->getManager();        
        
$contacts = new AbcMembersContacts();
        
$form $this->createCreateForm($contacts);
        return 
$this->render('MyBundle:Member:Contacto.html.twig',
                array(
                        
'member' => $student,            
                        
'form'   => $form->createView(),                       
                    ));        
    }
private function 
createCreateForm(Members $entity)
    {
        
$form $this->createForm(new MembersType(), $entity, array(
            
'action' => $this->generateUrl('contact_create', array('id'=>$entity->getMember()->getId())),
            
'method' => 'POST',
        ));
        
$form->add('save''submit', array('label' => 'Save'));
        return 
$form;
    }
/**
     * @Route("/{id}/create", name="contact_create")
     * @Method("POST")
     * @Template("MyBundle:Member:Contacto.html.twig")
     */
    
public function createContactofStudentAction(Request $request$id)
    {
        
$em $this->getDoctrine()->getManager();                        
         
$contacts = new AbcMembersContacts();
        
$form $this->createCreateForm($contacts);
        
$form->handleRequest($request);
        ...
       
$em->persist($contacts);
       
$em->flush(); 
  #6 (permalink)  
Antiguo 06/10/2014, 11:44
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Validacion de Formularios embebidos

si hiciste un
Código PHP:
Ver original
  1. if($form->isValid())
  2. {
  3.  //mas codigo
  4. }
En el método createContactofStudent(), si no lo hiciste esa seria la razón de que tengas un comportamiento "extraño".
Del lado de las entidades recuerda hacer un valid para las propiedades member y emails.
Otro punto importante con el 'validation_groups' => array('default') asegúrate que realmente este en ese grupo lo que esperas que se valide.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #7 (permalink)  
Antiguo 06/10/2014, 12:19
 
Fecha de Ingreso: noviembre-2013
Mensajes: 83
Antigüedad: 11 años
Puntos: 0
Respuesta: Validacion de Formularios embebidos

Omiti poner eso, pero en mi codigo esta, las validation_groups, los required=true, he notado que en el formType, donde se incluye el formulario es su tercer anidamiento, ejemplo
1- el form principal es miembro persona, dentro de este incluye un formtype persoa y dentro de este un form collection de email, sera que hasta ahi se podra??
  #8 (permalink)  
Antiguo 06/10/2014, 13:29
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Validacion de Formularios embebidos

Claro que se puede hasta ese nivel. El detalle debe de ser otro. Como estas validando en las entidades los atributos member y emails de la entidad Members
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #9 (permalink)  
Antiguo 06/10/2014, 14:04
 
Fecha de Ingreso: noviembre-2013
Mensajes: 83
Antigüedad: 11 años
Puntos: 0
Respuesta: Validacion de Formularios embebidos

con grupos de validaciones, en un archivo validation.yml, no lo hago en las entidades, ahi nada mas tengo en anotaciones las relaciones y definición de los campos, si yo comento el nuevo tipo, me funciona, lo guarda, pero la cuestion es que si yo quiero agregar un correo debe de guardarlo aunque no lo ponga, mas bien creo que es porque no lo estoy validando bien o algo por el estilo
  #10 (permalink)  
Antiguo 06/10/2014, 14:21
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Validacion de Formularios embebidos

Precisamente si no requieres que se coloque el email no debes de entrada tener la propiedad 'required' = true para el EmailType() ya que esto te genera un comportamiento extraño por la anidación de formularios.
y mas si estas usando valid para esa relación.
Algo parecido se consulto: http://www.forosdelweb.com/f181/vali...fony2-1106400/
Si sigues con dudas en un rato mas que este con un poco mas de tiempo te pongo un ejemplo.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #11 (permalink)  
Antiguo 08/10/2014, 14:55
 
Fecha de Ingreso: noviembre-2013
Mensajes: 83
Antigüedad: 11 años
Puntos: 0
Respuesta: Validacion de Formularios embebidos

Este es el codigo que estoy utilizando
Código PHP:
Form1Formulario que contiene un form embebido
class AbcMembersContactsParentType extends AbstractType
{
...
->
add('contact', new AbcMemberParentNewType(), array(
            
'data_class' => 'ABC\IsystemBundle\Entity\AbcMembers'
            
))
...
$resolver->setDefaults(array(
            
'data_class' => 'ABC\IsystemBundle\Entity\AbcMembersContacts',
            
'cascade_validation' => true,
            
'validation_groups' => array('default'),
        )); 
Form2: AbcMemberParentNewType() tiene una colleccion embebida
Código PHP:
class AbcMemberParentNewType extends AbstractType
{
...
->
add('member', new AbcMemberType(), array(
            
'data_class' => 'ABC\IsystemBundle\Entity\AbcMembers'
        
))
        ->
add('emails''collection', array(
                
'required'       => false,
                
'type'           => new AbcMemberEmailType(),
                
'label'          => false,
                
'by_reference'   => false,
                
//'prototype_data' => new AbcMemberMediaCommunication(),
                
'allow_delete'   => true,
                
'allow_add'      => true,                
            ))
...
$resolver->setDefaults(array(
            
'data_class' => 'ABC\IsystemBundle\Entity\AbcMembers',
            
'cascade_validation' => true
            
//'validation_groups' => array('default'),
        
)); 
Form3: colleccion
Código PHP:
class AbcMemberEmailType extends AbstractType
{
...
->
add('media','text',array(
                                    
'label' => false,                                       
                                    
'attr'=>array(
                                                
'class'=>'form-control'
                                                

                                ))
$resolver->setDefaults(array(
            
'data_class' => 'ABC\IsystemBundle\Entity\AbcMemberMediaCommunication',
            
'validation_groups' => array('default'),
        )); 
  #12 (permalink)  
Antiguo 09/10/2014, 13:51
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 11 años, 4 meses
Puntos: 379
Respuesta: Validacion de Formularios embebidos

Primero que nada necesitas elminar de tu form el option 'cascade_validation' => true. Solo se utiliza cuando tu form no tiene el data_class con una clase valida.
Ahora para validar una relacion 1:N M:N N:1 necesitas hacerlo con la restricción Valid: http://symfony.com/doc/current/refer...nts/Valid.html revisa esa parte de la doc hay viene como debes de usarla en el formato yaml.
Lo siguiente es que puedas validar que el campo email acepte null o valide si agregas un email. Eso lo puedes hacer agregando un closure a validation_group del AbcMemberEmailType de la siguiente forma.
Código PHP:
Ver original
  1. $resolver->setDefaults(array(
  2.         'validation_groups' => function(FormInterface $form) {
  3.             $data = $form->getData();
  4.             if (null == $data->getMedia()) {
  5.                 return array('Default');
  6.             } else {
  7.                 return array('WithEmailData');
  8.             }
  9.         },
  10.     ));
En el yml para validar crea un grupo que es el que valida si hay contenido en el campo email. si no que use el Default.
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:18.