Comment créer un Model sur Magento

rsz_shutterstock_157725224

Bonjour à tous, pour faire suite au premier tutoriel sur la création d’un formulaire de contact à travers un module Magento, je vais vous présenter comment créer un Model sur magento.

Dans notre cas, nous voulons enregistrer en base de données toutes les demandes de contact effectuées à travers notre formulaire de contact. Ca peut être utile de garder un historique des demandes en les stockant dans la base de données. Et puis c’est un exemple plutôt simple pour la réalisation d’un premier Model.

Attention, puisque nous avons besoin d’une table pour enregistrer les messages, il vous faut créer un setup sql dans votre module qui créera la table.

Vous pouvez suivre ce tutoriel suivant pour en connaitre la procédure : Comment créer un setup sur Magento

Qu’est-ce qu’un Model sur magento ?

Un model est une classe PHP qui est associé à votre module.
Ce model est dans le cas le plus simple représenté par un seul fichier.

Ce fichier est dans un répertoire Model de votre module. Exemple :

Un model est appelé de la manière suivante (dans un controller par exemple) :

$contact = Mage::getModel('sample_contact/contact')

Son utilisation sera détaillé un peu plus bas.

Ce seul fichier Contact.php aujourd’hui ne suffirait pas si l’on souhaite créer/supprimer/lire des entrées dans une table de contact en base de données. Il nous faudra l’accompagner de plusieurs autres classes que l’on appelle ResourceModel et Collection.

Vous pouvez commencer par créer le fichier Model Contact.php à l’emplacement suivant :
– app/code/local/Sample/Contact/Model/Contact.php

<?php

/**
 * Sample Contact Model Contact
 *
 * @category   Sample
 * @package    Sample_Contact
 * @author    Nicolas Verhoye <nicolas.verhoye@gmail.com>
 */

class Sample_Contact_Model_Contact extends Mage_Core_Model_Abstract
{
    public function _construct()
    {
        parent::_construct();
        $this->_init('sample_contact/contact');
    }
}

Comment se compose un Model ?

Comme dit précédemment, Un Model magento peut se présenter sous la forme d’un seul fichier, ou plus. Si vous souhaitez effectuer des opérations en base de données avec une table de votre module (préalablement créée via un Setup SQL) il vous faudra créer deux fichiers PHP supplémentaires en plus de votre classe Model.

A savoir donc :
– Le Model
Le Resource Model
La Collection

Ces trois classes vont étendre des classes natives de Magento. Cela nous permettra d’avoir accès à des propriétés comme la sauvegarde, la lecture ou la suppression d’entrées de message contact dans notre table.

En dehors de ces fonctionnalités de sauvegarde/lecture/suppression nous n’avons pas aujourd’hui besoin de plus de choses pour notre Module.

Mais nous pourrions imaginer par la suite d’ajouter des méthodes dans notre model de contact.
Comme nettoyer les éventuelles balises HTML du message lors qu’ils seront affichés.

<?php

/**
 * Sample Contact Model Contact
 *
 * @category   Sample
 * @package    Sample_Contact
 * @author    Nicolas Verhoye <nicolas.verhoye@gmail.com>
 */

class Sample_Contact_Model_Contact extends Mage_Core_Model_Abstract
{
    public function _construct()
    {
        parent::_construct();
        $this->_init('sample_contact/contact');
    }

    /* 
     * Afficher le contenu d'un message enregistré
     * en retirant les tags HTML.
     */
    public function getEscapedMessage() 
    {
        return strip_tags($this->getData('message'));
    }

}

Exemple d’utilisation :

<?php 
/* Création de l'objet */
$contact = Mage::getModel('sample_contact/contact');

/* Chargement avec un identifiant */
$contact->load(124); 

/* Affichage du message sans tags */
echo $contact->getEscapedMessage(); 

Qu’est-ce qu’un Resource Model sur magento ?

Le Resource Model est une extension de votre Model, c’est dans cette classe que vous placerez vos méthodes d’échanges avec la base de données. Vous aurez accès naturellement à des méthodes de lecture et d’écriture de données.

Ce fichier est dans un répertoire Model/Resource/ de votre module. Exemple :

Toutefois, cette classe Resource Model n’est pas dans la plupart des cas utilisé directement.
En effet il passe par le Model, qui lui appelle une méthode du Resource Model.

Pour illustrer avec un exemple, imaginons que nous souhaitons retrouver le client à partir de l’email qu’il aurait saisi. Nous avons une table avec plusieurs messages enregistrés, et une colonne email.

Nous avons donc besoin d’une méthode qui va échanger avec la base de données (table client et table contact), nous allons l’appeler findCustomerFromEmail

/**
 * Model : Sample/Contact/Model/Contact.php
 */

public function findCustomerFromEmail() 
{
    return $this->_getResource()->findCustomerFromEmail($this);
}

On retrouve cette même méthode dans la classe Resource, mais avec des requêtes SQL :

/**
 * Resource Model : Sample/Contact/Model/Resource/Contact.php
 */

public function findCustomerFromEmail($object) 
{
    $query = "SELECT customer_id ... WHERE email = ...";
    return $this->_getReadadapter()->fetchOne($query);
}

Et en utilisation concrète cela donne :

