herve

Cmder : Ajouter des alias

En remplacement de l’invite de commande windows standard, j’utilise l’excellente console alternative Cmder : http://cmder.net/

Celle-ci implémente des commandes linux indispensables qui vont vous faciliter la vie ( ls, git , ssh … )
Elle permet également de gérer des alias qui vous ferons gagner un temps précieux.
Le fonctionnement est légèrement différent d’une console linux standard, puisqu’il ne faut pas éditer le fichier .bashrc

Les modifications sont à apporter dans le dossier ou Cmder est installé, dans le fichier /config/aliases

Vous pouvez par exemple simplifier vos connexion ssh en ajoutant des alias tel que :

sshherve= ssh [email protected] -i "C:\Users\myuser\.ssh\my_key"

Cmder : Ajouter des alias Lire la suite »

Console Prestashop

Tout ceux qui travaillent sous Magento ou Symfony le save, la ligne de commande est la meilleure amie du développeur pour gagner du temps 🙂
J’utilise très régulièrement l’outil Magerun : https://github.com/netz98/n98-magerun  qui permets de réaliser pleins d’actions depuis la ligne de commande

Ce type d’outil n’existe pas (encore) sous Prestashop.
Ceci arrivera sans doute pour les prochaines versions, comme Symfony est amené à devenir le cœur de la solution :-).

En attendant voici donc un nouvel outil de console pour Prestashop.
Il est basé sur le composant console de Symfony2 et disponible sur mon compte github : https://github.com/nenes25/prestashop_console

Pour l’utiliser les prérequis sont les suivants :

  • accès ssh à votre hébergement
  • composer installé

Voici comment l’installer rapidement.

Edit : Utiliser plutôt le nouveau mode de fonctionnement : https://www.h-hennes.fr/blog/2016/09/19/prestahop-console-nouvelle-version/

Clonez le dépôt à la racine de votre site, ceci créera un dossier « PrestashopConsole »

git clone https://github.com/nenes25/prestashop_console.git PrestashopConsole

Rendez-vous dans le dossier et installer les composants avec composer

composer install

Puis vous pouvez lancer la console, et voir les commandes disponibles.…

Console Prestashop Lire la suite »

Magento : Mauvais calcul des frais de ports dans le checkout

Note : Cet article s’applique uniquement aux versions de Magento inférieures à la 1.6

Sur une version 1.5 de Magento j’ai été confronté au comportement d’erreur suivant :

Pour un panier comportant un bon de réduction.
Les frais de ports devant être offerts à partir de X euros.

  • les frais de ports n’étaient pas calculés correctement dans le checkout lors de l’affichage des méthodes de livraisons
  • Les frais de ports étaient calculés correctement dans l’estimation des frais de port du panier
  • Les frais de ports étaient correct dans le résumé de la commande.
  • Si l’adresse de livraison étaient différente de l’adresse de livraison , le calcul était correct.

Après analyse du code, il s’avère que les frais de ports ne sont pas recalculés si on conserve la même adresse de livraison.
Voici comment corriger cela.

Il faut surcharger la fonction saveBilling du fichier app/code/core/Mage/Checkout/Model/Type/Onepage.php.
Pour cela, nous pouvons au choix faire un override du modèle (meilleure solution ) ou déplacer ce fichier dans le codePool local.…

Magento : Mauvais calcul des frais de ports dans le checkout Lire la suite »

Magento : Créer un format d’adresse particulier

L’affichage des adresses dans magento est via gérée des formats configurables.
Les formats par défaut sont visibles depuis la configuration dans « système/configuration/clients/configuration/adresses/ »

Formats d'adresses

 

Cependant il est également possible de créer facilement vos propres formats d’adresses.
Pour cela il suffit de suivre les éléments suivants lors de la création de votre module.

Pour notre exemple je souhaite rajouter un format d’adresse « short ».
Dans le fichier de configuration (config.xml )de votre module rajouter le code suivant entre les balises <global> et </global>

 <!-- Nouveau format d'adresse pour le checkout -->
        <customer>
            <address>
                <formats>
                    <short> <!--Nom du format -->
                        <title>Short</title> <!-- Titre de du format -->
                    </short>
                </formats>
            </address>
        </customer>

 

