Posts Tagged ‘magento’

Magento : Widget lien ajout au panier

Voici comment créer un widget pratique qui vous permettra d’afficher un lien d’ajout de produit au panier, il pourra s’afficher :
– sous forme de texte
– sous forme de bouton

Nous allons pour cela créer un nouveau module, dans mon exemple je vais l’appeler Hhennes_Test.
( Je ne détaille pas la création totale du module mais uniquement les points spécifiques à la problématique )

Pour commencer il est nécessaire de créer un fichier widget.xml dans le dossier etc/ du module.
Dans celui-ci, il est possible de déclarer tous les widgets de votre module ainsi que tous leurs paramètres.

Dans mon cas je souhaite les possibilités suivantes :

  • Choisir le produit concerné par le lien d’ajout au panier
  • Choisir le mode d’affichage ( texte ou bouton )
  • Saisir un texte pour le lien
<?xml version="1.0" encoding="UTF-8"?>
<widgets>
    <!-- Déclaration de mon widget "Lien d'ajout au panier"  et du block qui lui est associé -->
    <hhennes_test type="hhennes_test/widget_addtocart" translate="name description" module="hhennes_test">
        <name>Hhennes Add To Cart Link</name>
        <description type="desc">Add link to add product in cart</description>
        <!-- Paramètres de configuration du widget -->
        <parameters>
            <!-- Choix du produit : Basé sur la fonctionnalité déjà existante pour le widget product-link -->
            <product_id translate="label">
                <visible>1</visible>
                <required>1</required>
                <label>Product</label>
                <type>label</type>
                <!-- On réutilise la fonctionnalité du widget product link -->
                <helper_block>
                    <type>adminhtml/catalog_product_widget_chooser</type>
                    <data>
                        <button translate="open">
                            <open>Select Product...
Pas de commentaires

Magento : Intégrer des landing pages

Voici quelques astuces pratiques pour si vous souhaitez intégrer des landing pages sous Magento :

Le contenu de la page sera placé dans une page cms, ce qui vous permettra d’obtenir l’url de votre choix.
Et d’accéder à l’ensemble des fonctionnalités wysiwyg de Magento 🙂

Les images de la landing page peuvent être placées dans le dossier « media » de votre site ( ou sur le cdn qui regroupe les médias ),
ce qui permets de les insérer dans le contenu avec les balises :

{{ media url='/chemin/de/mon/fichier.jpg'}}

Les liens vers les produits ou les pages du site de votre page peuvent également utiliser la syntaxe :

{{page url='ma-page-produit.html'}}

Les ressources css / js de la landing page peuvent être placée dans le dossier skin  de votre thème magento.
ex : skin/frontend/herve/default/css/landing_pages/fichier.css
ex : skin/frontend/herve/default/js/landing_pages/fichier.js

De cette manière vous pouvez rajouter ces fichiers à la page via l’onglet Design et un update du layout

<reference name="head">
 
<!-- Ajout du css -->
<action method="addCss">
  <stylesheet>css/landing_pages/fichier.css</stylesheet>
</action>
 
<!-- Ajout du js -->
<action method="addItem">
<type>skin_js</type>
 <name>js/landing_pages/fichier.js</name>
</action>
</reference>

N’hésitez pas à partager vos astuces également 😉…

Pas de commentaires

Magento : Ajouter des actions de masse à la grid des promotions panier

Par défaut la grid d’administration des promotions panier ne permets pas d’exécuter d’actions de masses.
Dans le cas de désactivation multiples il est donc nécessaire de passer sur chaque règle pour la désactiver via l’administration ( ou de créer un script ), ce qui est relativement long et fastidieux

Pour optimiser cela voici comment rajouter des actions de masses à cette liste sans surcharge.
( Cette méthode est valide pour toutes les grids existantes et ne comportant pas d’actions de masse )

Nous allons pour cela créer un nouveau module, dans mon exemple je vais l’appeler Hhennes_Test.
( Je ne détaille pas la création totale du module mais uniquement les points spécifiques à la problématique )

Pour mettre nos actions de masse nous allons utiliser l’observer : adminhtml_block_html_before
Il faut donc mettre les lignes suivantes dans le fichier config.xml de notre module

<adminhtml>
        <events>
            <adminhtml_block_html_before>
                <observers>
                    <hhennes_test_add_massaction_promo_grid>
                        <type>singleton</type>
                        <class>hhennes_test/observer</class>
                        <method>addMassActionPromoGrid</method>
                    </hhennes_test_add_massaction_promo_grid>
                </observers>
            </adminhtml_block_html_before>
        </events>
    </adminhtml>

Dans l’événement nous appelons la fonction addMassActionPromoGrid du modèle hhennes_test/observer

