Hola Amigos!
Estoy peleándome con el componente form de Symfony2 (utilizo Silex) y tras bastante Googlear y probar muchas cosas, he decidido exponer aquí mi problema, por si alguien me pudiera iluminar.
Estoy programando una web de compras, y a la hora de mostrar el carrito necesito que a cada item se le asocie un formulario en el que el cliente pueda modificar la cantidad del item comprado y eliminarlo también.
Si lo hago con php a pelo no hay problema, es un problema bastante fácil, pero con el componente de Symfony no sé que debo hacer, en principio pienso que es un formulario de tipo Collection, ya que cada uno de los items necesita su widget.
La clase que hice es la siguiente:
Código PHP:
class Quantity extends AbstractType{
public $cart;
public $id = array();
public $cantidad = array();
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', 'collection', array(
'type' => 'hidden', 'options' => array(
'attr' => array('value' => (string)$this->id),
)));
$builder->add('quantity', 'collection', array(
'type' => 'integer', 'options' => array(
'attr' => array('value' => (int)$this->cantidad),
)));
$builder->add('delete', 'collection', array(
'type' => 'integer', 'options' => array(
'attr' => array('value' => 0),
)));
}
public function getName(){
return "quantityform";
}
}
Como veis le paso en el constructor un array que es el carrito, recuperado de la sesión, con los items y la cantidad de cada item, para poder pintarlos correctamente en la plantilla.
En el controlador tengo esto:
Código PHP:
$cart = $app['session']->get('cart');
$quantityForm = $app['form.factory']->create(new Quantity($cart));
Y en la plantilla twig tengo lo siguiente:
Código PHP:
{% for producto in cesta.productos %}
{{ form_widget(quantityForm.id) }}
{{ form_widget(quantityForm.quantity) }}
{{ form_widget(quantityForm.delete) }}
{{ form_rest(quantityForm) }}
{% endfor %}
Desgraciadamente solo se muestra el primer item, los demás ya no aparecen. Si alguien tiene alguna idea se lo agradecería enormemente. Un saludo!