Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Formularios embebidos relacionados Collection type symfony 3.1

10 de marzo de 2017

Estoy realizando una aplicacion que crea encuestas, Tengo una entidad y formulario de "Preguntas" donde el usuario las va agregando y tambien puede agregar opciones por medio de un formulario y entidad embebidos "Opciones" estas entidades estan relacionados con OnetoMany.

Mi problema es que quiero que el id de la Pregunta se guarde de forma automatica en cada opcion que valla agregando el usuario.

espero me puedan explicar como puedo solucionarlo gracias.

Entidad de Preguntas

<?php
 
namespace UserBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;
use Symfony\Component\Validator\Constraints as Assert;
/**
 * EncPregunta
 *
 * @ORM\Table(name="enc_pregunta")
 * @ORM\HasLifecycleCallbacks()
 * @ORM\Entity
 */
class EncPregunta
{
    /**
     * @ORM\OneToMany(targetEntity="EncOpcionrespuesta", mappedBy="idPregunta",cascade={"persist"})
     */
    protected $opciones;
 
    /**
     * @ORM\ManyToOne(targetEntity="EncEncuesta",inversedBy="usuarios")
     * @ORM\JoinColumn(name="id_Encuesta", referencedColumnName="id")
     */
    protected $idEncuesta;
 
    /**
     * @ORM\ManyToOne(targetEntity="EncTipopregunta",inversedBy="tipo")
     * @ORM\JoinColumn(name="id_tipo_pregunta", referencedColumnName="id")
     */
    protected $idTipoPregunta;
 
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;
 
    /**
     * @var string
     *
     * @ORM\Column(name="tit_pregunta", type="string", length=250, nullable=false)
     */
    private $titPregunta;
 
    /**
     * @var string
     *
     * @ORM\Column(name="text_ayuda", type="text", length=65535, nullable=false)
     */
    private $textAyuda;
 
    /**
     * @var string
     *
     * @ORM\Column(name="es_obligatoria", type="string", length=1, nullable=true)
     */
    private $esObligatoria;
 
    public function __construct()
    {
        $this->usuarios = new ArrayCollection();
        $this->opciones= new ArrayCollection();
    }
 
    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }
 
    /**
     * Set titPregunta
     *
     * @param string $titPregunta
     *
     * @return EncPregunta
     */
    public function setTitPregunta($titPregunta)
    {
        $this->titPregunta = $titPregunta;
 
        return $this;
    }
 
    /**
     * Get titPregunta
     *
     * @return string
     */
    public function getTitPregunta()
    {
        return $this->titPregunta;
    }
 
    /**
     * Set textAyuda
     *
     * @param string $textAyuda
     *
     * @return EncPregunta
     */
    public function setTextAyuda($textAyuda)
    {
        $this->textAyuda = $textAyuda;
 
        return $this;
    }
 
    /**
     * Get textAyuda
     *
     * @return string
     */
    public function getTextAyuda()
    {
        return $this->textAyuda;
    }
 
    /**
     * Set esObligatoria
     *
     * @param string $esObligatoria
     *
     * @return EncPregunta
     */
    public function setEsObligatoria($esObligatoria)
    {
        $this->esObligatoria = $esObligatoria;
 
        return $this;
    }
 
    /**
     * Get esObligatoria
     *
     * @return string
     */
    public function getEsObligatoria()
    {
        return $this->esObligatoria;
    }
 
    /**
     * Set idEncuesta
     *
     * @param \UserBundle\Entity\EncEncuesta $idEncuesta
     *
     * @return EncPregunta
     */
    public function setIdEncuesta(\UserBundle\Entity\EncEncuesta $idEncuesta = null)
    {
        $this->idEncuesta = $idEncuesta;
 
        return $this;
    }
 
    /**
     * Get idEncuesta
     *
     * @return \UserBundle\Entity\EncEncuesta
     */
    public function getIdEncuesta()
    {
        return $this->idEncuesta;
    }
 
    /**
     * Set idTipoPregunta
     *
     * @param \UserBundle\Entity\EncTipopregunta $idTipoPregunta
     *
     * @return EncPregunta
     */
    public function setIdTipoPregunta(\UserBundle\Entity\EncTipopregunta $idTipoPregunta = null)
    {
        $this->idTipoPregunta = $idTipoPregunta;
 
        return $this;
    }
 
    /**
     * Get idTipoPregunta
     *
     * @return \UserBundle\Entity\EncTipopregunta
     */
    public function getIdTipoPregunta()
    {
        return $this->idTipoPregunta;
    }
    public function __toString()
    {
        return $this->getTitPregunta();
 
    }
 
    /**
     * Add opcione
     *
     * @param \UserBundle\Entity\EncOpcionrespuesta $opcione
     *
     * @return EncPregunta
     */
    public function addOpcione(\UserBundle\Entity\EncOpcionrespuesta $opcione)
    {
 
        $this->opciones[] = $opcione;
 
        return $this;
    }
 
    /**
     * Remove opcione
     *
     * @param \UserBundle\Entity\EncOpcionrespuesta $opcione
     */
    public function removeOpcione(\UserBundle\Entity\EncOpcionrespuesta $opcione)
    {
        $this->opciones->removeElement($opcione);
    }
 
    /**
     * Get opciones
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getOpciones()
    {
 
        return $this->opciones;
    }
 
}

Entidad de Opciones de pregunta

<?php
 
namespace UserBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * EncOpcionrespuesta
 *
 * @ORM\Table(name="enc_opcionrespuesta")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks()
 */