Voici donc le code à mettre dans ce fichier Hhennes_Test/Model/Observer.php

<?php
 
/**
 * Hhennes_Test : Observer Model
 *
 * @author Herve <[email protected]>
 */
class Hhennes_Test_Model_Observer {
 
    /**
     * Ajout de paramètres d'actions de masse sur la grid des promotions panier
     * @param Varien_Event_Observer $observer
     */
    public function addMassActionPromoGrid($observer) {
 
        //On récupère le bloc qui est traité
        $block = $observer->getBlock();
    
        //On effectue uniquement une action si c'est la grid des promotions panier
        if ($block instanceof Mage_Adminhtml_Block_Promo_Quote_Grid) {
    
            //Définition des paramètes masseAction du bloc
            $block->setMassactionIdField('rule_id');
            $block->getMassactionBlock()->setFormFieldName('rules_id');
            $block->getMassactionBlock()->setUseSelectAll(false);
 
            //Ajout de l'action de masse "Suppression"
            $block->getMassactionBlock()->addItem('rule_delete', array(
                'label' => Mage::helper('hhennes_test')->__('delete'),
                'url' => $block->getUrl('hhennes_test/adminhtml_promoQuote/massDelete'), //Controller du module
                    )
            );
 
            //Ajout de l'action de masse "Changement de statut"
            $block->getMassactionBlock()->addItem('rule_status', array(
                'label' => Mage::helper('hhennes_test')->__('Change Status'),
                'url' => $block->getUrl('hhennes_test/adminhtml_promoQuote/massStatus'), //Controller du module
                'additional' => array(
                    'visibility' => array(
                        'name' => 'status',
                        'type' => 'select',
                        'class' => 'required-entry',
                        'label' => Mage::helper('salesrule')->__('Status'),
                        'values' => array(
                            '1' => Mage::helper('salesrule')->__('Active'),
                            '0' => Mage::helper('salesrule')->__('Inactive'),
                        ),
                    )),
            ));
 
            //Configuration et ajout de la colonne pour sélectionner les élément à traiter
            $massactionColumn = array(
                'index' => $block->getMassactionIdField(),
                'filter_index' => $block->getMassactionIdFilter(),
                'type' => 'massaction',
                'name' => $block->getMassactionBlock()->getFormFieldName(),
                'align' => 'center',
                'is_system' => true
            );
            $block->addColumn('massaction', $massactionColumn, 'promo_quote_grid');
 
        }
    }
 
}

Les actions de masses sont à présent bien disponibles sur la grid, comme vous pouvez le voir dans la capture suivante.…

Pas de commentaires

Magento : Ajouter un champ de confirmation d’email sur les formulaires d’inscription

Afin de vous mettre à l’abri des erreurs de saisies d’email lors de la création de compte sur Magento et des ses multiples effets de bords ( Emails et informations perdus, réassurance et expérience client médiocre … ) voici comment mettre en place une solution rapide sur vos formulaires de création de compte.

Le principe est relativement simple, nous allons rajouter un nouveau champ « Confirmation email »  dans lequel l’utilisateur devra saisir à nouveau son adresse email.
Les 2 saisies de l’email permettent déjà de réduire considérablement les erreurs de frappe.

Ce tutoriel est réalisé sur la version 1.9.2 de Magento avec le thème rwd en base.

Modification des templates

Pour commencer il va falloir dupliquer les fichiers suivants contenant les formulaires de création de compte.
Du thème rwd : app/design/frontend/rwd/default/template/ dans votre thème app/design/frontend/yourtheme/default/template/

  • persistent/customer/form/register.phtml ( Création de compte standard )
  • persistent/checkout/onepage/billing.phtml ( Création de compte dans le checkout )

 

Dans le fichier register.phtml rechercher le code suivant :

<li>
<label for="email_address" class="required"><em>*</em><?php echo $this->__('Email Address') ?></label>
<div class="input-box">
<input type="email" autocapitalize="off" autocorrect="off" spellcheck="false" name="email" id="email_address" value="<?php echo $this->escapeHtml($this->getFormData()->getEmail()) ?>" title="<?php echo $this->quoteEscape($this->__('Email Address')) ?>" class="input-text validate-email required-entry" />
</div>
</li>

Puis ajouter à la suite le code suivant, qui va rajouter un nouveau champ de vérification email
Notez bien la classe validate-confirm-email qui va correspondre à la règle de validation que nous allons créer.…

Pas de commentaires

Magento : Annuler et supprimer des avoirs

Par défaut dans la solution magento, il n’est pas possible d’annuler ni de supprimer les avoirs. ( C’est logique au niveau comptable )
Cette fonctionnalité peut toutefois être pratique dans le cas d’une erreur de manipulation

