Le blog de Laurent Clouet

Extension Magento : Baobaz Automatic Orders Cancel

Baobaz - Automatic Orders CancelNous sommes fiers de vous annoncer la publication de Baobaz Automatic Orders Cancel sur Magento Connect. Il s'agit de la première extension Baobaz publiée sur Magento Connect.

Le but de cette extension est d'annuler automatiquement les vieilles commandes non payées. Il est possible de paramétrer dans le back office les statuts d'annulation ainsi que le délai avant l'annulation d'une commande.

Pour plus de détails rendez vous sur la page de l'extension : http://www.magentocommerce.com/extension/3156

Https + cache Magento + Internet Explorer = Pas d'images

Magento propose nativement un système de cache avancé afin d'afficher le contenu des templates plus rapidement. La configuration par défaut de ce cache peut cependant poser problème dans certaines situations.

Récemment, nous avons eu le problème de certaines images qui ne s'affichait pas dans le menu du haut lorsque nous passions d'une page http à une page https et ce uniquement sur Internet Explorer. Les images dans ce menu restait en effet avec une url non sécurisé (http). Celà ne plait pas trop à Internet Explorer qui par défaut n'affiche pas le contenu non sécurisé sur une page sécurisé. On a en effet le message suivant lorsque certaines images ont une adresse http alors que la page est en https:

Internet Explorer Security Warning

Le block affichant le menu avec les catégories était mis en cache et son cache n'était pas regénéré si l'on passait d'une page http à une page https. Ce qui explique pourquoi les images restaient avec une adresse http sur un page https.

Pour corriger cela, il faut réécrire la méthode getCacheKey de la classe Mage_Catalog_Block_Navigation. Il faut en effet inclure dans la clé du cache un paramètre indiquant si l'url est en https ou en http. Le cache sera alors différent pour ces 2 types de pages. Ce paramètre est ajouté avec la méthode getSkinUrl

Le code par défaut de getCacheKey

public function getCacheKey()
{
    return 'CATALOG_NAVIGATION_' . Mage::app()->getStore()->getId()
        . '_' . Mage::getDesign()->getPackageName()
        . '_' . Mage::getDesign()->getTheme('template')
        . '_' . Mage::getSingleton('customer/session')->getCustomerGroupId()
        . '_' . md5($this->getTemplate() . $this->getCurrenCategoryKey());
}

est donc remplacé par le code suivant

public function getCacheKey()
{
    return 'CATALOG_NAVIGATION_' . Mage::app()->getStore()->getId()
        . '_' . Mage::getDesign()->getPackageName()
        . '_' . Mage::getDesign()->getTheme('template')
        . '_' . Mage::getSingleton('customer/session')->getCustomerGroupId()
        . '_' . md5($this->getTemplate() . $this->getCurrenCategoryKey())
        . '_' . md5($this->getSkinUrl()); /*** FIX IN THIS LINE ***/
}

Et voilà, vous pouvez désormais utiliser sereinement https sur Internet Explorer

Pour plus d'infos concernant la gestion des caches sous Magento vous pouvez consulter cet article.

Bargento 4 annoncé

Bargento

Bargento 4 a été annoncé. L'évènement se déroulera le lundi 22 mars 2010 lundi 24 mai 2010 vendredi 28 mai 2010 (le 24 était un jour férié) à Paris.

Le programme et le lieu du Bargento seront dévoilés prochainement.

L'annonce officielle sur le site bargento.fr

Bargento 4 se déroulera finalement le 24/05/2010

Module Magento: Créer son propre controller

Respect my authoritahMagento profite largement du modèle MVC. Cela lui permet ainsi de définir ses modèles, vues (layout + templates) et ses controllers. Malgré le grand nombre de modules Magento disponibles par défaut dans Magento et sur Magento Connect vous pouvez être amené à vouloir créer le votre et y définir votre propre controller pour votre site Magento. Pas de problème, nous allons voir comment créer son propre controller et comment faire en sorte qu'il fasse respecter son autorité aux layouts et templates.

Dans cet exemple, nous allons voir comment créer un controller dont l'intérêt sera de retourner le résultat d'une multiplication de deux entiers (pratique si on ne retrouve plus sa calculatrice). Les entiers à multiplier seront fournis grâce à un formulaire. Le résultat sera affiché dans une notification Magento.