<?php 
/* Création de l'objet */
$contact = Mage::getModel('sample_contact/contact');

/* Chargement avec un identifiant */
$contact->load(124); 

/* Récupération client à partir de l'email du message de contact */
$customer = $contact->findCustomerFromEmail(); 

Ceci est juste un exemple, nous n’allons pas ajouter cette méthode à notre cas, mais pour la suite de notre tutoriel vous pouvez maintenant ajouter ce fichier Resource Model à cet endroit : app/code/local/Sample/Contact/Model/Contact/Resource/Contact.php

<?php
/**
 * Sample Contact Model Resource Contact
 *
 * @category   Sample
 * @package    Sample_Contact
 * @author    Nicolas Verhoye <nicolas.verhoye@gmail.com>
 */
class Sample_Contact_Model_Resource_Contact extends Mage_Core_Model_Resource_Db_Abstract
{
    protected function _construct()
    {
        $this->_init('sample_contact/contact', 'contact_id');
    }
}

Notez que le deuxième paramètre de la méthode _init (ici contact_id) est en fait la PRIMARY KEY de votre table contact.

Qu’est-ce qu’une Collection sur magento ?

Pour faire suite au deux précédentes classe (Model et Resource Model) le fichier de Collection permettra de traiter un ensemble de vos Models. Pour les afficher, les supprimer ou les modifier massivement.

Ce fichier est toujours dans le répertoire Model de votre module. A ce niveau :
– app/code/local/Sample/Contact/Model/Resource/Contact/Collection.php

Une collection est appelé de la manière suivante :

/**
 * Afficher la liste des messages
 */
$contactCollection = Mage::getModel('sample_contact/contact')->getCollection();

foreach($contactCollection as $contact)
{
    echo $contact->getMessage();
}

Il est tout à fait possible d’ajouter des méthodes à cette classe Collection, par exemple si vous souhaitez implémenter un filtre pour récupérer les messages qui ont été postés au-delà d’une date :

/**
 * Model : Sample/Contact/Model/Contact/Collection.php
 */
public function filterOlderThan($date) 
{
    $this->addFieldToFilter('posted_at', array('gt' => $date));
}

Et en utilisation concrète cela donne :

<?php 
/* Création de la collection */
$contactCollection = Mage::getModel('sample_contact/contact')->getCollection();
$contactCollection->filterOlderThan('2015-12-25');

/* Affichage des messages postés après le 25 décembre 2015 */
foreach($contactCollection as $contact)
{
    echo $contact->getMessage();
}

Pour la suite de notre tutoriel vous pouvez maintenant ajouter ce fichier Collection à cet endroit :
app/code/local/Sample/Contact/Model/Contact/Resource/Contact/Collection.php

/**
 * Sample Contact Model Resource Contact Collection
 *
 * @category   Sample
 * @package    Sample_Contact
 * @author    Nicolas Verhoye <nicolas.verhoye@gmail.com>
 */
class Sample_Contact_Model_Resource_Contact_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract
{
    /**
     * Resource initialization
     */
    protected function _construct()
    {
        $this->_init('sample_contact/contact');
    }
}

 

3. Déclaration des Models

Maintenant que nos trois fichiers sont créés, il nous faut les déclarer à Magento.
Comme souvent, cela se passe dans un fichier XML. En l’occurrence il s’agit du fichier etc/config.xml de votre module.

Ajoutez le noeud <models> et son contenu au fichier config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Sample_Contact>
            <version>0.1.0</version>
        </Sample_Contact>
    </modules>
    <global>
        <models>
            <sample_contact>
                <class>Sample_Contact_Model</class>
                <resourceModel>sample_contact_resource</resourceModel>
            </sample_contact>
            <sample_contact_resource>
                <class>Sample_Contact_Model_Resource</class>
                <entities>
                    <contact>
                      <table>sample_contact</table>
                    </contact>
                </entities>
            </sample_contact_resource>
        </models>
    </global>
    <frontend>
       (...)
    </frontend>
</config>

Ces nouvelles lignes, vont « informer » Magento de l’existence de Model, associé à une Resource Model, ainsi que le nom de la table (sample_contact).

Vous pouvez à présenter purger le cache de Magento (via suppression du répertoire /var/cache, ou depuis le back-office).

4. Mise en place dans notre exemple

Maintenant que les étapes de création du Model sont réalisées, nous pouvons utiliser le model dans notre module de formulaire de contact :

class Sample_Contact_IndexController extends Mage_Core_Controller_Front_Action
{
    public function indexAction()
    {
        $this->loadLayout();
         
        if ($this->getRequest()->isPost()) {
             
            $postData = $this->getRequest()->getParams();
             
            $email = $postData['email'];
            $message = $postData['message'];
            $subject = "Nouveau message de la part de $email !";
            $to = 'nicolas.verhoye@gmail.com';
 
            if (mail($to, $subject, $message)) {

                $contact = Mage::getModel('sample_contact/contact');
                $contact->setData('email', $email);
                $contact->setData('message', $message);
                $contact->save();

                $this->_redirectUrl('contact/index/confirm');
            }
             
        }
         
        $this->renderLayout();
    }
 
    public function confirmAction()
    {
        $this->loadLayout();
        $this->renderLayout();
    }
}

Nicolas Verhoye

Développeur Magento, Freelance

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *