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>
7 commentaires

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

Ingmar Le 10/07/2010 à 20:01
Exactement ce que je cherchais, mais la checkbox ne s'affiche pas, j'ai essayé plusieures positions dans billing.html, rien à faire malheureusement. Je suis sous Mage 1.3.3, cache désactivé
Commentaire #1
Ingmar Le 10/07/2010 à 20:08
Ca marche! Merci! J'insérais mon code dans le mauvais billing.phtml ....
Commentaire #2
Ingmar Le 11/07/2010 à 14:51
Bon je ne sais pas si c'est mon incompétence, mais quand j'ajoute la checkbox dans billing.phtml, la page checkout/onepage ne s'affiche plus correctement dans IE8.0, dans tous les autres navigateurs oui.
Commentaire #3
Ingmar Le 11/07/2010 à 16:16
Encore moi! Pour que ça marche sous IE8 et pour obtenir la représentation proposée dans cet article, il faut insérer le code proposé dans bolling.phtm juste avant le "<?php endif ?>" de la section "register-customer-password".

Là plus aucun problème ...
Commentaire #4
kayla Le 16/08/2010 à 15:19
Bonjour,
est il possible de remplacer cet case à cocher par l'ajout d'un autre champ au formulaire??
Je doit ajouter un champ numéro de carte d'identité qui doit être obligatoire lors de l'inscription du client ainsi que le numéro du compte bancaire du client.
Y'aurai il un tuto qui expliquerai comment y arrivez svp?
Merci d'avance,
Commentaire #5
Anthony Le 10/12/2010 à 03:05
Bonjour,

le code marche parfaitement pour un client qui se créé un compte, or ça ne fonctionne pas quand l'internaute est en mode invité.

je pense que c'est dans l'observer où ça ne le prend pas en compte ?
" $customer = Mage::getModel('customer/customer')->load($quote->getCustomerId());"
ça sous entend que le client ait un compte et pas en invité ?

si quelqu'un a une solution, je suis entièrement preneur !!

merci d'avance
Commentaire #6
AMG Le 05/03/2012 à 11:58
Nickel sur 1.6.1, j'ai simplement changé l'emplacement de la checkbox pour la mettre en toute fin de commande, dans ce cas la il faut changer la méthode de OnepageController.php par :

public function saveOrderAction()
{
$session = Mage::getSingleton('core/session');

if ($this->getRequest()->getParam('is_subscribed', false)) {
$session->setSubscribe(1);
} else {
$session->unsSubscribe();
}
parent::saveOrderAction();

}


Merci à Magentix =)
Commentaire #7
Rédiger un commentaire

Code de sécurité

* champs obligatoires