Puis dans le noeud default

    <customer>
        <address_templates>
          <!--

Magento : Créer un format d’adresse particulier Lire la suite »

Magento : Ajouter un block dans une page via les observers

Voyons ensemble aujourd’hui comment ajouter un block de contenu dans une page magento via les observers.
Pour l’exemple on va se baser sur la problématique suivante :
Je souhaite afficher un message particulier sur la page du panier pour les clients qui ne sont pas connectés.
Le contenu du message doit être gérable dans le backoffice via un block cms.

En analysant la structure du fichier de layout checkout.xml pour la page panier, on constate qu’il existe un noeud de type core/text_list dans lequel nous allons inserer le contenu.

<checkout_cart_index>
...
<block type="core/text_list" name="additional.product.info" translate="label">
<label>Additional Product Info</label>
</block>
</checkout_cart_index>

Pour réaliser cela nous allons créer un module. ( je ne détaille pas la procédure ) qui va se baser sur l’événement : controller_action_layout_generate_blocks_after
via le code suivant dans le fichier config.xml

<events>
 <controller_action_layout_generate_blocks_after>
  <observers>
   <test_add_block_layout_xml>
    <class>Hhennes_Tests_Model_Observer</class>
    <method>testAddBlockToLayoutXml</method>
   </test_add_block_layout_xml>
  </observers>
 </controller_action_layout_generate_blocks_after>
</events>

Puis voici le code de l’observer :

<?php

Magento : Ajouter un block dans une page via les observers Lire la suite »

Magento : Surcharger config.xml ou system.xml

Le système d’override de Magento est très puissant et relativement facile à mettre en place pour les Blocks , Helper et modèles.

En effet ( même si ce n’est pas la méthode recommandée) , il est possible de copier le fichier à surcharger de son arborescence initiale vers le codePool local, et d’y réaliser directement les modifications.

Ex pour le module Cms :
app/code/core/Mage/Cms/Block/Page.php vers app/code/core/Mage/Cms/Block/Page.php
app/code/core/Mage/Cms/Helper/Page.php vers app/code/core/Mage/Cms/Helper/Page.php
app/code/core/Mage/Cms/Model/Page.php vers app/code/core/Mage/Cms/Model/Page.php

Cette surcharge permets également de surcharger les modules placés dans le codePool Community, car si un fichier avec la même arborescence existe dans le codePool local, c’est toujours lui qui sera utilisé.

En revanche pour surcharger un fichier config.xml ou system.xml , il va être nécessaire de créer un module.
( Je ne détaille pas la création de celui-ci )

Commençons par le fichier config.xml

Le principe de l’override est simple, nous allons créer dans le fichier config.xml

Magento : Surcharger config.xml ou system.xml Lire la suite »

Optimiser le développement de modules Prestashop : Éviter les régressions avec l’intégration continue

Cet article fait partie de la série : Optimiser le développement de modules Prestashop

  1. Mise en place de l’environnement de développement
  2. Industrialiser l’installation de Prestashop et des modules
  3. Tester fonctionnellement vos modules avec Phpunit et Selenium
  4. Éviter les régressions avec l’intégration continue

Pour finir notre série sur le développement de modules Prestashop, nous allons nous intéresser à l’intégration continue.
L’objectif de celle-ci est de nous assurer que tout fonctionne correctement lorsque nous faisons évoluer notre module. ( c’est à dire que les changements apportés n’entrainent pas l’apparition de nouveaux problèmes ou régressions )

Pour cela nous avons dans l’étape précédente écrits des tests fonctionnels qui sont chargés de vérifier que tout fonctionne correctement. Nous souhaitons donc que ces tests soient lancés automatiquement lors de la publication de chaque modifications.

Plusieurs possibilités existent pour réaliser ce suivi, mais je vais vous présenter une solution basée sur jenkins

Installation de jenkins

