Ver Mensaje Individual
  #3 (permalink)  
Antiguo 22/09/2015, 17:42
daymerrf
 
Fecha de Ingreso: febrero-2013
Mensajes: 66
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: problema al validar un formulario embebido

@hhs: aqui te dejo las entitades y los formularios que estoy utilizando. Te los muestro solo con los atributos necesarios.
Entidades
Código PHP:
Ver original
  1. <?php
  2.  
  3. namespace AppBundle\Entity;
  4.  
  5. use Doctrine\ORM\Mapping as ORM;
  6. use Symfony\Bridge\Doctrine\Validator\Constraints as DoctrineAssert;
  7. use Symfony\Component\Validator\Constraints as Assert;
  8.  
  9. /**
  10.  * User
  11.  *
  12.  * @ORM\Table(name="user")
  13.  * @ORM\Entity(repositoryClass="AppBundle\Entity\UserRepository")
  14.  */
  15. class User
  16. {
  17.     /**
  18.      * @var integer
  19.      *
  20.      * @ORM\Column(name="id", type="integer")
  21.      * @ORM\Id
  22.      * @ORM\GeneratedValue(strategy="AUTO")
  23.      */
  24.     private $id;
  25.    
  26.     /**
  27.      * @var Phones
  28.      *
  29.      * @ORM\OneToMany(targetEntity="Phone", mappedBy="user", cascade={"persist" , "remove"})    
  30.      */
  31.     private $phones;
  32.    
  33.     /**
  34.      * Get id
  35.      *
  36.      * @return integer
  37.      */
  38.     public function getId()
  39.     {
  40.         return $this->id;
  41.     }
  42.    
  43.     /**
  44.      * Constructor
  45.      */
  46.     public function __construct()
  47.     {      
  48.         $this->phones = new \Doctrine\Common\Collections\ArrayCollection();
  49.     }
  50.  
  51.     /**
  52.      * Add phones
  53.      *
  54.      * @param \AppBundle\Entity\Phone $phones
  55.      * @return User
  56.      */
  57.     public function addPhone(\AppBundle\Entity\Phone $phone)
  58.     {        
  59.         $phone->setUser($this);
  60.         $this->phones->add($phone);    
  61.     }
  62.  
  63.     /**
  64.      * Remove phones
  65.      *
  66.      * @param \AppBundle\Entity\Phone $phones
  67.      */
  68.     public function removePhone(\AppBundle\Entity\Phone $phone)
  69.     {
  70.         $this->phones->removeElement($phone);
  71.     }
  72.  
  73.     /**
  74.      * Get phones
  75.      *
  76.      * @return \Doctrine\Common\Collections\Collection
  77.      */
  78.     public function getPhones()
  79.     {
  80.         return $this->phones;
  81.     }    
  82.    
  83.     public function setPhones(\Doctrine\Common\Collections\Collection $phones)
  84.     {
  85.         die('setPhones');
  86.         $this->phones = $phones;
  87.         foreach ($phones as $phone) {
  88.             $phone->setUser($this);
  89.         }
  90.     }
  91.        
  92. }

Código PHP:
Ver original
  1. <?php
  2.  
  3. namespace AppBundle\Entity;
  4.  
  5. use Doctrine\ORM\Mapping as ORM;
  6. use Symfony\Component\Validator\Constraints as Assert;
  7. use Symfony\Bridge\Doctrine\Validator\Constraints as DoctrineAssert;
  8.  
  9. /**
  10.  * Phone
  11.  *
  12.  * @ORM\Table()
  13.  * @ORM\Entity(repositoryClass="AppBundle\Entity\PhoneRepository")
  14.  */
  15. class Phone
  16. {
  17.     /**
  18.      * @var integer
  19.      *
  20.      * @ORM\Column(name="id", type="integer")
  21.      * @ORM\Id
  22.      * @ORM\GeneratedValue(strategy="AUTO")
  23.      */
  24.     private $id;
  25.  
  26.     /**
  27.      * @var string
  28.      *
  29.      * @ORM\Column(name="number", type="string", length=20)
  30.      * @Assert\Regex(pattern="/^\+53\ ?[0-9]{8}$/", message = "field.phone")
  31.      */
  32.     private $number;
  33.  
  34.     /**
  35.      * @var \User
  36.      *
  37.      * @ORM\ManyToOne(targetEntity="User", inversedBy="phones", cascade={"persist"})
  38.      * @ORM\JoinColumns({
  39.      *   @ORM\JoinColumn(name="user", referencedColumnName="id", onDelete="Cascade", nullable=false)
  40.      * })
  41.      */
  42.     private $user;
  43.  
  44.     /**
  45.      * Get id
  46.      *
  47.      * @return integer
  48.      */
  49.     public function getId()
  50.     {
  51.         return $this->id;
  52.     }
  53.  
  54.     /**
  55.      * Set number
  56.      *
  57.      * @param string $number
  58.      * @return Phone
  59.      */
  60.     public function setNumber($number)
  61.     {
  62.         $this->number = $number;
  63.         return $this;
  64.     }
  65.  
  66.     /**
  67.      * Get number
  68.      *
  69.      * @return string
  70.      */
  71.     public function getNumber()
  72.     {
  73.         return $this->number;
  74.     }
  75.    
  76.     /**
  77.      * Set user
  78.      *
  79.      * @param \AppBundle\Entity\User $user
  80.      * @return Phone
  81.      */
  82.     public function setUser(\AppBundle\Entity\User $user)
  83.     {
  84.         $this->user = $user;
  85.  
  86.         return $this;
  87.     }
  88.  
  89.     /**
  90.      * Get user
  91.      *
  92.      * @return \AppBundle\Entity\User
  93.      */
  94.     public function getUser()
  95.     {
  96.         return $this->user;
  97.     }
  98.    
  99.     public function __toString() {
  100.         return $this->number;
  101.     }
  102. }