Nous allons donc voir comment faire pour ajouter cette fonctionnalité à Magento en créant un module.
Celui-ci va ajouter 2 boutons « Annuler » et « Supprimer » dans la page de gestion d’un avoir.

Credit Memo Cancel delete

Je ne vais détailler ici que le fonctionnement logique du module.
Vous pourrez trouver l’intégralité des sources et le module sur github : https://github.com/nenes25/magento_creditMemo

L’objectif de ce module étant de ne pas réaliser de surcharge, nous allons utiliser les observers.
Celui qui nous intéresse adminhtml_widget_container_html_before

Dans le fichier de configuration de notre module il faut donc ajouter un observer sur cet événement via le code suivant

<global>
..
 <events>
            <adminhtml_widget_container_html_before>
                <observers>
                    <add_creditmemo_buttons>
                        <class>hhennes_creditmemo/observer</class>
                        <method>addCreditMemoButtons</method>
                    </add_creditmemo_buttons>
                </observers>
            </adminhtml_widget_container_html_before>
 </events>
...
2 commentaires

Magento : Ajouter un attribut personnalisé à la grid des produits via les observers

Vous avez forcément sur votre boutique Magento, des attributs produits spécifiques à votre site.
Si vous souhaitez les afficher dans la grid des produits, et pouvoir filtrer les produits via cet attribut, voici comment procéder.

Le méthode la plus propre est de passer par les observers de Magento, ceci évitera de créer des surcharges pouvant entrainer des problèmes de compatibilités.
Je passe volontairement toute la partie liée à la création du module pour se concentrer uniquement sur la partie spécifique à l’affichage de l’attribut dans la grid.

Pour que notre modification fonctionne, le module va se greffer sur les événements suivants :

  • core_block_abstract_to_html_before : Pour afficher l’attribut dans la grid des produits
  • eav_collection_abstract_load_before : Pour charger les valeurs de l’attribut dans la collection des produits

Voici donc les données  à faire figurer dans le fichier de configuration config.xml de votre module :
Veuillez à bien remplacer le nom du modèle ( hhennes_productgridfilter ) par le nom de votre module

<adminhtml>
        <events>
            <core_block_abstract_to_html_before>
                <observers>
                   <product_filter_reference>
                        <class>hhennes_productgridfilter/observer</class>
                        <method>onBlockHtmlBefore</method>
                    </product_filter_reference>
                </observers>
            </core_block_abstract_to_html_before>
            <eav_collection_abstract_load_before>
                <observers>
                    <product_filter_reference_load>
                        <class>hhennes_productgridfilter/observer</class>
                        <method>onEavLoadBefore</method>
                    </product_filter_reference_load>
                </observers>
            </eav_collection_abstract_load_before>
        </events>
  </adminhtml>

Passons à présent à l’édition de l’observer du module qui sera situé dans modulename/Model/Observer.php
Dans mon cas j’ajoute un attribut « reference » qui existe déjà dans la boutique, mais il peut être remplacé par l’attribut produit existant de votre choix.…

Pas de commentaires

Magento : Module Alertes

Voici un nouveau module Magento qui permets d’envoyer des alertes via emails aux administrateurs ou aux gestionnaires du site.

Vous pouvez-vous ci-dessous une capture de l’écran de configuration d’une alerte.
( Accessible via le menu Rapports / Alertes )

Création Alerte Magento

Dans cet exemple, je récupère toute les commandes du jour qui ont utilisé le coupon de réduction « TEST ».
Nous allons voir ensemble comment remplir une alerte.
( Je passe volontairement les détails sur les champs qui sont transparents : Nom / Description / Actif / )

Dans le champ condition , entrez la requête SQL à effectuer pour récupérer les données ( Seuls les SELECT sont autorisés ).

Si vous souhaitez recevoir un email, passer le champ Envoyer un email  à « Yes », renseignez ensuite les destinataires ( séparer les emails par ; ), un sujet et le texte de votre email.

Si vous souhaitez exporter les résultats en csv , passer le champ Exporter les résultats en csv à « Yes », puis renseignez le nom du fichier csv souhaité ainsi que l’emplacement ou il sera stocké ( dans var/export/ ).…

Pas de commentaires

Magento : Problème cumul règles de promotion panier

Le fonctionnement standard des règles de promotions de Magento peut poser problème dès lors qu’elles sont cumulées et qu’elles se basent sur une condition de montant.
Dans le cas suivant le comportement standard de Magento pose problème

  • Les frais de ports sont offerts via une règle de promotion ajoutée automatiquement au panier dès qu’il dépasse 50 € . ( condition : sous-total > 50 )
  • Le client à un panier supérieur à 50 € ( 51.96 dans mon exemple )
  • Le client applique un bon de réduction de 10€ ( via une autre règle de promotion avec un coupon )

