Navigation

Contactez-nous

Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81

Par Philippe Le Van (@plv) Dernière mise à jour : 21 December 2011

Du catalogue à la boutique en ligne

Introduction

Cette page indique comment transformer un catalogue (codé séparément) en boutique en ligne.

On prend l'exemple d'un site qui vendrait des rythme de batterie (tablature, vidéos,...)

Ajouter les configurations nécessaires

dans config.yml, ajouter les configurations suivantes :

  • kitpages_shop.is_cart_including_vat
    • facultatif, true par défaut
    • Ex: (true|false)
    • indique si les montants dans le catalogue et dans le panier sont TTC ou HT
  • kitpages_shop.order_display_route_name 
    • obligatoire
    • Ex: "AppSiteBundle_shop_displayOrder"
    • le nom de la route de la page qui affiche le récapitulatif de la commande
kitpages_shop:
    is_cart_including_vat: true
    order_display_route_name: 'AppSiteBundle_shop_displayOrder'

Rendre un produit achetable

Si on part d'un produit existant dans un catalogue quelconque, on modifie le produit pour qu'il implémente l'interface ProductInterface du ShopBundle.

Dans l'exemple ci-dessous, on a un objet BeatVersion (que l'on veut rendre) vendable qui est lié à un objet Beat. On accède au beat par $this->getBeat()

L'exemple suivant montre les méthodes à implémenter pour transformer un BeatVersion en produit vendable dans la boutique.

<?php

use Kitpages\ShopBundle\Model\Cart\ProductInterface;

class BeatVersion
    implements ProductInterface
{
    // [les autre fonctions]

    ////
    // shop methods
    ////
    public function getShopReference()
    {
        return "BV-".$this->getId();
    }
    public function getShopUnitPrice()
    {
        return $this->getPrice();
    }
    public function getShopWeight()
    {
        return 0;
    }
    public function getShopName()
    {
        $name = $this->getBeat()->getTitle()." ".$this->getTitle();
        return $name;
    }
    public function getShopDescription()
    {
        $desc = $this->getBeat()->getDescription()."\n\n".$this->getDescription();
        return $desc;
    }
    // unused by the basic system, but can be useful in certain cases
    public function getShopData()
    {
        return array(
            "reference"=>$this->getShopReference(),
            "name"=>$this->getShopName()
        );
    }
}

coder l'action "addToCart"

Voilà un exemple d'action addBeatToCart($beatVersionId)

<?php
// les use à ajouter
use Kitpages\ShopBundle\Entity\Order;
use Kitpages\ShopBundle\Entity\OrderHistory;
use Kitpages\ShopBundle\Entity\OrderUser;
?>
<?php
    public function addBeatToCartAction($versionId)
    {
        $em = $this->getDoctrine()->getEntityManager();
        $beatVersion = $em->getRepository("AppCatalogBundle:BeatVersion")->find($versionId);
        $cartManager = $this->get('kitpages_shop.cartManager');
        $cart = $cartManager->getCart();
        $cart->addLine($beatVersion);
        return $this->redirect($this->generateUrl("AppSiteBundle_shop_cart"));
    }

coder l'action d'affichage du panier

<?php
    public function cartAction()
    {
        return $this->render('AppSiteBundle:Shop:cart.html.twig');
    }

et la vue associée (qui fait un render d'une action du shopBundle pour afficher le panier)

{% extends '::base.html.twig' %}
{% block body %}
<h1>Cart</h1>

{% render 'KitpagesShopBundle:Cart:displayCart' with {'size':'big'} %}

{% endblock body %}

Créer la page displayOrder

Cette page sert à afficher la commande. Il faut noter quelques points importants :

  • Il faut être connecté pour consulter cette page (penser à modifier votre couche de sécurité pour garantir ça)
  • Cette page a aussi pour role de compléter les informations de la commande avec notamment le contact de facturation et le contact de livraison en cas de besoin. C'est donc dans cette action qu'on doit créer les $invoiceUser (et éventuellement $shippingUser) nécessaires à la commande.
<?php
    public function displayOrderAction($orderId)
    {
        // on vérifie que le gars est bien connecté
        if (! $this->get('security.context')->isGranted('ROLE_USER') ) {
            return new Response('The user should be authenticated on this page');
        }

        // on récupère la commande à afficher
        $em = $this->getDoctrine()->getEntityManager();
        $order = $em->getRepository("KitpagesShopBundle:Order")->find($orderId);

        // on vérifie que la commande appartient bien au gars connecté (ou qu'elle n'appartient pour l'instant à personne)
        if (
            ($order->getUsername() != null) &&
            ($order->getUsername() != $this->get('security.context')->getToken()->getUsername())
        ) {
            return new Response('You are not allowed to see this order');
        }

        // on récupère le user courant
        $currentUser = $this->get('security.context')->getToken()->getUser();

        // on crée le contact de facturation
        $invoiceUser = null;
        if ($order->getInvoiceUser() == null) {
            $invoiceUser = new OrderUser();
            $invoiceUser->setCountryCode("FR");
            $invoiceUser->setEmail($currentUser->getEmail());
            $invoiceUser->setFirstName($currentUser->getFirstName());
            $invoiceUser->setLastName($currentUser->getLastName());
            $invoiceUser->setInvoiceOrder($order);
            $invoiceUser->setUserId($currentUser->getId());
        }

        // on appelle le template d'affichage
        return $this->render(
            'AppSiteBundle:Shop:displayOrder.html.twig',
            array(
                'order' => $order,
                'invoiceUser' => $invoiceUser,
                'shippingUser' => null
            )
        );
    }

Ajouter l'action dans le routeur

AppSiteBundle_shop_displayOrder:
    pattern: /shop/display-order/{orderId}
    defaults: { _controller: AppSiteBundle:Shop:displayOrder }

Ex de vue associée

Le template twig associé appelle le shopBundle pour afficher le contenu de la commande. Il peut ressembler à ça :

displayOrder.html.twig

{% extends '::base.html.twig' %}
{% block body %}
<h1>Order</h1>

{% render 'KitpagesShopBundle:Order:displayOrder' with {
    'order': order,
    'invoiceUser': invoiceUser,
    'shippingUser': shippingUser
} %}

{% endblock body %}

Commentaires

Ajouter un commentaire
route
j'arrive pas a executer le bundle
aucune route 
toujours il m'affiche not route found
svp j'ai besoin de ce bundle
Débutante avec Symfony, j'avoue que j'ai un peu de mal à comprendre comment installer ce bundle... :( 
Il a l'air vraiment bien fait en plus.. Je suis frustrée par mon incompétence.. Ce que je ne saisis pas c'est qu'il faut avoir une entité ProduitVersion (par exemple) avec un liaison OneToOne avec Produit ? Ou bien ProduitVersion serait juste une simple classe ? Peut-on directement placer les méthodes décrites ci-dessus dans notre Entité Produit ?