herve

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.…

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

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 du statut global du dépôt en excluant un dossier en particulier ( themes et modules dans l’exemple )

git status .

Commandes console git utiles Lire la suite »

Prestashop : Utilisation avancée des AdminController

Cet article fait partie d’une série d’articles qui présentent les fonctionnalités avancées disponibles dans un controller d’administration Prestashop. ( adminController )
Les exemples sont réalisés dans le cadre d’un module mais s’appliquent également à tous les anciens controllers de l’administration qui n’utilisent pas encore l’infrastructure symfony
Vous pouvez-consulter les autres articles de la série :

Cet article présente les modifications « générales » qui peuvent être réalisées dans un controller d’administration.

Les points suivants seront traité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

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 .

Prestashop : Utilisation avancée des AdminController Lire la suite »

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]'

Prestashop : Passer des commandes via l’api Lire la suite »

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 )…

Quelques optimisations sur le blog Lire la suite »

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 d’autres articles pour voir les fonctionnalités avancées 😉
Vous pouvez consulter l’ensemble des informations sur cette page  : 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…

Prestashop : créer un admin controller pour un module Lire la suite »

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.…

Magento 2 : Ajouter une colonne dans la facture pdf Lire la suite »

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.…

Utiliser plusieurs version mysql avec docker Lire la suite »

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 …

Magento 2 : Ajouter des link alternate sur les pages cms Lire la suite »

Magento : Liste des ressources utilisables dans system.xml

Un petit article rapide d’aide mémoire pour la gestion des fichiers system.xml dans magento 1 .
Ces fichiers peuvent utiliser souvent les éléments suivants :

 Source Model

Il doivent être utilisés pour des champs de types « select » ou « multiselect »

Ex :

<demo_field_source translate="label">
    <label>Demo Field source model</label>
    <frontend_type>select</frontend_type>
    <!-- Définition de la source -->
    <source_model>adminhtml/system_config_source_yesno</source_model>
    <!-- Fin Définition de la source -->
    <sort_order>1</sort_order>
    <show_in_default>1</show_in_default>
    <show_in_website>1</show_in_website>
    <show_in_store>1</show_in_store>
</demo_field_source>

Les plus utiles à retenir sont les suivants :

  • adminhtml/system_config_source_yesno ( Oui / Non )
  • adminhtml/system_config_source_country (Liste des pays )
  • adminhtml/system_config_source_cms_page ( Liste des pages cms )
  • adminhtml/system_config_source_email_template ( Listes des emails transactionnels )

Liste complète :