=> Ce qui fait que le montant de sa commande ne dépasse plus le seuil nécessaire pour obtenir les frais de ports offerts.

Cependant comme vous pouvez le voir sur la capture ci-dessous, cette restriction n’est pas prise en compte par Magento.
Car la condition sous-total est basée sur le sous total initial de la commande, qui ne comprends pas les réductions
Les frais de ports sont donc offerts sur cette commande, alors qu’ils ne devraient pas l’être.…

Pas de commentaires

Magento : exécuter un modèle via le shell ( php CLI )

Voici un script qui vous permettra d’exécuter n’importe quel modèle de Magento via le shell ( PHP CLI )
Celui-ci est à placer dans un fichier « model.php » le dossier « shell » de magento.

Si vous souhaitez par exemple visualiser les données d’un produit vous pouvez saisir la commande suivante

php -f model.php -- -model catalog/product -action load -value 254

Ou également pour envoyer les emails en attente

php -f model.php -- -model core/email_queue -action send

Dans mon cas je l’utilise pour l’éxécution de modèles personnalisés

<?php
 
require_once 'abstract.php';
 
class Hhennes_Shell_Model extends Mage_Shell_Abstract {
       
    public function __construct() {
        parent::__construct();      
    }
    
    /**
     * Execution du script
     */
    public function run() {
        
        try {
                      
            if  ( $this->getArg('model')){
                
                //Gestion de la méthode à tester, par défaut load
                if ( $this->getArg('method'))
                    $method = $this->getArg('method');
                else
                    $method = 'load';
                   
                //Exécution du test
                $model = Mage::getModel($this->getArg('model'))->$method($this->getArg('value'));
                
                //Affichage des données
                Zend_debug::dump($model);
            }
                 
        } catch (Exception $exc) {
            echo $exc->getMessage();
        }
            
    }
    
    
        public function usageHelp()
    {
        return <<<USAGE
Usage:  php -f model.php -- [options]
   -model Model to test via CLI
   options : 
       -method : method to execute     
       -value : value to pass to function   
  ex : test product  php -f model.php -- -model catalog/product -action load -value 254    
  help                   This help
            
USAGE;
    }
    
}
 
$shell = new Hhennes_Shell_Model();
$shell->run();
Pas de commentaires

Magento : email queue non envoyée

J’ai rencontré récemment un problème avec l’envoi des emails de confirmation de commande sur magento version 1.9.0.1.
Contrairement à de plus anciennes versions de magento (et c’est mieux ainsi 🙂 ), les emails ne sont plus envoyés directement après le passage d’une commande.

Ils sont stockés dans la table core_email_queue .

Puis il sont envoyés 100 par 100 via la tâche cron core_email_queue_send_all toutes les minutes.

Sur le serveur hébergeant le site Magento ( dans un environnement chrooté) , cette tâche cron ne fonctionnait pas et le fichier exception.log était remplis de messages de ce type :

exception 'Zend_Mail_Transport_Exception' with message 'Unable to send mail. ' in /www/lib/Zend/Mail/Transport/Sendmail.php:137
Stack trace:
#0 /www/lib/Zend/Mail/Transport/Abstract.php(348): Zend_Mail_Transport_Sendmail->_sendMail()
#1 /www/lib/Zend/Mail.php(1194): Zend_Mail_Transport_Abstract->send(Object(Zend_Mail))
#2 /www/app/code/core/Mage/Core/Model/Email/Queue.php(241): Zend_Mail->send()
#3 [internal function]: Mage_Core_Model_Email_Queue->send(Object(Mage_Cron_Model_Schedule))
#4 /www/app/code/core/Mage/Cron/Model/Observer.php(325): call_user_func_array(Array, Array)
#5 /www/app/code/core/Mage/Cron/Model/Observer.php(72): Mage_Cron_Model_Observer->_processJob(Object(Mage_Cron_Model_Schedule), Object(Mage_Core_Model_Config_Element))
#6 /www/app/code/core/Mage/Core/Model/App.php(1338): Mage_Cron_Model_Observer->dispatch(Object(Varien_Event_Observer))
#7 /www/app/code/core/Mage/Core/Model/App.php(1317): Mage_Core_Model_App->_callObserverMethod(Object(Mage_Cron_Model_Observer), 'dispatch', Object(Varien_Event_Observer))
#8 /www/app/Mage.php(448): Mage_Core_Model_App->dispatchEvent('default', Array)
#9 /www/cron.php(77): Mage::dispatchEvent('default')
#10 {main}
Pas de commentaires


Compte Github