Posts Tagged ‘magento’

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 
class Hhennes_Tests_Model_Observer  {
  
  /**
   * Ajout d'un contenu dynamique dans le layout
   */
  public function testAddBlockToLayoutXml($observer) {
   
    $action = $observer->getAction();
    $layout = $observer->getLayout();
    
    //Sur la page du panier : On ajoute le texte d'un block cms
    if ( $action->getRequest()->getOriginalPathInfo() == '/checkout/cart/') {
 
      $additionnalBlock = $layout->getBlock('additional.product.info'); //Récupération du block parent auquel on veut ajouter le contenu
      $cmsBlock = $layout->createBlock('cms/block','test_block')->setBlockId('dresses-skirts'); //Création du block cms dans le layout
      $additionnalBlock->append($cmsBlock,'test_add_cms_block'); //Ajout du nouveau block au block parent
      
    }
    
  }
  
}

Avec ce principe il est ainsi possible d’ajouter facilement du contenu sur n’importe laquelle de vos pages, de manière programmable.…

Pas de commentaires

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 de notre module le même chemin xml que celui que nous souhaitons overrider.…

Pas de commentaires

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
Pour ceux qui souhaitent étendre les possibilités du module, nous allons voir rapidement comment celui-ci fonctionne.…

Pas de commentaires

Magento : Ajouter des filtres dans la grid des produits d’une catégorie

J’ai récemment fait face aux limites de la gestion des produits des catégories dans l’administration de Magento.

En effet, dans l’onglet « Produits de la catégories » l’ensemble des produits associés sont listés, et il n’est pas possible de filtrer ceux qui ne sont pas visibles en front office ( Produits désactivés, produits non visibles individuellement, ou uniquement dans la recherche )

Pour optimiser cela, nous allons donc rajouter les possibilités suivantes à la grid :

  • Filtrer par status ( Actif / Non actif )
  • Filtrer par visibilité ( Non visible individuellement, Catalogue … )

Pour faire cela nous allons réaliser un nouveau module.
Je ne détaille pas la création du module ni tout ce qui est générique car cet exemple est le même que pour le cas suivant : https://www.h-hennes.fr/blog/2015/06/29/magento-ajouter-un-attribut-personnalise-a-la-grid-des-produits-via-les-observers/

Le module qui réalise les 2 actions  est disponible sur github : https://github.com/nenes25/magento_productGridFilter)

Il serait possible de surcharger directement la grid Mage_Adminhtml_Block_Catalog_Category_Tab_Product  pour faire cela, mais magento permets de le faire plus proprement via des Observers.…

Pas de commentaires

Magento : Envoyer un email de confirmation au client qui utilise le formulaire de contact

Voici un petit article qui vous permettra d’ajouter simplement une fonctionnalité toute bête mais qui peut être très pratique.
L’envoi d’un message de confirmation à l’utilisateur qui vient d’envoyer un message via le formulaire de contact.

Pour cet exemple, je me suis fixé les contraintes suivantes :

  • Cet envoi doit être lié via un module spécifique
  • Ne pas réaliser de surcharge du module « Contacts » existant
  • Le contenu de l’email doit pouvoir être géré depuis les emails transactionnels.

C’est parti, pour cela on va donc créer un module qu’on va appeler Hhennes_Contacts.
Avec le fichier de configuration suivant : ( Hhennes_Contacts/etc/config.xml )

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Hhennes_Contacts>
            <version>0.1.0</version>
        </Hhennes_Contacts>
    </modules>
    <global>
        <models>
            <hhennes_contacts>
                <class>Hhennes_Contacts_Model</class>
            </hhennes_contacts>
        </models>
        <!-- Configuration de l'email transactionnel -->
        <template>
            <email>
                <contacts_email_recipient_email_template translate="label" module="hhennes_contacts">
                    <label>Formulaire de contact destinataire</label>
                    <file>contact_form_recipient.html</file>
                    <type>html</type><!-- format : text | html -->
                </contacts_email_recipient_email_template>
            </email>
        </template>
    </global>
    <frontend>
        <events>
           <!-- Evenement qui est exécuté APRES le traitement du controller contacts_index_post -->
            <controller_action_postdispatch_contacts_index_post>
                <observers>
                    <hhennes_contacts>
                        <class>hhennes_contacts/observer</class>
                        <method>sendEmailToRequester</method>
                    </hhennes_contacts>
                </observers>
            </controller_action_postdispatch_contacts_index_post>
        </events>
    </frontend>
    <!-- Valeur par défaut pour l'email transactionnel -->
    <default>
        <contacts>
            <email>
                <recipient_email_template>contacts_email_recipient_email_template</recipient_email_template>
            </email>
        </contacts>
    </default>