adminhtml/system_config_source_yesno
adminhtml/system_config_source_admin_page
adminhtml/system_config_source_catalog_gridPerPage
adminhtml/system_config_source_catalog_listMode
adminhtml/system_config_source_catalog_listPerPage
adminhtml/system_config_source_catalog_listSort
adminhtml/system_config_source_catalog_search_type
adminhtml/system_config_source_catalog_timeFormat
adminhtml/system_config_source_checktype
adminhtml/system_config_source_cms_page
adminhtml/system_config_source_cms_wysiwyg_enabled
adminhtml/system_config_source_country
adminhtml/system_config_source_cron_frequency
adminhtml/system_config_source_currency
adminhtml/system_config_source_currency_service
adminhtml/system_config_source_customer_address_type
adminhtml/system_config_source_customer_forgotpassword
adminhtml/system_config_source_customer_group
adminhtml/system_config_source_design_robots
adminhtml/system_config_source_email_identity
adminhtml/system_config_source_email_method
adminhtml/system_config_source_email_smtpauth
adminhtml/system_config_source_email_template
adminhtml/system_config_source_enabledisable
adminhtml/system_config_source_frequency
adminhtml/system_config_source_locale
adminhtml/system_config_source_locale_currency_all
adminhtml/system_config_source_locale_timezone
adminhtml/system_config_source_locale_weekdaycodes
adminhtml/system_config_source_locale_weekdaycodes
adminhtml/system_config_source_locale_weekdays
adminhtml/system_config_source_nooptreq
adminhtml/system_config_source_notification_frequency
adminhtml/system_config_source_order_status_new
adminhtml/system_config_source_order_status_newprocessing
adminhtml/system_config_source_order_status_processing
adminhtml/system_config_source_payment_allspecificcountries
adminhtml/system_config_source_payment_cctype
adminhtml/system_config_source_price_scope
adminhtml/system_config_source_price_step
adminhtml/system_config_source_product_thumbnail
adminhtml/system_config_source_reports_scope
adminhtml/system_config_source_security_domainpolicy
adminhtml/system_config_source_shipping_allspecificcountries
adminhtml/system_config_source_shipping_flatrate
adminhtml/system_config_source_shipping_tablerate
adminhtml/system_config_source_shipping_taxclass
adminhtml/system_config_source_storage_media_database
adminhtml/system_config_source_storage_media_storage
adminhtml/system_config_source_store
adminhtml/system_config_source_tax_apply_on
adminhtml/system_config_source_tax_basedon
adminhtml/system_config_source_watermark_position
adminhtml/system_config_source_web_redirect
adminhtml/system_config_source_yesno
adminhtml/system_config_source_yesnocustom
backup/config_source_type
captcha/config_font
captcha/config_form_backend
captcha/config_form_frontend
captcha/config_mode
catalog/product_attribute_source_msrp_type
cataloginventory/source_backorders
checkout/config_source_cart_summary
configurableswatches/system_config_source_catalog_product_configattribute
configurableswatches/system_config_source_catalog_product_configattribute_select
customer/config_share
downloadable/system_config_source_contentdisposition
downloadable/system_config_source_orderitemstatus
googleanalytics/system_config_source_type
googlebase/source_accounttype
googlebase/source_country
log/adminhtml_system_config_source_loglevel
pagecache/system_config_source_controls
paygate/authorizenet_source_cctype
paygate/authorizenet_source_cctype
paygate/authorizenet_source_paymentAction
payment/source_invoice
paypal/config::getApiAuthenticationMethods
paypal/config::getExpressCheckoutBASignupOptions
paypal/config::getExpressCheckoutButtonFlavors
paypal/config::getExpressCheckoutSolutionTypes
paypal/config::getPayflowproCcTypesAsOptionArray
paypal/config::getWppCcTypesAsOptionArray
paypal/config::getWppPeCcTypesAsOptionArray
paypal/system_config_source_bmlPosition::getBmlPositionsCCP
paypal/system_config_source_bmlPosition::getBmlPositionsCheckout
paypal/system_config_source_bmlPosition::getBmlPositionsCPP
paypal/system_config_source_bmlPosition::getBmlPositionsHP
paypal/system_config_source_bmlSize::getBmlSizeCCPC
paypal/system_config_source_bmlSize::getBmlSizeCCPS
paypal/system_config_source_bmlSize::getBmlSizeCheckoutC
paypal/system_config_source_bmlSize::getBmlSizeCheckoutN
paypal/system_config_source_bmlSize::getBmlSizeCPPC
paypal/system_config_source_bmlSize::getBmlSizeCPPN
paypal/system_config_source_bmlSize::getBmlSizeHPH
paypal/system_config_source_bmlSize::getBmlSizeHPS
paypal/system_config_source_buyerCountry
paypal/system_config_source_fetchingSchedule
paypal/system_config_source_logo
paypal/system_config_source_merchantCountry
paypal/system_config_source_paymentActions
paypal/system_config_source_paymentActions_express
paypal/system_config_source_requireBillingAddress
paypal/system_config_source_urlMethod
paypal/system_config_source_yesnoShortcut
salesrule/system_config_source_coupon_format
shipping/source_handlingAction
shipping/source_handlingType
tax/system_config_source_algorithm
tax/system_config_source_apply
tax/system_config_source_priceType
tax/system_config_source_tax_country
tax/system_config_source_tax_display_type
tax/system_config_source_tax_region
usa/shipping_carrier_abstract_source_mode
usa/shipping_carrier_abstract_source_requesttype
usa/shipping_carrier_dhl_international_source_contenttype
usa/shipping_carrier_dhl_international_source_method_doc
usa/shipping_carrier_dhl_international_source_method_freedoc
usa/shipping_carrier_dhl_international_source_method_freenondoc
usa/shipping_carrier_dhl_international_source_method_nondoc
usa/shipping_carrier_dhl_international_source_method_size
usa/shipping_carrier_dhl_international_source_method_unitofmeasure
usa/shipping_carrier_dhl_source_dutypaymenttype
usa/shipping_carrier_dhl_source_freemethod
usa/shipping_carrier_dhl_source_method
usa/shipping_carrier_dhl_source_protection_rounding
usa/shipping_carrier_dhl_source_protection_value
usa/shipping_carrier_dhl_source_shipmenttype
usa/shipping_carrier_fedex_source_dropoff
usa/shipping_carrier_fedex_source_freemethod
usa/shipping_carrier_fedex_source_method
usa/shipping_carrier_fedex_source_packaging
usa/shipping_carrier_fedex_source_unitofmeasure
usa/shipping_carrier_ups_source_container
usa/shipping_carrier_ups_source_destType
usa/shipping_carrier_ups_source_freemethod
usa/shipping_carrier_ups_source_method
usa/shipping_carrier_ups_source_originShipment
usa/shipping_carrier_ups_source_pickup
usa/shipping_carrier_ups_source_type
usa/shipping_carrier_ups_source_unitofmeasure
usa/shipping_carrier_usps_source_container
usa/shipping_carrier_usps_source_freemethod
usa/shipping_carrier_usps_source_machinable
usa/shipping_carrier_usps_source_method
usa/shipping_carrier_usps_source_size
weee/config_source_display
weee/config_source_fpt_tax
wishlist/config_source_summary

 

 Frontend Model :

Le frontend model est un block de template magento  et  qui permets de gérer un affichage particulier pour l’élément de configuration.…

Magento : Liste des ressources utilisables dans system.xml Lire la suite »