Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

[SOLUCIONADO] Sylius CartBundle Symfony2

Estas en el tema de Sylius CartBundle Symfony2 en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas, escribo por si alguien me puede echar una mano. Estoy realizando una aplicación web con symfony2 y me gustaría añadir un módulo para el ...
  #1 (permalink)  
Antiguo 03/05/2014, 04:22
 
Fecha de Ingreso: mayo-2014
Mensajes: 5
Antigüedad: 10 años, 6 meses
Puntos: 0
Sylius CartBundle Symfony2

Buenas, escribo por si alguien me puede echar una mano. Estoy realizando una aplicación web con symfony2 y me gustaría añadir un módulo para el carrito de la compra. Tras investigar por la web me decidí por sylius CartBundle, que además vi que lo recomendaban algunos usuarios de este foro. Tras la instalación mi pregunta es lo siguiente, ¿Cómo se usa? Es decir, he estado mirando la documentación oficial del bundle y viene explicado la instalación y tal pero a la hora de intentar usarlo me da un error y no sé si es que no lo estoy utilizando correctamente. Disculpad mi torpeza. Según la documentación si utilizar el enlace

<a href="{{ path('sylius_cart_item_add', {'productId': product.id}) }}">Add product to cart</a>

indicándole el id del producto lo añadirá al carrito. Sin embargo cuando yo lo hago me aparece el siguiente error:

FatalErrorException: Compile Error: Declaration of etdc\ProductoBundle\Cart\ItemResolver::resolve() must be compatible with Sylius\Bundle\CartBundle\Resolver\ItemResolverInte rface::resolve(Sylius\Bundle\CartBundle\Model\Cart ItemInterface $item, $data) in C:\xampp\htdocs\etdc\src\etdc\ProductoBundle\Cart\ ItemResolver.php line 13

Mi funcion resolve() tal y como ponía la configuración del bundle es la siguiente:

public function resolve(CartItemInterface $item, Request $request)
{
$productId = $request->query->get('productId');

// If no product id given, or product not found, we throw exception with nice message.
if (!$productId || !$product = $this->getProductRepository()->find($productId)) {
throw new ItemResolvingException('Requested product was not found');
}

// Assign the product to the item and define the unit price.
$item->setProduct($product);
$item->setUnitPrice($product->getPrice());

// Everything went fine, return the item.
return $item;
}



Espero que me puedan ayudar porque estoy desesperada y no sé que hacer.

Un saludo y gracias de antemano.
  #2 (permalink)  
Antiguo 04/05/2014, 11:36
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Sylius CartBundle Symfony2

Importaste la interface CartItemInterface ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 04/05/2014, 12:09
 
Fecha de Ingreso: mayo-2014
Mensajes: 5
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Sylius CartBundle Symfony2

Gracias por contestar!

Sí, eso es lo que no me cuadra... Pongo el código completo de mi ItemResolver por si se me pasa algo:


Código PHP:
Ver original
  1. <?php
  2.  
  3. namespace etdc\ProductoBundle\Cart;
  4.  
  5. use Sylius\Bundle\CartBundle\Model\CartItemInterface;
  6. use Sylius\Bundle\CartBundle\Resolver\ItemResolverInterface;
  7. use Sylius\Bundle\CartBundle\Resolver\ItemResolvingException;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Doctrine\ORM\EntityManager;
  10.  
  11.  
  12. class ItemResolver implements ItemResolverInterface
  13. {
  14.     private $entityManager;
  15.  
  16.     public function __construct(EntityManager $entityManager)
  17.     {
  18.         $this->entityManager = $entityManager;
  19.     }
  20.  
  21.     public function resolve(CartItemInterface $item, Request $data)
  22.     {
  23.         $productId = $data->query->get('productId');
  24.  
  25.         // If no product id given, or product not found, we throw exception with nice message.
  26.         if (!$productId || !$product = $this->getProductRepository()->find($productId)) {
  27.             throw new ItemResolvingException('Requested product was not found');
  28.         }
  29.  
  30.         // Assign the product to the item and define the unit price.
  31.         $item->setProduct($product);
  32.         $item->setUnitPrice($product->getPrice());
  33.  
  34.         // Everything went fine, return the item.
  35.         return $item;
  36.     }
  37.  
  38.     private function getProductRepository()
  39.     {
  40.         return $this->entityManager->getRepository('ProductoBundle:Producto');
  41.     }
  42. }
  #4 (permalink)  
