Proposer l'inscription à la newsletter depuis la page de règlement des achats (onepage)
- De Matthieu Vion le 11 octobre 2009
- Difficulté : 3/4
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 :
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>


Là plus aucun problème ...
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,
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
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 =)