Formularios
Código PHP:
Ver original
  1. <?php
  2.  
  3. namespace AppBundle\Form;
  4.  
  5. use Symfony\Component\Form\AbstractType;
  6. use Symfony\Component\Form\FormBuilderInterface;
  7. use Symfony\Component\OptionsResolver\OptionsResolverInterface;
  8. use Symfony\Component\Validator\Constraints\Regex;
  9. use Symfony\Component\Validator\Constraints\NotBlank;
  10.  
  11. class PhoneType extends AbstractType {
  12.  
  13.     /**
  14.      * @param FormBuilderInterface $builder
  15.      * @param array $options
  16.      */
  17.     public function buildForm(FormBuilderInterface $builder, array $options) {
  18.         $builder
  19.                 ->add('number', 'text', array(
  20.                     'max_length' => 15,
  21.                     'required' => false,
  22.                     'label' => null,
  23.                     'constraints' => array(
  24.                         new Regex(array(
  25.                             'pattern' => "/^\+53\ ?[0-9]{8}$/",
  26.                             'message' => 'field.phone'
  27.                                 )),
  28.                         new NotBlank()
  29.                     )
  30.                 ))
  31.         ;
  32.     }
  33.  
  34.     /**
  35.      * @param OptionsResolverInterface $resolver
  36.      */
  37.     public function setDefaultOptions(OptionsResolverInterface $resolver) {
  38.         $resolver->setDefaults(array(
  39.             'data_class' => 'AppBundle\Entity\Phone'
  40.         ));
  41.     }
  42.  
  43.     /**
  44.      * @return string
  45.      */
  46.     public function getName() {
  47.         return 'appbundle_phone';
  48.     }
  49.  
  50. }

Código PHP:
Ver original
  1. <?php
  2.  
  3. namespace AppBundle\Form;
  4.  
  5. use Symfony\Component\Form\AbstractType;
  6. use Symfony\Component\Form\FormBuilderInterface;
  7. use Symfony\Component\OptionsResolver\OptionsResolverInterface;
  8. use Symfony\Component\Validator\Constraints\NotBlank;
  9. use Symfony\Component\Validator\Constraints\Email;
  10. use Symfony\Component\Validator\Constraints\Length;
  11. use AppBundle\Form\PhoneType;
  12.  
  13. class UserType extends AbstractType {
  14.  
  15.     /**
  16.      * @param FormBuilderInterface $builder
  17.      * @param array $options
  18.      */
  19.     public function buildForm(FormBuilderInterface $builder, array $options) {
  20.         $builder                
  21.                 ->add('phones', 'collection', array(
  22.                     'label' => false,
  23.                     'type' => new PhoneType(),
  24.                     'allow_add' => true,
  25.                     'allow_delete' => true,
  26.                     'by_reference' => false,
  27.                     'cascade_validation' => true,
  28.                 ))
  29.         ;
  30.     }
  31.  
  32.     /**
  33.      * @param OptionsResolverInterface $resolver
  34.      */
  35.     public function setDefaultOptions(OptionsResolverInterface $resolver) {
  36.         $resolver->setDefaults(array(
  37.             'data_class' => 'AppBundle\Entity\User'
  38.         ));
  39.     }
  40.  
  41.     /**
  42.      * @return string
  43.      */
  44.     public function getName() {
  45.         return 'appbundle_user';
  46.     }
  47.  
  48. }