</config>

Ce fichier de configuration, permet de déclarer les paramètres suivants de notre module:

  • Ajout d’une action sur l’événement controller_action_postdispatch_contacts_index_post ( qui est exécuté après l’action contacts_index_post )
  • Définition d’un email transactionnel, configurable depuis l’administration, ainsi que sa valeur par défaut

Passons à présent au fichier system.xml, ( Hhennes_Contacts/etc/system.xml )
Celui-ci va nous permettre de choisir l’email associé depuis la configuration dans l’administration (via l’onglet de configuration « contacts » de magento )

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <sections>
        <contacts>
            <groups>
                <email>
                    <fields>
                    <recipient_email_template translate="label">
                        <label>Email Template Recipient</label>
                        <frontend_type>select</frontend_type>
                        <source_model>adminhtml/system_config_source_email_template</source_model>
                        <sort_order>40</sort_order>
                        <show_in_default>1</show_in_default>
                        <show_in_website>1</show_in_website>
                        <show_in_store>1</show_in_store>
                    </recipient_email_template>
                </fields>
                </email>
            </groups>
        </contacts>
    </sections>
</config>

La logique du module sera placé dans le fichier Hhennes_Contacts/Model/Observer.php

<?php
/**
 * Description of Observer
 *
 * @author herve
 */
class Hhennes_Contacts_Model_Observer {
    
    const XML_PATH_EMAIL_TEMPLATE_RECIPIENT = 'contacts/email/recipient_email_template';
     
