Tâches Cron : souhaitez un joyeux anniversaire à vos clients

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

Tâches Cron : souhaitez un joyeux anniversaire à vos clients Ce module d'exemple va nous permettre d'appréhender l'utilisation des tâches Cron sous Magento. Une méthode exécutée quotidiennement expédiera un e-mail si la date du jour correspond à la date d'anniversaire du client.

Magento exécute automatiquement et périodiquement un certain nombre de scripts via les tâches Cron : mise à jour des règles de prix catalogue, envoi des newsletters, génération du fichier sitemap ou encore nettoyage des logs.

La plateforme nous permet de programmer facilement de nouvelles tâches personnalisées directement depuis les fichiers XML de configuration. Pour exécuter ces tâches configurées, il suffit de faire régulièrement appel au fichier cron.php situé à la racine du site. Ainsi, lors de la configuration du fichier contrab sur le serveur, on indique simplement le chemin vers ce fichier :

Exécution du fichier cron.php toutes les 15 minutes

* / 15 * * * * /home/site/www/cron.php

Un tutoriel sur la configuration de crontab sous l'interface Webmin a été rédigé par Gabriiiel sur Fragento : Mise en place d'une tâche cron Magento via Webmin.

A défaut de pouvoir configurer le service crontab sur votre serveur, vous pouvez accéder au fichier depuis votre navigateur : http://www.example.com/cron.php. A mettre en page de démarrage par exemple... ou à exécuter depuis un Web Service externe (Ex : Webcron).

Afin de mettre en pratique la configuration d'une nouvelle tâches Cron, nous allons développer un module d'exemple. Une méthode se chargera d'envoyer un e-mail aux utilisateurs dont c'est l'anniversaire.

Pour que les clients puissent saisir leur date de naissance, activons l'option depuis la configuration :

Système > Configuration > Clients > Configuration client > Options de nom et d'adresse > Afficher la date de naissance.

Informations personnelles

Architecture du module

  • app/code/local/Magentix/HappyBirthday/etc/
  • config.xml
  • system.xml
  • app/code/local/Magentix/HappyBirthday/Helper/
  • Data.php
  • app/code/local/Magentix/HappyBirthday/Model/
  • Observer.php
  • app/locale/fr_FR/template/email/
  • happybirthday.html
  • app/etc/modules/
  • Magentix_HappyBirthday.xml

Développement du module

Commençons par déclarer le nouveau module depuis le fichier Magentix_HappyBirthday.xml :

app/etc/modules/Magentix_HappyBirthday.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_HappyBirthday>
            <active>true</active>
            <codePool>local</codePool>
        </Magentix_HappyBirthday>
    </modules>
</config>

L'extension expédie un e-mail aux internautes. Nous nous servirons du puissant moteur de template mail de Magento. Le fichier happybirthday.html correspond à notre template mail par défaut. Par la suite, les fichiers de configurations du module permettront d'activer la personnalisation du template depuis la gestion des e-mails transactionnels de l'administration. Veillez à ce que l'encodage du fichier soit en UTF-8.

app/locale/fr_FR/template/email/happybirthday.html

<!--@subject Joyeux anniversaire @-->
<p>Bonjour {{var name}},</p>

<p>Toute l'équipe de <strong>Magentix</strong> vous souhaite un très bon anniversaire !</p>

<p>A très vite sur magentix.fr ! <br /> <a href="http://www.magentix.fr">http://www.magentix.fr</a></p>

Notre classe Magentix_HappyBirthday_Helper_Data restera très basique...

app/code/local/Magentix/HappyBirthday/Helper/Data.php

<?php

class Magentix_HappyBirthday_Helper_Data extends Mage_Core_Helper_Abstract {

}

Attaquons ensuite la méthode de la classe Magentix_HappyBirthday_Model_Observer chargée de récupérer les clients dont c'est l'anniversaire et d'expédier le message. C'est cette méthode que l'on appellera automatiquement une fois par jour via la nouvelle tâche Cron :

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

<?php

class Magentix_HappyBirthday_Model_Observer {
        
    const XML_PATH_EMAIL_TEMPLATE   = 'happybirthday/email/email_template';
    const XML_PATH_EMAIL_SENDER     = 'happybirthday/email/sender_email_identity';