Pour l’installer connectez-vous à votre machine virtuelle et saissez les commandes suivantes :

wget -q -O - https://jenkins-ci.org

Optimiser le développement de modules Prestashop : Éviter les régressions avec l’intégration continue Lire la suite »

Magento : Module Dataflow avancés

Magento propose nativement des fonctionnalités d’imports / exports avancées qui ne sont pas forcément connues de tous les développeurs, ce sont les « Profils avancés » , ceux-ci sont disponible directement depuis l’administration dans le menu « Système — Importer/Exporter — Flux de données – Profils avancés »
Par défaut, aucun profil n’existe, mais ces profils vous permettent d’importer/exporter rapidement et facilement des objets magento.

J’avais déjà fait plusieurs articles sur le sujet :
Magento : Importer / Exporter les commentaires et les notes des produits via les profils avancés
Magento : Importer / Exporter les produits complémentaires ( upsell , crossell , related ) via les profils avancés

Afin de boucler la boucle, j’ai donc réalisé un module de gestion de ces profils avancés.

Celui-ci vous permets d’importer/exporter les éléments magento suivants  directement depuis l’administration.

  • Blocks cms
  • Pages cms
  • Commentaires et notes produits
  • Produits complémentaires
  • Emails transactionnels ( en base de données )

Le module est disponible sur github : https://github.com/nenes25/magento_dataflow

Magento : Module Dataflow avancés Lire la suite »

Prestashop : Mise en place de logs rapides dans un fichier

Voici un code qui vous permettra de logguer facilement et rapidement les informations souhaitées sous Prestashop dans le fichier de votre choix.

L’objectif est de pouvoir logguer les informations souhaitées en une seule ligne, sans avoir à instancier de classe de log.
(Le fonctionnement est comparable à la fonction Mage::log() de Magento )

Créer une nouvelle classe dans le dossier override/classes/CustomLogger.php

 <?php
class CustomLogger
{
 
    /** Fichier de log par défaut */
    const DEFAULT_LOG_FILE = 'system.log';
 
    /**
     * Log
     * @param string|array|object $message element à logger ( 1 type à la fois )
     * @param string $level niveau de log
     * @param string $fileName nom du fichier de log
     */
    public static function log($message, $level = 'debug', $fileName = null)
    {
 
        $fileDir = _PS_ROOT_DIR_ . '/log/';
 
        if (!$fileName)
            $fileName = self::DEFAULT_LOG_FILE;
 
        if (is_array($message) || is_object($message)) {
            $message = print_r($message, true);
        }
 
        $formatted_message = '*' .

Prestashop : Mise en place de logs rapides dans un fichier Lire la suite »

Prestashop : Imports des clients avec le webservice

Après la mise en place de la structure globale pour utiliser les webservices, nous allons à présent importer les clients.

La structure du fichier sera la suivante.

structure-csv

L’email client étant la clé unique.

Pour gérer l’import nous allons créer une classe spécifique qui va hériter de la classe HhPrestashopWebservice
Celle-ci permettra les opérations basiques : Ajouter, modifier, supprimer un utilisateur prestashop via le webservice.

Voici son code commenté :

 /**
 * Gestion webservice des clients
 *
 * @author hhennes <[email protected]>
 */
class HhCustomerWs extends HhPrestashopWebservice {
 
    protected $_resource = 'customers';
 
    /**
     * Création d'un client via le webservice
     * @param array $datas : données du client
     */
    public function createCustomer($datas) {
 
        $schema = $this->getEmptyObject();
        $customerAttributes = $schema->children()->children();
 
        //Parcours des attributs du client, si une data existe on l'associe
        foreach ($customerAttributes as $attribute => $values) {
 
            if (array_key_exists($attribute, $datas))
                $schema->children()->children()->{$attribute} = $datas[$attribute];
 
            //Si le champ est nécessaire et qu'il n'est pas associé cela ne fonctionnera pas, on envoie une exception
            if ($schema->children()->children()->{$attribute}->attributes()->required && !

Prestashop : Imports des clients avec le webservice Lire la suite »