Antiguo 04/05/2014, 12:21
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Sylius CartBundle Symfony2

El segundo parámetro es mixed y tu tienes Request o estoy viendo mal ?, no deberia ser

public function resolve(CartItemInterface $item, $data) ?
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 04/05/2014, 12:37
 
Fecha de Ingreso: mayo-2014
Mensajes: 5
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Sylius CartBundle Symfony2

Al definirla como me comentas me da el siguiente error:

ContextErrorException: Catchable Fatal Error: Argument 1 passed to etdc\ProductoBundle\Cart\ItemResolver::__construct () must be an instance of Doctrine\ORM\EntityManager, string given, called in C:\xampp\htdocs\etdc\app\cache\dev\appDevDebugProj ectContainer.php on line 383 and defined in C:\xampp\htdocs\etdc\src\etdc\ProductoBundle\Cart\ ItemResolver.php line 16


La línea 16 es la siguiente y está puesta tal cual de la documentación de sylius:

public function __construct(EntityManager $entityManager)
{
$this->entityManager = $entityManager;
}
  #6 (permalink)  
Antiguo 04/05/2014, 13:10
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Sylius CartBundle Symfony2

Tienes definido el resolver en el container ?, si es así comprueba que estés pasando correctamente el EntityManager porque según indica el error estas pasando un string
__________________
http://es.phptherightway.com/
thats us riders :)
  #7 (permalink)  
Antiguo 05/05/2014, 01:44
 
Fecha de Ingreso: mayo-2014
Mensajes: 5
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Sylius CartBundle Symfony2

Sí que lo tengo definido. En la llamada a la función estoy haciendo la prueba con la línea de código que viene en la instalación de sylius que sí que envía un string. La llamada es la siguiente:

Código HTML:
Ver original
  1. <a href="{{ path('sylius_cart_item_add', {'productId': product.id}) }}">Add product to cart</a>


Lo que no entiendo es qué llamada debería realizar entonces puesto que en teoría la del ejemplo debería funcionar.
  #8 (permalink)  
Antiguo 07/05/2014, 07:57
 
Fecha de Ingreso: mayo-2014
Mensajes: 5
Antigüedad: 10 años, 6 meses
Puntos: 0
Respuesta: Sylius CartBundle Symfony2

¡Hola! Finalmente encontré el problema. A la hora de configurar los servicios en config.yml había puesto:

Código YML:
Ver original
  1. services:
  2.     app_cart_item:
  3.         class:        etdc\ProductoBundle\Entity\CartItem
  4.         arguments:    [doctrine.orm.entity_manager]
  5.  
  6.     app_cart_item_resolver:
  7.         class:        etdc\ProductoBundle\Cart\ItemResolver
  8.         arguments:    [doctrine.orm.entity_manager]

Al modificarlo por lo siguiente funciona correctamente.

Código YML:
Ver original
  1. services:
  2.     app_cart_item:
  3.         class:        etdc\ProductoBundle\Entity\CartItem
  4.         arguments:    ['@doctrine.orm.entity_manager']
  5.  
  6.     app_cart_item_resolver:
  7.         class:        etdc\ProductoBundle\Cart\ItemResolver
  8.         arguments:    ['@doctrine.orm.entity_manager']

Espero que sirva por si a alguien le ocurre lo mismo.

Un saludo

Etiquetas: 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 08:58.