class EncOpcionrespuesta
{
 
    /**
     * @ORM\ManyToOne(targetEntity="EncPregunta",inversedBy="opciones")
     * @ORM\JoinColumn(name="id_Pregunta", referencedColumnName="id")
     */
    protected $idPregunta;
 
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;
 
    /**
     * @var string
     *
     * @ORM\Column(name="descripcion", type="text", length=65535, nullable=true)
     */
    private $descripcion;
 
    /**
     * @var string
     *
     * @ORM\Column(name="filacolumna", type="string", length=45, nullable=false)
     */
    private $filacolumna;
 
    /**
     * @var integer
     *
     * @ORM\Column(name="ordenfila", type="integer", nullable=false)
     */
    private $ordenfila;
 
    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }
 
    /**
     * Set descripcion
     *
     * @param string $descripcion
     *
     * @return EncOpcionrespuesta
     */
    public function setDescripcion($descripcion)
    {
        $this->descripcion = $descripcion;
 
        return $this;
    }
 
    /**
     * Get descripcion
     *
     * @return string
     */
    public function getDescripcion()
    {
        return $this->descripcion;
    }
 
    /**
     * Set filacolumna
     *
     * @param string $filacolumna
     *
     * @return EncOpcionrespuesta
     */
    public function setFilacolumna($filacolumna)
    {
        $this->filacolumna = $filacolumna;
 
        return $this;
    }
 
    /**
     * Get filacolumna
     *
     * @return string
     */
    public function getFilacolumna()
    {
        return $this->filacolumna;
    }
 
    /**
     * Set ordenfila
     *
     * @param integer $ordenfila
     *
     * @return EncOpcionrespuesta
     */
    public function setOrdenfila($ordenfila)
    {
        $this->ordenfila = $ordenfila;
 
        return $this;
    }
 
    /**
     * Get ordenfila
     *
     * @return integer
     */
    public function getOrdenfila()
    {
        return $this->ordenfila;
    }
 
    /**
     * Set idPregunta
     *
     * @param \UserBundle\Entity\EncPregunta $idPregunta
     *
     * @return EncOpcionrespuesta
     */
    public function setIdPregunta(\UserBundle\Entity\EncPregunta $idPregunta = null)
    {
        $this->idPregunta = $idPregunta;
 
        return $this;
    }
 
    /**
     * Get idPregunta
     *
     * @return \UserBundle\Entity\EncPregunta
     */
    public function getIdPregunta()
    {
        return $this->idPregunta;
    }
 
}

Formulario de Pregunta

<?php
 
namespace UserBundle\Form;
 
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use UserBundle\Form\Listener\AddOpcionesFieldSubscriber;
 
class EncPreguntaType extends AbstractType
{
 
    private $tokenStorage;
 
    public function __construct(TokenStorageInterface $tokenStorage)
    {
        $this->tokenStorage = $tokenStorage;
    }
 
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $ids = $this->tokenStorage->getToken()->getUser();
        if (!$ids) {
            throw new \LogicException(
                'Usuario no autenticado!'
            );
        }
        $builder
            ->add('titPregunta',TextType::class)
            ->add('textAyuda',TextareaType::class)
            ->add('esObligatoria',CheckboxType::class,array(
                'required' => false,
            ))
            ->add('idTipoPregunta',EntityType::class,array(
                'placeholder'=>'Seleccionar',
                'class'=>'UserBundle:EncTipopregunta',
                'query_builder'=>function(EntityRepository $er){
                    return $er->createQueryBuilder('u')
                        ->orderBy('u.id','ASC');
                },
                'choice_label'=>'nomTipo',
            ))
            ->add('idEncuesta',EntityType::class,array(
                'placeholder'=>'Seleccionar',
                'class'=>'UserBundle:EncEncuesta',
                'query_builder'=>function(EntityRepository $er)use($ids){
                    return $er->createQueryBuilder('u')
                        ->where('u.idUser = :ids')
                        ->setParameter('ids', $ids)
                        ->orderBy('u.titEncuesta','ASC');
                },
                'choice_label'=>'titEncuesta',
            ))
           ->add('opciones',CollectionType::class,array(
                'entry_type'=>EncOpcionrespuestaType::class,
                'allow_add'    => true,
            ))
            ->add('save',SubmitType::class,array('label'=>'Guardar'))
 
        ;
 
        //$builder->addEventSubscriber(new AddOpcionesFieldSubscriber($builder->getFormFactory()));
 
    }
 
    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'UserBundle\Entity\EncPregunta',
 
        ));
    }
 
}

Formulario de Opciones de pregunta

<?php
 
namespace UserBundle\Form;
 
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
 
class EncOpcionrespuestaType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     *
     *
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('idPregunta',HiddenType ::class)
            ->add('descripcion',TextareaType::class)
            ->add('filacolumna',IntegerType::class)
            ->add('ordenfila',IntegerType::class)
        ;
    }
 
    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'UserBundle\Entity\EncOpcionrespuesta'
        ));
    }
}