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

Formulario para manejar dos entidades

Estas en el tema de Formulario para manejar dos entidades en el foro de Symfony en Foros del Web. Hola buenas! Soy nuevo en Symfony y necesito saber como crear un formulario para manejar dos entidades. Por un lado tengo la entidad Cliente, con ...
  #1 (permalink)  
Antiguo 08/04/2016, 03:57
 
Fecha de Ingreso: abril-2016
Mensajes: 3
Antigüedad: 8 años
Puntos: 0
Formulario para manejar dos entidades

Hola buenas! Soy nuevo en Symfony y necesito saber como crear un formulario para manejar dos entidades.

Por un lado tengo la entidad Cliente, con los campos IDCliente, Nombre, Web, etc
Por otro lado tengo la entidad Contacto, con los campos IDCliente(Cliente al que pertenece el contacto), nombre(Que no necesariamente tiene que ser el mismo que el Nombre de cliente, sino de la persona de contacto del cliente), apellidos etc.

No se como crear un formulario, que tenga los campos de ambas entidades y que no sea cada uno por separado que es como lo tengo:
Form/Contactotype.php
Código:
<?php

namespace GeneralBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ContactoType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('idcliente', 'hidden')
            ->add('principal', 'hidden')
            ->add('nombre', 'text')
            ->add('Guardar','submit')
        ;
    }
    
    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'GeneralBundle\Entity\Contacto'
        ));
    }
}
Form/Clientetype.php
Código:
<?php

namespace GeneralBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ClienteType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('idcliente', 'hidden')
            ->add('nombreempresa', 'text')
            ->add('Guardar','submit')
        ;
    }
    
    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'GeneralBundle\Entity\Cliente'
        ));
    }
}
Muchas gracias y espero haberme explicado bien! Espero que hallan tenido también la misma tesitura y lo hallan solucionado rápidamente.
  #2 (permalink)  
Antiguo 08/04/2016, 09:32
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Formulario para manejar dos entidades

Pregunta de manual; revisa los formularios embebidos
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #3 (permalink)  
Antiguo 11/04/2016, 02:29
 
Fecha de Ingreso: abril-2016
Mensajes: 3
Antigüedad: 8 años
Puntos: 0
Respuesta: Formulario para manejar dos entidades

Muchisimas gracias hhs!
He leído un poco el tema de embeber formularios pero no me queda nada claro como hacerlo!
La idea que tengo es que en el formulario crees el nuevo cliente de tal tipo:

Que el formulario tenga los siguientes campos:
Campos de la entidad Cliente:
  • Nombre del cliente
  • ID del cliente: Valor introducido automáticamente.
Campos de la entidad Contacto
  • ID del cliente: Campo que coja el valor introducido en la entidad Cliente
  • Nombre del contacto: Campo que si no se introduce, coja el valor del nombre del cliente

Hasta ahí todo claro, pero entonces tengo dudas para crear el nuevo formulario y proceder al guardado de información.

En el controlador crearías la llamada al nuevo formulario

