Hola
hhs
Aqui la entidad Producto
Código PHP:
Ver original<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Producto
*
* @ORM\Table()
* @ORM\Entity
*/
class Producto
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nombre", type="string", length=255)
*/
private $nombre;
/**
* @var string
*
* @ORM\OneToMany(targetEntity="AppBundle\Entity\DetallesProducto", mappedBy="producto")
*/
private $detalles;
/**
* Constructor
*/
public function __construct()
{
$this->detalles = new \Doctrine\Common\Collections\ArrayCollection();
}
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set nombre
*
* @param string $nombre
* @return Producto
*/
public function setNombre($nombre)
{
$this->nombre = $nombre;
return $this;
}
/**
* Get nombre
*
* @return string
*/
public function getNombre()
{
return $this->nombre;
}
/**
* Set caracteristicas
*
* @param string $caracteristicas
* @return Producto
*/
public function setCaracteristicas($caracteristicas)
{
$this->caracteristicas = $caracteristicas;
return $this;
}
/**
* Get caracteristicas
*
* @return string
*/
public function getCaracteristicas()
{
return $this->caracteristicas;
}
/**
* Add detalles
*
* @param \AppBundle\Entity\DetallesProducto $detalles
* @return Producto
*/
public function addDetalle(\AppBundle\Entity\DetallesProducto $detalles)
{
$this->detalles[] = $detalles;
return $this;
}
/**
* Remove detalles
*
* @param \AppBundle\Entity\DetallesProducto $detalles
*/
public function removeDetalle(\AppBundle\Entity\DetallesProducto $detalles)
{
$this->detalles->removeElement($detalles);
}
/**
* Get detalles
*
* @return \Doctrine\Common\Collections\Collection
*/
public function getDetalles()
{
return $this->detalles;
}
}
Aqui la entidad DetallesProducto,
esta entidad tiene 22 propiedades, solo puse 5 para simplificar el codigo...
Código PHP:
Ver original<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* DetallesProducto
*
* @ORM\Table()
* @ORM\Entity
*/
class DetallesProducto
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Producto", inversedBy="detalles")
* @ORM\JoinColumn(name="producto_id", referencedColumnName="id")
*/
private $producto;
/**
* @var string
*
* @ORM\Column(name="detalle1", type="integer")
*/
private $detalle1;
/**
* @var integer
*
* @ORM\Column(name="detalle2", type="integer")
*/
private $detalle2;
/**
* @var integer
*
* @ORM\Column(name="detalle3", type="integer")
*/
private $detalle3;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set detalle1
*
* @param string $detalle1
* @return CaracteristicasProducto
*/
public function setDetalle1($detalle1)
{
$this->detalle1 = $detalle1;
return $this;
}
/**
* Get detalle1
*
* @return string
*/
public function getDetalle1()
{
return $this->detalle1;
}
/**
* Set detalle2
*
* @param integer $detalle2
* @return CaracteristicasProducto
*/
public function setDetalle2($detalle2)
{
$this->detalle2 = $detalle2;
return $this;
}
/**
* Get detalle2
*
* @return integer
*/
public function getDetalle2()
{
return $this->detalle2;
}
/**
* Set detalle3
*
* @param integer $detalle3
* @return CaracteristicasProducto
*/
public function setDetalle3($detalle3)
{
$this->detalle3 = $detalle3;
return $this;
}
/**
* Get detalle3
*
* @return integer
*/
public function getDetalle3()
{
return $this->detalle3;
}
/**
* Set producto
*
* @param \AppBundle\Entity\Producto $producto
* @return CaracteristicasProducto
*/
public function setProducto(\AppBundle\Entity\Producto $producto = null)
{
$this->producto = $producto;
return $this;
}
/**
* Get producto
*
* @return \AppBundle\Entity\Producto
*/
public function getProducto()
{
return $this->producto;
}
}
Este es el ProductoType
Código PHP:
Ver original<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class ProductoType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm
(FormBuilderInterface
$builder, array $options) {
$builder
->add('detalles', 'collection', [
'type' => new DetallesProductoType()
])
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array( 'data_class' => 'AppBundle\Entity\Producto'
));
}
/**
* @return string
*/
public function getName()
{
return 'appbundle_producto';
}
}
Este el DetallesProductoType
Código PHP:
Ver original<?php
namespace AppBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class DetallesProductoType extends AbstractType [I]se agregan todos los campos, hasta detalleN[/I]
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm
(FormBuilderInterface
$builder, array $options) {
$builder
->add('detalle1')
->add('detalle2')
->add('detalle3')
->add('detalle4')
->add('detalle5')
;
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array( 'data_class' => 'AppBundle\Entity\DetallesProducto'
));
}
/**
* @return string
*/
public function getName()
{
return 'appbundle_detallesproducto';
}
}
Hasta aquí todo bien, es decir que desde un controller puedo hacer esto:
Código PHP:
Ver original$em = $this->getDoctrine()->getManager();
$producto = $em->getRepository('AppBundle:Post')->find(1);
$form = $this->createForm(new ProductoType(), $producto);
En la plantilla:
Código HTML:
Ver original<form method="POST" role="form" {{ form_enctype(form) }}> {{ form_widget(form) }}
<button type="submit" class="btn btn-success">Guardar
</button>
Funciona perfectamente, me renderiza la entidad y sus detalles, de tal forma que puedo agregar o quitar elementos.
Voy a dejar de una lado lo que tengo y preguntar como haria lo que quiero hacer, quiza esto aclare un poco las cosas.
Lo que necesito es editar mas de un producto al mismo tiempo, es decir:
Código PHP:
Ver original$em = $this->getDoctrine()->getManager();
// Consulto los ultimos 30 productos
$productos = $em->getRepository('AppBundle:Post')->findUltimosProductos(30);
$form = $this->createForm(new ProductoType(), $productos);
Al imprimir el form en la plantilla, obtengo un error diciendo que createForm requiere una instancia de Producto, mientras que un array se paso como argumento.
La pregunta es: ¿Como puedo editar mas de una entidad al mismo tiempo?
PD: Si deseas puedo poner el codigo que utilizo para solucionar este problema, el inconveniente con esa solucion es que cuando son mas de 20 campos detalles, arroja el error de memoria.
Gracias.