Proposer l'inscription à la newsletter depuis la page de règlement des achats (onepage)

  • De le 11 octobre 2009
  • Difficulté : 3/4

Proposer l'inscription à la newsletter depuis la page de règlement des achats (onepage) Il s'avère que de nombreux clients s'enregistrent lors du processus de règlement des achats. Ils indiquent alors les informations de facturation et de livraison (étape 2 et 3), mais aucun champ à cet endroit ne permet l'enregistrement à la newsletter...

L'objectif du module est de proposer à l'internaute de s'enregistrer à la newsletter depuis l'étape 2 du règlement des achats, lorsqu'il indique ses informations de facturation :

Abonnement à la newsletter

Architecture du module

  • app/code/local/Magentix/OpNews/controllers/Checkout/
  • OnepageController.php
  • app/code/local/Magentix/OpNews/etc/
  • config.xml
  • app/code/local/Magentix/OpNews/Model/
  • Observer.php
  • app/design/frontend/default/{interface}/{theme}/checkout/onepage/
  • billing.phtml
  • app/etc/modules/
  • Magentix_OpNews.xml

Développement du module

Lorsque l'internaute communique ses informations de facturation, le client (customer) n'existe pas encore. Magento mémorise ces informations afin de les réutiliser lors de la validation et la génération de notre commande. L'idée est donc, à ce stade, d'enregistrer en session cette information. Une fois le client définitivement enregistré, nous contrôlerons l'existence de cette variable de session puis agirons en conséquence.

Dans un premier temps, éditons le bloc billing.phtml afin d'y ajouter le champ de type checkbox nommé is_subscribed :

app/design/frontend/default/{interface}/{theme}/checkout/onepage/billing.phtml

<li>
        <div class="input-box">
                <input type="checkbox" name="is_subscribed" checked="checked" /> <?php echo $this->__('Subscribe to newsletter') ?>
        </div>
</li>

Le champ checkbox doit être ajouté au sein du formulaire, entre les balises form, ouvrante et fermante.

Pour manipuler cette nouvelle donnée, nous n'avons pas d'autre choix que de surcharger le contrôleur Mage_Checkout_OnepageController. La méthode saveBillingAction se charge d'enregistrer les informations de facturation avant de passer à l'étape suivante. C'est cette méthode qui nous intéresse, nous allons y ajouter un contrôle sur le champ is_subscribed et stocker l'information en session :

app/code/local/Magentix/OpNews/controllers/Checkout/OnepageController.php

<?php

require_once 'Mage/Checkout/controllers/OnepageController.php';

class Magentix_OpNews_Checkout_OnepageController extends Mage_Checkout_OnepageController
{

    public function saveBillingAction()
    {
        $this->_expireAjax();
        if ($this->getRequest()->isPost()) {
            $data = $this->getRequest()->getPost('billing', array());
            $customerAddressId = $this->getRequest()->getPost('billing_address_id', false);
            $result = $this->getOnepage()->saveBilling($data, $customerAddressId);
                        
            /* +++ ****************************************** +++ */
                                
                $session = Mage::getSingleton('core/session');
                                
                if ($this->getRequest()->getParam('is_subscribed', false)) {
                        $session->setSubscribe(1);
                } else {
                        $session->unsSubscribe();
                }
                                
            /* +++ ****************************************** +++ */

            /* ... */

            $this->getResponse()->setBody(Zend_Json::encode($result));
        }
    }
}

Il ne reste plus qu'à ajouter un observer. Celui-ci observera l'événement d'enregistrement de commande, checkout_type_onepage_save_order_after. La méthode subscribe abonnera le nouveau client à la newsletter s'il a sélectionné la case lors de l'étape 2 du processus de commande, l'information est maintenant stockée en session.

app/code/local/Magentix/OpNews/Model/Observer.php

<?php

class Magentix_OpNews_Model_Observer {

        function subscribe($observer) {
                $event = $observer->getEvent();
                $quote = $event->getQuote();
                $customer = Mage::getModel('customer/customer')->load($quote->getCustomerId());
                $session = Mage::getSingleton('core/session');
        
                if($session->hasSubscribe()) {
                        if($session->getSubscribe()) $customer->setIsSubscribed(1)->save();
                        $session->unsSubscribe();
                }
        }
}

Pour finir nous pouvons déclarer la surcharge du contrôleur et le nouvel observer en éditant notre fichier de configuration :

app/code/local/Magentix/OpNews/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_OpNews>
            <version>1.0</version>
        </Magentix_OpNews>
    </modules>
        <global>
                <rewrite>
                        <Magentix_OpNews_checkout_onepage>
                                <from><![CDATA[#^/checkout/onepage/#]]></from>
                                <to>/opnews/checkout_onepage/</to>
                        </Magentix_OpNews_checkout_onepage>
                </rewrite>
                <models>
                        <opnews>
                                <class>Magentix_OpNews_Model</class>
                        </opnews>
                </models>
                <events>
                        <checkout_type_onepage_save_order_after> 
                                <observers>
                                        <magentix_opnews_observer_afer>
                                                <type>singleton</type>
                                                <class>opnews/observer</class>
                                                <method>subscribe</method>
                                        </magentix_opnews_observer_afer>
                                </observers>
                        </checkout_type_onepage_save_order_after>
                </events>
        </global>
        <frontend>
                <routers>
                        <Magentix_OpNews>
                                <use>standard</use>
                                <args>
                                        <module>Magentix_OpNews</module>
                                        <frontName>opnews</frontName>
                                </args>
                        </Magentix_OpNews>
                </routers>
        </frontend>
</config>
commentaires

Commentez cet article : Proposer l'inscription à la newsletter depuis la page de règlement des achats (onepage)