Avant de commencer à créer votre extension, veuillez vous assurer que votre cache est désactivé afin de pouvoir constater immédiatement les modifications apportées.

Création du module

Notre extension s'appellera arithmetic. On crée tout d'abord les dossiers pour cette extension.

$ mkdir -p app/code/local/Baobaz/Arithmetic/controllers
$ mkdir -p app/code/local/Baobaz/Arithmetic/etc

On crée le fichier app/code/local/Baobaz/Arithmetic/etc/config.xml, afin de déclarer cette extension

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <baobaz_arithmetic>
            <version>0.0.1</version>
        </baobaz_arithmetic>
    </modules>
</config>

Plus un fichier app/etc/modules/Baobaz_Arithmetic.xml afin de l'activer:

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Baobaz_Arithmetic>
            <active>true</active>
            <codePool>local</codePool>
        </Baobaz_Arithmetic>
    </modules>
</config>

N'hésitez pas à consulter le post de Wojtek "Tutoriel - Développer un module pour Magento - Où commencer ? [Partie 1]" pour plus de détails concernant la création d'un nouveau module.

Création d'un controller

Il faut maintenant créer un fichier app/code/local/Baobaz/Arithmetic/controllers/IntegerController.php et y déclarer une méthode qui sera utilisée pour la multiplication.