    public function sendMail($schedule) {

        $customers = Mage::getModel('customer/customer')
                ->getCollection()
                ->addAttributeToSelect('firstname')
                ->addAttributeToSelect('lastname')
                ->addAttributeToFilter('dob',array('like'=>'%-'.date('m-d').' %'))
                ->load();
                
        foreach($customers as $c) {
                $mailTemplate = Mage::getModel('core/email_template');

                $mailTemplate->setDesignConfig(array('area' => 'frontend'))
                             ->sendTransactional(
                                Mage::getStoreConfig(self::XML_PATH_EMAIL_TEMPLATE),
                                Mage::getStoreConfig(self::XML_PATH_EMAIL_SENDER),
                                $c->getEmail(),
                                $c->getName(),
                                array('name' => $c->getName())
                             );
                }
    }
}

Nous pouvons enfin éditer les fichiers de configuration. Notre tâche Cron se déclare en quelques lignes depuis le fichier config.xml. On y indique la périodicité d'exécution du script et le nom de la méthode de l'observer (ici sendMail) :

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

<config>
    <!-- ... -->
    <crontab>
        <jobs>
            <happybirthday_send_mail>
                <schedule><cron_expr>0 4 * * *</cron_expr></schedule>
                <run><model>happybirthday/observer::sendMail</model></run>
            </happybirthday_send_mail>
        </jobs>
    </crontab>
</config>

La méthode sera donc exécutée quotidiennement à 04h00.

Les autres déclarations des fichiers de configuration servent à la gestion du module et du template mail Happy Birthday depuis l'administration, et indiquent à Magento les classes du module :

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

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_HappyBirthday>
            <version>1.0</version>
        </Magentix_HappyBirthday>
    </modules>
    <global>
        <models>
            <happybirthday>
                <class>Magentix_HappyBirthday_Model</class>
            </happybirthday>
        </models>
        <helpers>
            <happybirthday>
                <class>Magentix_HappyBirthday_Helper</class>
            </happybirthday>
        </helpers>
        <resources>
            <happybirthday_setup>
                <setup>
                    <module>Magentix_HappyBirthday</module>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </happybirthday_setup>
        </resources>
        <template>
            <email>
                <happybirthday_email_email_template translate="label" module="happybirthday">
                    <label>Happy Birthday</label>
                    <file>happybirthday.html</file>
                    <type>html</type>
                </happybirthday_email_email_template>
            </email>
        </template>
    </global>
    <adminhtml>
        <acl>
            <resources>
                <admin>
                    <children>
                        <system>
                            <children>
                                <config>
                                    <children>
                                        <happybirthday translate="title" module="happybirthday">
                                            <title>HappyBirthday</title>
                                        </happybirthday>
                                    </children>
                                </config>
                            </children>
                        </system>
                    </children>
                </admin>
            </resources>
        </acl>
    </adminhtml>
    <default>
        <happybirthday>
            <email>
                <recipient_email><![CDATA[hello@example.com]]></recipient_email>
                <sender_email_identity>general</sender_email_identity>
                <email_template>happybirthday_email_email_template</email_template>
            </email>
        </happybirthday>
    </default>
    <crontab>
        <jobs>
            <happybirthday_send_mail>
                <schedule><cron_expr>0 4 * * *</cron_expr></schedule>
                <run><model>happybirthday/observer::sendMail</model></run>
            </happybirthday_send_mail>
        </jobs>
    </crontab>
</config>

app/code/local/Magentix/HappyBirthday/etc/system.xml

<config>
    <sections>
        <happybirthday translate="label" module="happybirthday">
            <label>Happy Birthday</label>
            <tab>general</tab>
            <frontend_type>text</frontend_type>
            <sort_order>101</sort_order>
            <show_in_default>1</show_in_default>
            <show_in_website>1</show_in_website>
            <show_in_store>1</show_in_store>
            <groups>
                <email translate="label">
                    <label>Email Options</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>50</sort_order>
                    <show_in_default>1</show_in_default>
                    <show_in_website>1</show_in_website>
                    <show_in_store>1</show_in_store>
                    <fields>
                        <sender_email_identity translate="label">
                            <label>Email Sender</label>
                            <frontend_type>select</frontend_type>
                            <source_model>adminhtml/system_config_source_email_identity</source_model>
                            <sort_order>20</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </sender_email_identity>
                        <email_template translate="label">
                            <label>Email Template</label>
                            <frontend_type>select</frontend_type>
                            <source_model>adminhtml/system_config_source_email_template</source_model>
                            <sort_order>30</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </email_template>
                    </fields>
                </email>
            </groups>
        </happybirthday>
    </sections>
</config>
Happy Birthday Template Happy Birthday Configuration

Pour tester le module en local ou sur un serveur de pré-production je vous conseille de définir la périodicité d'exécution du script à chaque fois que le cron est lancé (* * * * *) puis d'accéder au fichier cron.php depuis le navigateur.

commentaires

Commentez cet article : Tâches Cron : souhaitez un joyeux anniversaire à vos clients