Prestashop : Simplification de la mise en page des emails

Les emails dans Prestashop ne permettent aucune factorisation, chaque email comprends son code html complet, lorsque vous souhaitez modifier du contenu dans l’entête ou dans le pied de page d’un email il est nécessaire de réaliser la modification sur l’ensemble des emails du site.

Ce n’est pas très pratique et cela peut être source de perte de temps.
Nous allons voir dans cet article qu’il existe des solutions natives et rapides pour optimiser ce point.
Via des créations de modules comme souvent 🙂
Nous allons créer dans cet article un module hhmail dont vous retrouverez le code complet en fin d’article

Principe Technique et prérequis

Lors de l’envoi d’un email de nombreux événements sont exécutés dans la fonction Mail::send,  mais ceux qui nous intéressent sont les suivants :

  • actionEmailAddBeforeContent : exécuté avant la récupération du template de l’email
  • actionEmailAddAfterContent : exécuté après la récupération du template de l’email

Grâces à ces hooks nous pouvons donc injecter du contenu avant et après le contenu de l’email, il est donc aisé de gérer un header et un footer commun pour l’ensemble des emails 🙂

Pour éviter d’ajouter ces contenus sur des emails qui le contiennent déjà, il faudra restreindre la liste des templates sur lesquels ces contenus s’ajouteront, dans cette version je part du principe que seuls les emails surchargés dans le thème seront impactés.

Lire la suite...
Pas de commentaires

Prestashop : Générer des modules via la console.

