Le Model et la base de donnée

Nous avons précédemment crée un module avec un contrôleur, un block et son Template. Notre module fonctionne bien et je pense que vous avez bien compris comment cela fonctionne jusqu’ici. J’en profite pour vous remercier de vos retours très positifs qui me motivent pour continuer cette série de tutoriels. Maintenant, un module qui fait l’équivalent d’un echo c’est pas très utile et ça a rien de très compliqué vous l’avez vu. Dans ce tutoriel on va modifier notre module pour qu’il aille chercher des infos dans notre base de données (sous Mysql) pour les afficher dans notre Block.

Etape 1 : Créer la table

Alors on va créer une table en base de données avec des films, donc on veut que le bloc affiche tous les titres de films disponibles comme ceci : Nom du film Exemple : - Gladiator
- Sexy Stupid Love
- Gang of New York
- Le loup de Wall Street

On crée donc une table dans la base de donnée, on va appeler cette table pfay_films.
on verra plus tard comment créer cette table automatiquement lorsque Magento détecte votre module dans la leçon "Commit, Rollback & Créer une table dans Magento" mais pour le moment on va faire simple donc vous allez créer la table via SQL :

CREATE TABLE `magento`.`pfay_films` (
`id_pfay_films` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `name` VARCHAR( 100 ) NOT NULL ,
);

Votre table est maintenant dans la base de données. Pour pouvoir faire des interractions entre cette table et magento, on va créer l'objet qu'on apelle le Model.

Etape 2 : Déclarer le Model dans config.xml

Vous le savez, Magento utilise le model MVC, il faut donc créer un model pour pouvoir intérragir avec notre base de donnée.
A votre avis pour créer un Model, vous qui avez suivi les 3 tutoriaux précédent…qu’est ce qu’on va devoir faire ? Vous avez la réponse qui sort automatiquement de votre tête car vous commencez à avoir l’habitude ^^, on va d’abord déclarer le model dans le fichier config.xml de notre module magento. Allez donc dans etc/config.xml et rajoutez dans <global> :

<models>
    <pfay_films>
         <class>Pfay_Films_Model</class>
         <resourceModel>pfay_films_resource</resourceModel>
     </pfay_films>
    <pfay_films_resource>
         <class>Pfay_Films_Model_Resource</class>
         <entities>
             <film>
               <table>pfay_films</table>
             </film>
          </entities>
    </pfay_films_resource>
</models>
<resources>
        <!-- connection pour ecrire -->
        <pfay_films_write>
            <connection>
                <use>core_write</use>
            </connection>
        </pfay_films_write>
        <!-- connection pour lire-->
       <pfay_films_read>
          <connection>
             <use>core_read</use>
          </connection>
       </pfay_films_read>
</resources>

Dans <pfay_films> :
On déclare ici que les classes Model de notre module seront dans le répertoire app/code/local/Pfay/Films/Model/ et que la « ressource » c'est-à-dire la chose utilisée pour aller chercher les données par le model sera définie par pfay_films_resources
Dans <pfay_films_mysql4> :
on déclare à magento que les classes se trouveront dans app/code/local/Pfay/Films/Model/Resource/ et qu’une entité pfay_films représentera la table pfay_films qu’on à crée au début de ce tutoriel.

Etape 3 : Créer la classe du Model

Une fois votre Model déclaré, vous pouvez maintenant créer les fichiers.

Créez donc les 3 dossiers suivant :
- app/code/local/Pfay/Films/Model/
- app/code/local/Pfay/Films/Model/Mysql4/
- app/code/local/Pfay/Films/Model/Mysql4/Films/ Ensuite, dans app/code/local/Pfay/Films/Model/ créez un fichier Film.php qui contiendra le code suivant :

class Pfay_Films_Model_Film extends Mage_Core_Model_Abstract
{
     public function _construct()
     {
         parent::_construct();
         $this->_init('pfay_films/film');
     }
}

Ceci est votre model Film, vous lui indiquez que c’est une entitée film de votre module pfay_films. Allez ensuite dans le dossier app/code/local/Pfay/Films/Model/Resource/ et créez un fichier Film.php qui contiendra :