Les fichiers des controllers doivent toujours être de la forme xxxxxController.php (xxxxx va être utilisé ensuite dans l'url pour appeler ce controller) et être mis dans le dossier controllers.
Les noms des méthodes des controllers doivent avoir un nom de la forme yyyyyAction (yyyyy sera aussi utilisé dans l'url pour appeler ce controller). Notre fichier contient donc pour le moment

class Baobaz_Arithmetic_IntegerController extends Mage_Core_Controller_Front_Action
{
    public function multiplyAction(){
    }
}

Il faut déclarer que des controllers sont disponibles avec le module Arithmetic. On ajoute pour cela dans le fichier app/code/local/Baobaz/Arithmetic/etc/config.xml

<config>
    ...
    <frontend>
        <routers>
            <arithmetic>
                <use>standard</use>
                <args>
                    <module>Baobaz_Arithmetic</module>
                    <frontName>arithmetic</frontName>
                </args>
            </arithmetic>
        </routers>  
    </frontend>
</config>

Voyons comment fonctionne cette déclaration de route vers le controller :

  • <frontend> indique que cette route sera utilsée pour la partie front du site
  • <routers> est l'endroit où l'on déclare les routes
  • <arithmetic> est l'identifiant de cette route
  • <use>standard</use> peut prendre les valeurs standard (pour la partie front office) ou admin (pour la partie admin)
  • <module>Baobaz_Arithmetic</module> indique dans quel module se trouve le controller pour gérer cette route
  • <frontName>arithmetic</frontName> indique le nom de la route dans l'url

On peut désormais modifier la méthode multiplyAction afin qu'elle affiche un message:

public function multiplyAction(){
    echo "Respect my authoritah";
}

En appelant l'url http://monsitemagento/arithmetic/integer/multiply le message "Respect my authoritah" s'affiche. Décortiquons un peu cette url :

  • arithmetic indique que le controller se trouve dans l'estension Baobaz_Arithmetic
  • integer indique qu'il faut regarder le fichier controllers/integerController.php
  • multiply indique qu'il faut choisir la méthode multiplyAction dans ce fichier

Afficher une template

On définit le fichier de layout à utiliser en le déclarant dans l'extension

<config>
    ...
    <frontend>
        ...
        <layout>
            <updates>
                <arithmetic>
                    <file>arithmetic.xml</file>
                </arithmetic>
            </updates>
        </layout>
    </frontend>
</config>

On crée le fichier app/design/frontend/default/default/layout/arithmetic.xml afin d'y déclarer les blocs que l'on va utiliser pour le controller que l'on vient de créer.

<?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
    <arithmetic_integer_multiply>
        <reference name="root">
            <action method="setTemplate">
                <template>page/1column.phtml</template>
            </action>
        </reference>
        <reference name="content">
            <block type="core/template" name="arithmetic_integer_multiply" template="arithmetic/integer/multiply.phtml"></block>
        </reference>
    </arithmetic_integer_multiply>
</layout>

La template principale utilisée par arithmetic/integer/multiply est page/1column.phtml. Pour la partie "content" de cette template on affiche juste le bloc arithmetic_integer_multiply. Ce bloc ne nécessite pas de traitement particulier. On le déclare donc du type core/template qui est le type par défaut. Le fichier de template utilisé sera arithmetic/integer/multiply.phtml.

Notre template est défini, il faut donc créer le fichier app/design/frontend/default/default/template/arithmetic/integer/multiply.phtml qui sera vide pour le moment.

Pour faire en sorte que le layout s'affiche correctement, il faut le charger dans le controller

public function multiplyAction(){
    $this->loadLayout();
    $this->renderLayout();
}

Interaction entre le template et le controller

Notre template Magento est simplement constitué d'un formulaire qui doit fournir les deux entiers à multiplier

<form action="<?php echo Mage::getUrl('arithmetic/integer/multiply') ?>" method="post">
    <fieldset>
        <ul>
            <li>
                <label for="int1">Integer 1</label>
                <input type="text" id="int1" name="int1" />
            </li>
            <li>
                <label for="int2">Integer 2</label>
                <input type="text" id="int2" name="int2" />
            </li>
            <li><input type="submit" value="Multiply" /></li>
        </ul>
    </fieldset>
</form>

L'url appelée par le formulaire est toujours arithmetic/integer/multiply. On doit donc désormais modifier l'action du controller pour prendre en compte le formulaire et retourner le résultat.

public function multiplyAction(){
    if ($this->getRequest()->isPost()){
        $int1 = $this->getRequest()->getPost('int1');
        $int2 = $this->getRequest()->getPost('int2');
        $result = $int1 * $int2;
    Mage::getSingleton('customer/session')->addSuccess("$int1 * $int2 = $result");
    }
    $this->loadLayout();
    $this->_initLayoutMessages('customer/session');
    $this->renderLayout();
}

Pour savoir si le controller est appelé après utilisation du formulaire on utilise :

$this->getRequest()->isPost()

Le résultat est placé dans la session 'customer/session'. Pour pouvoir afficher ces message dans les templates pensez bien à charger la template des messages dans la méthode multiplyAction avec

$this->_initLayoutMessages('customer/session');

Rajouter dans votre template la ligne

echo $this->getMessagesBlock()->getGroupedHtml();

à l'endroit où vous désirez afficher ces messages.

Et voilà, nous avons désormais un tout nouveau controller qui nous affiche le résultat d'une multiplication. Elle est pas belle la vie ?

L'ensemble des fichiers utilisés pour ce tuto sont disponible dans l'archive baobaz_arithmetic.tar.gz

Ce post est inpiré du post d'Alan Storm Magento Front Controller. Pensez à visiter son blog très instructif.

Les commandes Magento : états et statuts

Les commandes sous Magento possèdent différents états afin de suivre leur processus (facturée, expédiée, remboursée...) au sein du Workflow de commandes. Ces états sont invisibles dans le back office de Magento. En effet ce que l'on peut voir sont les statuts des commandes et non pas leurs états.

Chaque état peut avoir un ou plusieurs statuts alors qu'un statut ne peut avoir qu'un seul état. Par défaut, le statut porte généralement le même nom que l'état, ce qui peut porter à confusion. Voici la liste des états et statuts disponibles par défaut.

Code état Nom état Code statut Nom statut
new New pending Pending
pending_payment Pending Payment pending_paypal
pending_amazon_asp
Pending PayPal
Pending Amazon Simple Pay
processing Processing processing Processing
complete Complete complete Complete
closed Closed closed Closed
canceled Canceled canceled Canceled
holded On Hold holded On Hold

Pour ajouter un nouveau statut à un état, il suffit de le déclarer dans un fichier config.xml

<config>
  ...
  <global>
    <sales>
      <order>
        <!-- Statuses declaration -->
        <statuses>
          <my_processing_status translate="label"><label>My Processing Status</label></my_status>
        </statuses>
        <!-- Linking Status to a state -->
        <states>
          <processing>
            <statuses>
              <my_processing_status/>
            </statuses>
          </processing>
        </states>
      </order>
    </sales>  
  </global>
</config>

Lorsque l'on modifie le statut d'une commande dans le code, on doit être sûr que l'état actuel accepte ce statut. Pour celà, on peut modifier en même temps l'état et le statut avec la méthode setState

$order = Mage::getModel('sales/order')->loadByIncrementId('100000001');
$state = 'processing';
$status = 'my_processing_status';
$comment = 'Changing state to Processing and status to My Processing Status';
$isCustomerNotified = false;
$order->setState($state, $status, $comment, $isCustomerNotified);
$order->save();

$statut peut aussi prendre la valeur false, afin de modifier uniquement l'état de la commande, ou true afin de modifier le statut en prenant le premier statut associé à l'état.

Vous pouvez donc désormais ajuster votre processus de gestion des commandes dans Magento.

Edit du 03/12/09 : Un post intéressant concernant le workflow des statuts de commandes a été publié sur Le blog des équipes... : Workflow des statuts de commande sur Magento.

Magento 1.3.2.4 : Pensez à mettre à jour votre installation de Magento

Comme tout logiciel informatique, la solution e-Commerce Magento n'est pas exempte de failles. Celles-ci sont rapidement remontées par la communauté et corrigées par l'éditeur, Varien.

Ainsi, mercredi 23 Septembre, la version 1.3.2.4 de Magento est sortie. Il est fortement conseillé de mettre à jour son installation de Magento car cette version corrige une faille XSS au niveau du formulaire d'enregistrement d'un nouveau client.

Voici les différents moyens mis à notre disposition pour mettre à jour Magento :

  1. Mise à jour avec les fichiers diff

    À chaque mise à jour de version, Magento fournit un fichier .diff téléchargeable à cette adresse : http://www.magentocommerce.com/download/diff. Tout ce que l'on doit faire alors c'est télécharger ce fichier .diff dans le dossier principal de notre installation Magento et taper la commande

    patch -p0 < 1.3.2.3-1.3.2.4.diff

  2. Mise à jour avec Magento Connect Manager

    Dans la partie admin de votre site, allez dans System > Magento Connect > Magento Connect Manager. Mettez à jour alors le module Mage_Core_Modules. Si ce module n'est pas installé, la clé pour l'installer est magento-core/Mage_Core_Modules.

Plus d'infos :

Extension Magento SPPLUS : bug de calcul de clé HMAC

La solution e-commerce Magento permet d'intégrer de nombreuses interfaces de paiement via le système de module magento.

Parmi celles-ci, l'extension SPPLUS permet de mettre en place le module de paiement SP PLUS de la Caisse d'Épargne. Cette extension est disponible via Magento Connect.

Cependant, cette extension présente un bug fort contraignant. En effet toutes les commandes dont l'email du client contient le caractère _ ne sont pas traitées. Cela provient d'un mauvais calcul de la clé HMAC.

Pour info, la clé HMAC est un code d'authentification envoyée par SPPLUS. Pour calculer cette clé et ensuite pouvoir la comparer avec la clé reçue, on utilise la fonction nthmac présente dans la librairie spplus.so fournie par SP PLUS. Le calcul de cette clé se fait avec plusieurs paramêtres dont entre autre l'email du client. Cependant pour bien pouvoir utiliser cette fonction, il faut échapper les caractères spéciaux tels que _.

Pour corriger ce bug il faut donc modifier la méthode ipnPostSubmit du fichier app/code/community/Mage/Spplus/Model/Method/Spplus.php. Il faut remplacer les lignes :

$chaineParam = str_replace(":", "&#x3A;", $chaineParam);
$chaineParam = str_replace("/", "&#x2F;", $chaineParam);
$chaineParam = str_replace("_", "&#x5F;", $chaineParam);
$chaineParam = str_replace("@", "&#x40;", $chaineParam);

Par

$chaineParam = str_replace(":", "%3A", $chaineParam);
$chaineParam = str_replace("/", "%2F", $chaineParam);
$chaineParam = str_replace("_", "%5F", $chaineParam);
$chaineParam = str_replace("@", "%40", $chaineParam);

Ce bug a été reporté sur le forum de l'extension et devrait très probablement corrigé dans sa version 1.1.5