Ver Mensaje Individual
  #5 (permalink)  
Antiguo 08/07/2013, 03:43
Fennesz
 
Fecha de Ingreso: febrero-2010
Mensajes: 36
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Problema con Formulario tipo "collection"

Pues llevas razón, si quiero seguir los fundamentos del framework, debo respetarlo todo, aunque la verdad, es que no acabo de comprender el componente de formularios. Veo que tu controlas bastante, así que voy a abusar de tu conocimiento XD. Espero que dios te lo pague con una novia muy guapa XD

Supongo que debo crear dos entidades, una CartEntity y otra CartItemEntity, pero si te digo la verdad no sé como relacionarlas, esto en Symfony, con Doctrine, si se hacerlo fácilmente.

Las entidades serían así:

Código PHP:

class CartEntity
{
    protected 
$cart;

    protected 
$items;

    public function 
getCart()
    {
        return 
$this->cart;
    }
    public function 
setCart($cart)
    {
        
$this->cart $cart;
    }

    public function 
getItems()
    {
        return 
$this->items;
    }

    public function 
setItems($items)
    {
        
$this->items $items;
    }



Código PHP:

class CartItemsEntity
{

    protected 
$id;

    protected 
$quantity;


    public function 
getId()
    {
        return 
$this->id;
    }

    public function 
setId($id)
    {
        
$this->id $id;
    }

    public function 
getQuantity()
    {
        return 
$this->quantity;
    }

    public function 
setQuantity($quantity)
    {
        
$this->quantity $quantity;
    }


Los formularios quedarían así:

Código PHP:

namespace srcForm
;

use 
SymfonyComponentValidatorConstraints as Assert;
use 
SymfonyComponentFormAbstractType;
use 
SymfonyComponentFormFormBuilderInterface;
use 
srcFormCartItemType;

class 
CartType extends AbstractType{

    public 
$cart;

    function 
__construct($cart)
    {

    
$this->cart $cart;

    }

    public function 
buildForm(FormBuilderInterface $builder, array $options){

        
$builder->add('items''collection', array( 'type'   => new CartItemType($this->cart),));

     }

    public function 
getName(){
        return 
"cartform";
    }



Código PHP:

namespace srcForm
;

use 
SymfonyComponentValidatorConstraints as Assert;
use 
SymfonyComponentFormAbstractType;
use 
SymfonyComponentFormFormBuilderInterface;

class 
CartItemType extends AbstractType{

    public 
$cart;
    public 
$id;
    public 
$cantidad;


    function 
__construct($cart)
    {

    
$this->cart $cart;

   foreach (
$this->cart as $id => $cantidad) {

    
$this->id[] = $id;
    
$this->cantidad[] = $cantidad;

    }

    }

    public function 
buildForm(FormBuilderInterface $builder, array $options){

        
$builder->add('id''hidden', array(
             
'attr' => array('value' => array_keys($this->id)),
        ));

        
$builder->add('quantity''integer', array(
             
'attr' => array('value' => array_keys($this->cantidad)),
        ));

     }


    public function 
getName(){
        return 
"cartitemform";
    }


En el controlador le paso a la entity el carrito en una sesión, y luego a su vez al form.

Código PHP:

$cart 
$app['session']->get('cart');
$cart_entity = new CartEntity();
$cart_entity->setCart($cart);

$form $app['form.factory']->create(new CartType($cart), $cart_entity); 

Código PHP:

 
{{ form_widget(form) }} 
Pero no obtengo nada, como no llego a entenderlo del todo, no sé en que estoy fallando. Si alguien puede ayudarme le estaré muy agradecido. Gracias


Cita:
Iniciado por masterpuppet Ver Mensaje
Que tal Fennesz,

El tema es que el planteo no es correcto, si te apegas a los estandares del fw todo es mas sencillo te sugiero que lo hagas de la forma correcta y tengas dos entidades con dos form types, de todas formas tal cual lo tienes estas pisando en cada iteración los elementos, debería bastar con algo asi :

Código PHP:
Ver original
  1. protected $cart;
  2.  
  3. public function __construct($cart)
  4. {
  5.     $this->cart = $cart;
  6. }
  7.  
  8. public function buildForm(FormBuilderInterface $builder, array $options)
  9. {
  10.     $builder->add('id', 'collection', array(
  11.          'type'  => 'hidden',
  12.          'data'  => array_keys($this->cart)
  13.     ));
  14.     ...
  15. }


Código TWIG:
Ver original
  1. {{ form(form) }}

Saludos.

Última edición por Fennesz; 08/07/2013 a las 03:51