class Pfay_Films_Model_Resource_Film extends Mage_Core_Model_Resource_Db_Abstract
{
     public function _construct()
     {
         $this->_init('pfay_films/film', 'id_pfay_films');
     }
}

C’est ici que vous indiquez à Magento que votre model pfay_films/film va utiliser comme clef primaire le champ id_pfay_films. (Faites bien attention à ce que ce champ soit en auto-increment et qu’il soit la primary key de votre table.
Allez ensuite dans le dossier app/code/local/Pfay/Films/Model/Resource/Film/ et créez un fichier Collection.php qui contiendra :

class Pfay_Films_Model_Resource_Film_Collection extends Mage_Core_Model_Resource_Db_Collection_Abstract
 {
     public function _construct()
     {
         parent::_construct();
         $this->_init('pfay_films/film');
     }
}

Ce fichier sert à définir la collection pour votre model pfay_films/film
Vous ne comprenez peu être pas bien à quoi tout ceci sert, il faut absolument que vous reteniez cette procédure pour créer un model sous Magento. Une fois ces fichiers créés, vous pouvez utiliser votre Model pour interagir avec vos tables très facilement.

Etape 4 : Lister les contacts dans notre Block

Rappelez vous, dans le tutorial précèdent nous avions créer un block dans app/code/local/Pfay/Films/Block qui s’appelait Monblock.php. Nous allons le modifier pour qu’il affiche la liste des films de notre base de données.
Tout d’abord, insérez quelques lignes dans votre table pfay_films via SQL puis modifiez le fichier Monblock.php de la manière suivante :

class Pfay_Films_Block_Monblock extends Mage_Core_Block_Template
{
     public function methodblock()
     {
        //on initialize la variable
        $retour='';

        /* on fait une requette : aller chercher Tous les elements
        de la table pfay_films (grace à notre model pfay_films/pfay_film
        et les trier par id_pfay_films */

        $collection = Mage::getModel('pfay_films/pfay_film')
                            ->getCollection()
                            ->setOrder('id_pfay_films','asc');

         /* ensuite on parcours le resultat de la requette et
          avec la fonction getData(), on stocke dans la variable retour
          (pour l’affichage dans le template) les données voulues */

        foreach($collection as $data)
        {

             $retour .= $data->getData('name.').'<br />';

         }

         //je renvoi un message de succes à l'utilisateur (juste pour que vous sachiez utiliser la fonction)

         Mage::getSingleton('adminhtml/session')->addSuccess('Cool Ca marche !!');

         return $retour;
      }
 }
 
En regardant le code, je pense que vous comprendrez vite ce qu’on a fait grâce aux commentaires, si ce n’est pas le cas n’hésitez pas à laisser un commentaire. Testez maintenant votre code en allant sur http://votresite.com/films/index et vous voyez maintenant s’afficher votre liste des films.

Vos devoirs : Essayez de refaire un module à partir de rien avant d’entamer le prochain tutoriel vous devez savoir refaire les 4 premiers tutoriels les doigts dans le nez avant de pouvoir entamer la suite sereinement ;)

Entrainez-vous VRAIMENT, refaites un nouveau module pour gérer votre bibliothèque de contacts par exemple. Ca ressemble fortement à ce qu’on vient de faire mais ce n’est pas pareil donc vous allez pouvoir mettre en pratique et vraiment comprendre ce que vous faites. Si cela ne fonctionne pas ? N'hésitez pas à télécharger mon code en bas de cet article pour le comparer avec le votre.

Dans le prochain tutoriel, on rentrera un peu plus en détails sur comment fonctionne les collections afin que vous puissiez rapidement faire des opérations plus complexes sur votre base de donnée.

Voila c’est la fin de ce tutoriel, j’espère que ce tutoriel vous a plus, vous savez maintenant interragir avec la base de données de Magento. N’hésitez pas à laisser des commentaires si vous avez des questions ou des remarques constructives.
Documents disponibles pour cet article :
Les livres qui peuvent vous aider :
  • Livre Magento Developer's Guide by Alan Mc Gregor
  • Livre Magento Performance Optimization
  • Livre Grokking Magento Vinai