CONTROLADOR PRINCIPAL
Código:
class MainController extends Controller
{
    public function inicioAction(Request $request)
    {
		$em = $this->getDoctrine()->getManager();
		$p = new Contacto();
		$form = $this->createform(new ClienteType(),$p);
y es aquí donde haces la llamada a un nuevo form? o como lo harías?

No me queda nada claro el manual! Muchas gracias!
  #4 (permalink)  
Antiguo 11/04/2016, 09:17
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Formulario para manejar dos entidades

Si tienes todo bien solo tienes que crear una instancia de Contacto y Cliente
Código PHP:
Ver original
  1. $em = $this->getDoctrine()->getManager();
  2.  
  3. $cliente = new Cliente();
  4. $contacto = new Contacto();
  5. $cliente->setContacto(Contacto);
  6.  
  7. $form = $this->createform(new ClienteType(),$cliente);
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.
  #5 (permalink)  
Antiguo 11/04/2016, 13:52
 
Fecha de Ingreso: abril-2016
Mensajes: 3
Antigüedad: 8 años
Puntos: 0
Respuesta: Formulario para manejar dos entidades

Si hasta hay todo bien!
Pero el problema es creas un nuevo formulario o como lo haces?
Mi idea del tema sería algo así?

Entidad Cliente
Código:
class Cliente
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var int
     *
     * @ORM\Column(name="idcliente", type="integer")
     */
    private $idcliente;

    /**
     * @var string
     *
     * @ORM\Column(name="nombre", type="string", length=100)
     */
    private $nombre;

     /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set idcliente
     *
     * @param integer $idcliente
     *
     * @return Cliente
     */
    public function setIdcliente($idcliente)
    {
        $this->idcliente = $idcliente;

        return $this;
    }

    /**
     * Get idcliente
     *
     * @return int
     */
    public function getIdcliente()
    {
        return $this->idcliente;
    }

    /**
     * Set nombre
     *
     * @param string $nombre
     *
     * @return Cliente
     */
    public function setNombre($nombre)
    {
        $this->nombre = $nombre;

        return $this;
    }

    /**
     * Get nombre
     *
     * @return string
     */
    public function getNombre()
    {
        return $this->nombre;
    }
}
Entidad Contacto
Código:
class Contacto
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var int
     *
     * @ORM\Column(name="idcliente", type="integer")
     */
    private $idcliente;

    /**
     * @var string
     *
     * @ORM\Column(name="nombre", type="string", length=50)
     */
    private $nombre;

    /**
     * Get id
     *
     * @return int
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set idcliente
     *
     * @param integer $idcliente
     *
     * @return Contacto
     */
    public function setIdcliente($idcliente)
    {
        $this->idcliente = $idcliente;

        return $this;
    }

    /**
     * Get idcliente
     *
     * @return int
     */
    public function getIdcliente()
    {
        return $this->idcliente;
    }

    /**
     * Set nombre
     *
     * @param string $nombre
     *
     * @return Contacto
     */
    public function setNombre($nombre)
    {
        $this->nombre = $nombre;

        return $this;
    }

    /**
     * Get nombre
     *
     * @return string
     */
    public function getNombre()
    {
        return $this->nombre;
    }

}
Formulario Nuevo
Código:
namespace GeneralBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

class NuevoFormType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('idcliente', 'hidden')
            ->add('nombre', 'text')
            ->add('nombrecontacto', 'text')
            ->add('Guardar','submit')
        ;
    }
    
    /**
     * @param OptionsResolver $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'GeneralBundle\Entity\Contacto'
        ));
    }
}
CONTROLLER
Código:
public function inicioAction(Request $request)
{
	$em = $this->getDoctrine()->getManager();

	$cliente = new Cliente();
	$contacto = new Contacto();
	$form = $this->createform(new NuevoFormType(),$cliente);
}
Twig
Código:
{{ form_start(form) }}
<p>Nombre del Cliente: {{ form_widget(form.nombre) }}</p>
<p>Nombre del Contacto: {{ form_widget(form.nombrecontacto) }}</p>
{{ form_widget(form.Guardar) }}
{{ form_end(form) }}
El problema y hay la duda, es como estableces el Form para relacionar las 2 entidades, y a la vez, a través del controlador guarde los nombres(Entidad Cliente y Contacto) y el ID de cliente, que también se guardará en Contacto, como IDCliente.

Última edición por manupucelano; 11/04/2016 a las 13:58
  #6 (permalink)  
Antiguo 14/04/2016, 10:38
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 9 meses
Puntos: 379
Respuesta: Formulario para manejar dos entidades

Tienes que relacionar tus Entidades, mira como hacerlo en el manual de Doctrine: http://docs.doctrine-project.org/pro...n-mapping.html
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.

Etiquetas: doctrine, php, symfony2
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 18:47.