    /**
     * Envoi d'un email au demandeur
     * @return type
     * @throws Exception
     */
    public function sendEmailToRequester($observer)
    {   
        //Récupération des données envoyées et validation     
        $post = $observer->getControllerAction()->getRequest()->getPost();
 
        if ( $post ) {
            $translate = Mage::getSingleton('core/translate');
            $translate->setTranslateInline(false);
            try {
                $postObject = new Varien_Object();
                $postObject->setData($post);
 
                $error = false;
 
                if (!
Pas de commentaires

Magento : Attributs global pas mis à jour sur tous les stores.

J’ai dernièrement rencontré un problème avec un attribut d’une portée globale, qui n’était pas mis à jour sur un store en particulier.
Le comportement rencontré était le suivant :

  • Le changement de la valeur de l’attribut dans le store global est bien pris en compte
  • La valeur de l’attribut n’est pas mise à jour dans le store spécifié
  • Changer la valeur de l’attribut sur le store spécifié ne modifie pas sa valeur.

Dans la majorité des cas ce problème est lié à un changement de portée de l’attribut, alors que des données avait déjà été renseignées.
Dans mon cas la portée initiale de l’attribut était par store, et elle a été passé au global.

Le problème est lié au fait que les données de l’attribut spécifiques au store n’ont pas été supprimées, malgré le changement de statut.
Il faut donc les supprimer manuellement via une requête du type :
sur les tables :

  • catalog_product_entity_datetime
  • catalog_product_entity_decimal
  • catalog_product_entity_int
  • catalog_product_entity_varchar

Pour supprimer tous les attributs :

DELETE FROM `catalog_product_entity_varchar` 
WHERE
   store_id <> 0 AND
   attribute_id IN (
           SELECT attribute_id 
           FROM catalog_eav_attribute 
           WHERE is_global = 1
 
   )

Ou pour un seul attribut :

DELETE FROM `catalog_product_entity_varchar` 
WHERE
   store_id <> 0 AND
   attribute_id  = xxx

Et pour finir visitez le site de rencontre sérieuse gratuite Oulfa.fr…

Pas de commentaires

Magento : Événements création de compte client

Un petit tip rapide, si vous souhaitez réaliser des actions lors de la création d’un compte client sous Magento, il va falloir se baser sur 2 événements :

customer_register_success : Lancé lors de la création de compte depuis le formulaire standard.

checkout_submit_all_after : Lancé à la fin du passage d’une commande.
Dans cet événement il faudra également mettre la condition suivante :

if ($observer->getQuote()->getData('checkout_method') == Mage_Checkout_Model_Type_Onepage::METHOD_REGISTER) {
 
//Votre code ici
 
}
Pas de commentaires

Magento : Ajouter des nouveaux attributs aux formulaires de création de compte

Une mise à jour de cet article pour Magento 2 est disponible : Magento 2 : Ajouter des nouveaux attributs aux formulaires de création de compte
Dans cet article nous allons voir ensemble comment ajouter proprement un nouvel attribut client qui sera affiché dans les formulaires suivants

  • Création de compte ( normal )
  • Création de compte ( checkout )
  • Création de compte ( admin )

Pour l’exemple nous allons créer un attribut « website_know », qui permettra de demander au client via quel source il a connu le site.

Le tout va être géré via un module nommé « Hhennes_Customer ».
Je ne détaillerais pas toutes les étapes de création du module mais uniquement les points particuliers.

Partie Code :

Pour commencer voici le fichier de configuration de notre module.

 <?xml version="1.0"?>
 
<config>
 
    <!-- Configuration de base du Module -->
    <modules>
        <Hhennes_Customer>
            <version>0.1.0</version>    
        </Hhennes_Customer>
    </modules>
 
    <!-- Configuration globale -->
    <global>
        <helpers>
            <hhennes_customer>
                <class>Hhennes_Customer_Helper</class>    
            </hhennes_customer>
        </helpers>
       <!-- Configuration de l'installation -->
        <resources>
            <hhennescustomer_setup>
                <setup>
                    <module>Hhennes_Customer</module>
                    <class>Mage_Customer_Model_Entity_Setup</class>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </hhennescustomer_setup>
        </resources>
        <!-- Nouveau champ de création de compte dans le checkout -->
        <fieldsets>
            <customer_account>
                <website_know>
                    <create>1</create>
                    <update>1</update>
                    <to_quote>*</to_quote>
                </website_know>
            </customer_account>
            <checkout_onepage_quote>
                <website_know>
                    <to_customer>*</to_customer>>
                </website_know>
            </checkout_onepage_quote>
        </fieldsets>
    </global>
    <frontend>
        <layout>
            <updates>
                <hhennes_customer>
                    <file>hhennes_customer.xml</file>
                </hhennes_customer>
            </updates>
        </layout>
    </frontend>
</config>

Nous reviendrons plus tard sur la signification de l’ensemble des noeuds.…

Pas de commentaires

Magento : Application du patch SUPEE-6788

Le dernier patch de sécurité releasé par Magento le 27 octobre dernier à apporté de nombreuses corrections.
Mais il entraine également des effets de bords relativement nombreux sur les modules tiers.

J’ai trouvé sur github un outil très pratique qui m’a permis de réaliser l’application de ce patch plus facilement :

Magento® SUPEE-6788 Developer Toolbox :  https://github.com/rhoerr/supee-6788-toolbox

Les scripts doivent être exécutés dans le dossier shell/
Pour commencer il faut analyser les problèmes rencontrés via la commande :

php -f fixSUPEE6788.php -- analyze

Les résultats de l’analyse sont disponibles dans le fichier var/log/fixSUPEE6788.log

Plusieurs types de problèmes sont relevés :

  • Ancienne configuration du router adminhtml des modules
  • Déplacement des controllers admin pour éviter les confit ( avec changement du nom des classes )
  • Blocks qui ne sont pas dans la withelist.
  • Variables qui ne sont pas dans la withelist
  • Modules / fichiers / impactés ou qui posent problèmes.

Si vous souhaitez appliquer directement les correctifs listé dans le fichier de log, vous pouvez lancer la commande suivante :

php -f fixSUPEE6788.php -- fix

Personnellement je ne l’ai pas fait, car cela impactait des modules Tiers dont j’attends la mise à jour officielle.…

Pas de commentaires

Magento : Gestion des attributs EAV du catalogue via un module

Le grand avantage de Magento par rapport aux solutions concurrentes réside dans l’utilisation du modèle EAV, qui apporte une grande souplesse dans la gestion de votre boutique.
Ce qui vous permets de rajouter à la volée des paramètres à vos produits ( entre autre )

Pour cet article je souhaite réaliser les éléments suivants :

  • Création d’un nouveau jeu d’attribut « Vélo »
  • Création d’un groupe d’attributs « vélo »
  • Création de nouveaux attributs  » wheel_size », »supension »
  • Afficher ces attributs dans l’administration, et dans le front office

Le tout bien évidement sans toucher à l’administration 🙂
C’est donc parti pour la création d’un module qui va gérer tout ça , il va s’appeller Specific_Catalog et qui sera en version 0.1.0

Je ne détaille pas les éléments standards de la création du module, mais uniquement les éléments spécifiques à la problématique.

Pour commencer dans le fichier config.xml de notre module il faut créer insérer le code suivant ( dans la balise global )
Celui-ci va nous permettre de définir les ressources d’installation de notre module.…

Pas de commentaires


Compte Github