Contactez-nous
Kitpages
17 rue de la Frise
38000 Grenoble
tel : 04 58 00 33 81
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
Note : on ne peut plus ajouter de commentaire sur ce site