Note : Cette fonctionnalité n’est pas disponible via la console native de Prestashop ( disponible à partir de prestashop 1.7 ) mais sur mon outil de console externe : prestashopConsole ( cf. https://github.com/nenes25/prestashop_console )

J’ai dernièrement du créer de nombreux modules sous Prestashop et le fait de les copier / coller des différents modules à chaque fois m’a fait perdre pas mal de temps.
Et je ne connais pas forcément par coeur l’ensemble des syntaxes nécessaires.
Pour optimiser tout cela j’ai donc cherché un moyen de créer facilement et rapidement des modules.
Il existe déjà la possibilité de créer un module via le générateur de module de Prestashop ( disponible ici ) , en revanche cela ne correspondait pas vraiment à mon besoin.
Le plus simple est donc de le gérer via la ligne de commandes, j’ai donc implémenté des nouvelles commandes dans la console de prestashop pour gérer cela.

Voyons ensemble comment créer facilement et rapidement un module via cet outil.…

Lire la suite...
1 commentaire

Commandes console git utiles

Dans le développement git est un outil très puissant et très pratique que j’utilise au quotidien.
Majoritairement via son intégration dans PhpStorm ( très intuitive )

Mais dans certains cas il est  nécessaire d’utiliser la ligne de commande
Voici donc une petite liste de commandes git utiles en fonction des situations

Configuration générale

Définir/modifier l’user et l’email du dépôt courant

git config user.name "Your username"
git config user.email "[email protected]"

 

Création d’un projet

Initialisation d’un projet local (dans le dossier courant )

git init .

Initialisation d’un projet distant ( dans le dossier courant )

git clone https://yourrepositoryurl.com/repo.git .

 

Gestion des fichiers

Ajout de modification

git add path

Annuler les modifications sur un fichier ou un dossier

git checkout -- path

 

Suivre l’état de mon dépôt local

Visualisation du statut global du dépôt

git status

Visualisation des fichiers modifiés

git ls-files -m

Visualisation des fichiers supprimés

git ls-files -d

Valider mes modifications

git commit -m "message de commit"

Voir la liste des modifications apportées

git log

Voir la liste des modifications apportées (version simplifiée)

git log --oneline

 

Mettre à jour mon dépôt local

Lister les dépots distants

git remote -v

Associer la branche locale à une branche distante

git branch --set-upstream-to=orignin/branchName

Récupération des informations distantes

git pull origin branchName

Réinitialisation de la branche locale comme la branche distante ( attention efface tout l’historique local )

git reset --hard origin/branchName

 

Gestion des branches

Création d’une branche

git checkout -b branchName

Changement de branche

git checkout branchName

Fusioner une branche dans la branche courante

git merge branchName

Lister les branches du dépot

git branch -a

Supprimer une branche du dépôt local ( si déjà mergée ou poussée )

git branch -d branchName

Supprimer une branche du dépôt local (peu importe son statut )

git branch -D branchName

Supprimer une branche du dépôt distant

git push origin --delete branchName
Lire la suite...
Pas de commentaires

Prestashop : Utilisation avancée des AdminController

Cet article est la suite est de celui qui présente le fonctionnement de base et qui est consultable ici : https://www.h-hennes.fr/blog/2018/11/15/prestashop-admincontroller-pour-un-module/
Il présente les fonctionnalités avancées disponibles dans un adminController réalisé dans le cadre d’un module et il aura vocation a être modifié ou complété au fur et à mesure.
Voici le détails des points qui seront évoqués :

Général :

  • Gestion de la toolbar
    • Changement du titre
    • Ajout d’un bouton d’action
  • Ajouter une action
  • Validation spécifique
  • Gestion d’images
  • Appels Ajax
  • Surcharger le template

Listing :

  • Champs active / non active
  • Ajouter un callback sur un champ
  • Ajouter des actions de masse personnalisée
  • Récupérer les données de plusieurs tables

Formulaire :

  • Lier des champs en ajax
  • Afficher des contenus totalement personnalisé

Options :

  • Ensemble des cas d’affichage d’options
  • Traitement spécifique d’une option

Général :

Gestion de la toolbar :

Ajouter un titre sur la page

Ce point est géré par la fonction initToolbarTitle

    /**
     * Affichage d'un titre personnalisé
     */
    public function initToolbarTitle()
    {
        parent::initToolbarTitle();
 
        switch ($this->display) {
            case '':
            case 'list': //Titre pour le listing
                array_pop($this->toolbar_title);
                $this->toolbar_title[] = $this->module->l('Custom Title for listing');
                break;
            case 'add': //Titre pour l'ajout et l'édition d'un objet
            case 'edit':
                array_pop($this->toolbar_title);
                if (($sample = $this->loadObject(true)) && Validate::isLoadedObject($sample)) {
                    $this->toolbar_title[] = sprintf($this->module->l('Editing sample %s'),$sample->name);
                } else {
                    $this->toolbar_title[] = $this->module->l('Creating a new sample');
                }
                break;
        }
    }

Title controller

Ajouter un bouton d’action :
Cet élément est géré par la fonction initPageHeaderToolbar

public function initPageHeaderToolbar()
    {
 
        //Bouton d'ajout ( standard )
        $this->page_header_toolbar_btn['new'] = array(
            'href' => self::$currentIndex .
Lire la suite...
5 commentaires

Prestashop : Passer des commandes via l’api

J’ai récemment du faire des tests de commandes via les Api de Prestashop et je n’ai pas trouvé de script tout fait qui le permettait.
Celui-ci utilise la librairie fournie par Prestashop et disponible sur github : https://github.com/PrestaShop/PrestaShop-webservice-lib/blob/master/PSWebServiceLibrary.php

En voici donc un basique qui va effectuer les actions suivantes :

  • Récupération de l’identifiant client ( création du client si nécessaire )
  • Récupération de l’identifiant de l’adresse du client ( création si nécessaire )
  • Création d’un panier
  • Passage de la commande

Ce script a été exécuté avec succès sur la version 1.7.3.3 de Prestashop et doit donc être compatible avec les versions suivantes.
Je n’ai pas constaté de changement fondamentaux dans l’api par rapport à Prestashop 1.6, pour lequel il devrait également fonctionner ( en changeant les produits )

N’hésitez pas à partager vos retours d’expériences sur l’utilisation de l’api de Prestashop

 
require_once('./PSWebServiceLibrary.php');
 
try {
 
    $host = 'https://yourshop.com';
    $apiKey = 'APIKEY';
 
    $webService = new PrestaShopWebservice($host, $apiKey, false);
 
    /**
     * On stocke ici les variables communes aux commandes créés via l'api
     */
 
      $customerEmail = '[email protected]'; //Email du client ( A dynamiser dans le cadre d'une utilisation complète )
      $carrierName = 'My carrier'; //Nom du transporteur dans prestashop ( utilisé pour récupérer son identifiant )
      $paymentLabel = 'Paiement par chèque'; // Nom du mode de paiement
      $paymentCode = 'ps_checkpayment'; //Module de paiement utilisé
 
    /**
     * Liste des produits qu'on souhaite ajouter au panier
     */
    $products = [
        [
            'reference' => 'demo_12',
            'qty' => 3,
        ],
        [
            'reference' => 'demo_19',
            'qty' => 1,
        ],
        [
            'reference' => 'demo_6',
            'qty' => 2,
            'combination' => [
                'reference' => 'demo_6'
            ]
        ],
    ];
 
    //Paramètres du client
    $customerDatas = [
        'firstname' => 'herve',
        'lastname' => 'test',
        'email' => '[email protected]',
        'passwd' => 'mypassword',
        'note' => 'Customer created with api',
    ];
 
    //Paramètres de l'adresse
    $addressDatas = [
        'alias' => 'addresse api',
        'id_customer' => $customerId,
        'firstname' => 'herve',
        'lastname' => 'test',
        'address1' => 'rue des tests',
        'address2' => 'encore rue des tests',
        'postcode' => '67000',
        'city' => 'strasbourg',
        'phone' => '063656565',
        'id_country' => 8,
    ];
 
 
    //On regarde si le client existe
    $searchCustomerXml = $webService->get([
        'resource' => 'customers',
        'filter' => ['email' => $customerEmail],
    ]);
 
    //Si il existe on récupère l'identifiant
    if (!
Lire la suite...
2 commentaires

Quelques optimisations sur le blog

Pour améliorer la lisibilité des articles et l’accès aux informations je viens de mettre en place quelques optimisations sur le blog

Affichage d’extraits d’articles sur la page d’index du blog :

Avec les derniers gros articles l’affichage complet du contenu des articles sur l’index du blog entraînait un gros scroll et un temps de chargement pas toujours très optimisé.
J’ai donc mis en place un affichage uniquement des extraits sur cette page.

Affichage des versions de Prestashop compatibles avec l’article

Avec les années je commence à avoir beaucoup d’articles sur Prestashop
Et certains articles ne sont plus forcément d’actualité ou compatibles avec les dernières versions de la solution.
Afin de repérer facilement cette information j’ai donc rajouté en bloc en haut d’article qui précise les versions avec lesquelles il est compatible.

Blog versions prestashop

J’ai fait une repasse sur une l’ensemble des articles pour mettre à jour ce tag mais n’hésitez pas à me faire vos retours en cas d’erreurs manifestes.
Ce système de tag sera certainement repris sur les autres catégories d’articles ( Magento et Mantis Bug tracker notamment )…

Lire la suite...
Pas de commentaires

Prestashop : créer un admin controller pour un module

Nous allons voir les différentes étapes pour réaliser facilement un controller admin basique lié à un module Prestashop.
Puis nous verrons ensuite les caractéristiques de base d’un controller admin, cet article sera complété par un autre pour voir les fonctionnalités avancées 😉
Cet article est disponible ici : https://www.h-hennes.fr/blog/2019/01/30/prestashop-utilisation-avancee-admincontroller/

Note : A partir de la version 1.7.5 de Prestashop il est possible d’utiliser d’utiliser le framework symfony et de suivre le même fonctionnement que les nouveaux controller admin de prestashop, je ferais sans doute un article ultérieurement.
Ce tutoriel reste tout de même valide sur cette version et les suivantes pour l’instant.

Pour cela nous allons créer un module « samplemodule ».
Le code complet est visible sur github : https://github.com/nenes25/prestashop_samplemodule/tree/admin

Les prérequis suivants sont nécessaires pour réaliser un controller admin pour votre module :

  • Création d’une « Tab »
  • Utilisation d’un objet Prestashop héritant de la classe ObjectModel ( et de la base de données qui lui est associée )

Pour l’objet Prestashop nous partirons sur un objet fictif « Sample » avec les propriétés suivantes :

  • name : nom de l’objet
  • code : code de l’objet
  • email : email de l’objet
  • title : titre de l’objet ( différent en fonction de la langue )
  • description : description de l’objet ( différent en fonction de la langue )

Le code suivant sera dans le fichier classes/Sample.php du module

class Sample extends ObjectModel
{
 
    public $id;
    public $name;
    public $code;
    public $email;
    public $title;
    public $description;
 
    public static $definition = [
        'table' => 'hh_sample',
        'primary' => 'id_sample',
        'multilang' => true,
        'fields' => [
            // Champs Standards
            'name' => ['type' => self::TYPE_STRING, 'validate' => 'isName', 'size' => 255, 'required' => true],
            'code' => ['type' => self::TYPE_STRING, 'validate' => 'isLinkRewrite', 'size' => 255, 'required' => true],
            'email' => ['type' => self::TYPE_STRING, 'validate' => 'isEmail', 'size' => 255, 'required' => true],
            //Champs langue
            'title' => ['type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml', 'size' => 255,],
            'description' => ['type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml',],
        ],
    ];
}

 

Pour la création de la tab et de la base de donnée c’est le module qui se charge de gérer tout cela lors de son installation.…

Lire la suite...
5 commentaires

Magento 2 : Ajouter une colonne dans la facture pdf

Voyons ensemble comment ajouter une colonne dans la facture sous Magento 2.
Nous souhaitons ajouter une colonne « Tax Rate » qui affichera le taux de taxe appliqué à chaque élément de la facture.

Le rendu final sera le suivant :

Invoice Magento 2

Pour faire cela nous allons créer un module Hhennes_Sales
( je ne détaille pas le processus de création basique du module )

Celui-ci devra surcharger les classes suivantes :

  • Magento\Sales\Model\Order\Pdf\Invoice
  • Magento\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice

Pour cela il faudra mettre le contenu suivant dans le fichier etc/di.xml du module :

   <?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Sales\Model\Order\Pdf\Invoice"
                type="Hhennes\Sales\Model\Sales\Order\Pdf\Invoice"></preference>
    <preference for="Magento\Sales\Model\Order\Pdf\Items\Invoice\DefaultInvoice"
                type="Hhennes\Sales\Model\Sales\Order\Pdf\Items\Invoice\DefaultInvoice"></preference>
</config>

Concernant les surcharges :

La notion importante est la valeur de « feed » , qui correspond à la position en x du contenu dans le pdf
Pour obtenir un ensemble visuellement harmonieux, il peut être nécessaire de jouer avec ces valeurs pour l’ensemble des éléments.…

Lire la suite...
5 commentaires

Utiliser plusieurs version mysql avec docker

J’ai récemment souhaité tester un module sur d’anciennes version de prestashop, mais celle-ci ne fonctionnaient pas correctement avec mysql 5.7 qui est installé par défaut sur mon serveur de développement ( basé sur ubuntu 16.04 )

Ce service devant tourner de manière ponctuelle, l’installer en doublon de la version 5.6 n’était pas une option.
La solution la plus simple est donc d’utiliser docker, nous allons voir comment avoir un autre serveur de base de données avec la version 5.6 en quelques minutes 🙂

Installation de docker

Pour cela je vous envoie vers la documentation officielle qui explique tout très bien : https://docs.docker.com/install/linux/docker-ce/ubuntu/#extra-steps-for-aufs

Installer docker-compose

sudo apt-get install docker-compose

Création du fichier docker-compose

Pour le ranger j’ai  créer un dossier /mysql56 dans mon dossier home

mkdir ~/mysql56

Dans lequel on va créer un dossier /data qui contiendra le contenu des bases de données du container.
Ceci permettra de persister les données en éteignant le container.…

Lire la suite...
Pas de commentaires

Magento 2 : Ajouter des link alternate sur les pages cms

Sur magento 2 ( comme sur magento 1 ) , les contenus et notamment les pages cms sont accessibles via plusieurs url avec ou sans slash à la fin.

Vous pouvez le constater sur la page de la politique de confidentialité qui est à la fois disponible sous les urls :
http://magento2-demo.nexcess.net/privacy-policy-cookie-restriction-mode et http://magento2-demo.nexcess.net/privacy-policy-cookie-restriction-mode/

Au niveau Seo c’est assez moyen c’est pourquoi il est utile de préciser à Google quelle est la version à indexer.
Ceci peut être réalisé via l’ajout d’une balise link rel= »canonical ».

Nous allons voir ensemble comment réaliser cela pour magento 2 via un module qui s’appellera Hhennes/Cms
Ce module ajoutera automatiquement une balise canonical sur les pages cms, il est possible de configurer en back office quelle sera l’url à utiliser ( avec ou sans le slash )

Ce module sera dépendant du module Magento_Cms.

Je vais juste détailler le fonctionnement global, vous trouverez le lien vers github en fin d’article pour le télécharger. (sans la partie création initiale )

La logique est relativement simple , nous allons rajouter un block spécifique sur les pages cms dans le container « head.additional »
Pour cela il faut créer le fichier ( dans app/Code/Hennes/Cms ) view/frontend/layout/cms_page_view.xml ( il sera évalué uniquement lors de l’affichage d’une page cms ) avec le contenu suivant :

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceContainer name="head.additional">
            <block class="Hhennes\Cms\Block\Page\Canonical" name="cms_page.canonical"/>
        </referenceContainer>
    </body>
</page>

 

Le contenu du block qui sera situé dans Block/Page/Canonical.php sera le suivant (version simplifiée ) :

<?php
 
namespace Hhennes\Cms\Block\Page;
 
use \Magento\Framework\View\Element\AbstractBlock;
 
class Canonical extends AbstractBlock
{
 
    /** @var \Magento\Cms\Model\Page */
    protected $_page;
 
    /** @var \Hhennes\Cms\Helper\Data */
    protected $_helper;
 
    /**
     * Canonical constructor.
Lire la suite...
Pas de commentaires
Compte Github