Guide Magento Developpeur (Leçon 4) – Le Model et la base de donnée
28 juillet 2010Ce tutoriel est le 4eme d’une longue série, si vous ne l’avez pas déjà fait je vous conseille de lire les tutoriels en commençant par le sommaire de cette série.
Nous avons précédemment crée un module avec un contrôleur, un block et son Template associé. Notre module fonctionne bien et je pense que vous avez bien compris comment ca marche 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 ca a rien de très compliqué vous l’avez vu. Dans ce tutoriel on va modifier notre module pour qu’il aille chercher des données dans notre base de données (sous Mysql) pour les afficher dans notre Block.
Etape 1 : Créer la table
On va dire que notre module est un carnet d’adresse, on veut que le bloc affiche toutes les adresses du carnet les unes à la suite des autres de la forme :
Nom Prenom numero_de_telephone
Exemple :
Jean Dupond 0000000000
Jean Dupond 0000000000
Jean Dupond 0000000000
Jean Dupond 0000000000
…
On crée donc une table dans la base de donnée, on va appeler cette table pfay_test.
On exécute donc la requête suivante :
CREATE TABLE `magento`.`pfay_test` ( `id_pfay_test` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `nom` VARCHAR( 50 ) NOT NULL , `prenom` VARCHAR( 50 ) NOT NULL , `telephone` VARCHAR( 20 ) NOT NULL );
Votre table est maintenant dans la base de données. Pour pouvoir interagir avec, on va créer 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.
Allez donc dans etc/config.xml et rajoutez dans <global> âpres la déclaration <blocks>:
<models>
<test>
<class>Pfay_Test_Model</class>
<resourceModel>test_mysql4</resourceModel>
</test>
<test_mysql4>
<class>Pfay_Test_Model_Mysql4</class>
<entities>
<test>
<table>pfay_test</table>
</test>
</entities>
</test_mysql4>
</models>
<!-- permet au module de lire et ecrire -->
<resources>
<!-- connection pour ecrire -->
<test_write>
<connection>
<use>core_write</use>
</connection>
</test_write>
<!-- connection pour lire-->
<test_read>
<connection>
<use>core_read</use>
</connection>
</test_read>
</resources>
<!-- -/- -->
Dans <test> :
On déclare ici que les models seront dans le répertoire app/code/local/Pfay/Test/Model/ et que la « ressource » c’est-à-dire la chose utilisé pour aller chercher les données par le model sera défini par test_mysql4
Dans <test_mysql4> on défini que les classes seront dans app/code/local/Pfay/Test/Model/Mysql4/ et qu’une entité test représentera la table pfay_test qu’on a crée précédemment dans la base de donnée.
Etape 3 : Créer le 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/Test/Model/
app/code/local/Pfay/Test/Model/Mysql4/
app/code/local/Pfay/Test/Model/Mysql4/Test/
Ensuite, dans app/code/local/Pfay/Test/Model/ créez un fichier Test.php qui contiendra le code suivant :
<?php
class Pfay_Test_Model_Test extends Mage_Core_Model_Abstract
{
public function _construct()
{
parent::_construct();
$this->_init('test/test');
}
}
Ceci est votre model Test, vous lui indiquez que c’est une entitée test de votre module test.
Allez ensuite dans le dossier app/code/local/Pfay/Test/Model/Mysql4/ et créez un fichier Test.php qui contiendra :
<?php
class Pfay_Test_Model_Mysql4_Test extends Mage_Core_Model_Mysql4_Abstract
{
public function _construct()
{
$this->_init('test/test', 'id_pfay_test');
}
}
C’est ici que vous indiquez a Magento que votre model test/test va utiliser comme clef primaire le champ id_pfay_test. (Faites bien attention a 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/Test/Model/Mysql4/Test/ et créez un fichier Collection.php qui contiendra :
<?php
class Pfay_Test_Model_Mysql4_Test_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
{
public function _construct()
{
parent::_construct();
$this->_init('test/test');
}
}
Ce fichier sert a définir la collection pour votre model test/test.
Vous ne comprenez peu être pas bien a quoi tout ceci sert, il faut absolument que vous reteniez cette procédure pour créer un modèle sous Magento. Une fois ces fichiers crée, 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/Test/Block qui s’appelait Monblock.php. Nous allons le modifier pour qu’il affiche la liste des contacts dans la base de donnée.
Tout d’abord, insérez quelques lignes dans votre table pfay_test de votre base de données.
Ensuite, modifier votre Monblock.php de la manière suivante :
<?php
class Pfay_Test_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_test (grace à notre model test/test
et les trier par id_pfay_test */
$collection = Mage::getModel('test/test')->getCollection()
->setOrder('id_pfay_test','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('nom').' '.$data->getData('prenom')
.' '.$data->getData('telephone').'<br />';
}
//je renvoi un message de succes a 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 a laisser un commentaire
Testez maintenant votre code en allant sur http://votresite.com/test/index et vous voyez maintenant s’afficher votre liste de contacts.
Vos devoirs :
Essayez de refaire un module à partir de rien avant d’entamer le prochain tutoriel vous devez savoir refaire les 4premiers tutoriels les doigts dans le nez avant de pouvoir entamer la suite ![]()
Entrainez-vous vraiment, refaites un nouveau module pour gérer votre bibliothèque de film par exemple. Ca ressemble fortement a 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. Bon courage ![]()
Fin de ce tutoriel
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 N°4 vous a plus, vous savez maintenant interagir avec la base de donnée dans vos extensions Magento. N’hésitez pas à laisser des commentaires si vous avez des questions ou des remarques ![]()



Première mise en bouche des modèles intéressante !
Note concernant : Pfay_Test _Model
Il y a une espace devant « _Model » (problématique sûrement ?)
Effectivement, c’est modifié.
Merci
Très bon tuto.
Courage!
très bon tuto mais une remarque :
il est dommage d’utilisé un nom commun pour désigner des objets différents, je fais référence au mot test que vous utilisez partout (nom du module, nom du modèle et non de l’entité) et on ne sait plus qui est quoi.
tu as raison, sur le coup je n’y avait pas pensé, je le referai plus tard peu être.
Pour le moment je préfère continuer la série de tutos, en refaisant le tutoriel en général on comprend bien comment ca fonctionne et tout le monde fini par s’en sortir
j’ai un petit soucis car $collection = Mage::getModel(‘test/test’)->getCollection() ne me renvoit rien alors que
$collection = Mage::getModel(‘test/test’)->load(12)
ou 12 est l’id de mon enregistrement, ca marche.
j’ai pourtant bien :
class Tkhl_Pushorder_Model_Mysql4_Tkhlorder_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract
ds le repertoire : C:\wamp\www\magento\app\code\local\Tkhl\Pushorder\Model\Mysql4\Tkhlorder\Collection.php
le code ne semble pas passer dans le fichier Collection.php
y a t’il une config special pour declarer les collections
ayant trouvé la solution, il faut que meme nom entre les fichiers du model :
class Tkhl_Pushorder_Model_Order extends Mage_Core_Model_Abstract
correspond la classe Tkhl_Pushorder_Model_Mysql4_Order_Collection et non Tkhl_Pushorder_Model_Mysql4_Tkhlorder_Collection
ma petite erreur tenait a une erreur de dénomination.
pour ceux qui on eu un peu de mal au niveau des test/test ainsi qu’a la dénomination de chaque partie dans un module
ils peuvent completer ce tuto par celui ci : http://www.magentocommerce.com/knowledge-base/entry/magento-for-dev-part-5-magento-models-and-orm-basics
Bonjour, super les tutos, cependant je rencontre un probleme, je susi sur magento 1.4.1.1 et impossible d’accéder au model, j’ai tout suivit pas à pas et quand je veux afficher le résultat avec le controller, rien, je n’ai que le header de la page il semblerait que la fonction :
$collection = Mage::getModel(‘test/test’) …
fasse planter le programme, car quand je l’enleve ainsi que le foreach, ça passe très bien.
Une petite aide ?
Et pourtant j’ai revérifié tous les fichiers 2 fois.
Merci pour ton boulot, c’est un excellent tuto!
Je comprends pas encore tout mais je progresse
Très bon tutoriels !
Mais, il y a beaucoup trop de « test » ça en devient limite incompréhensible !
Fonctionnel!!!
Comme le dit nykaula, il faut une correspondance entre vos fichiers pour le Model.
Ainsi, si vous décidez d’appeler base.php le fichier test.php. Vous devrez également appeler le dossier base dans mysql4 (et non test).
De plus, il faudra écrire _init(‘test/base’) pour chacun des fichiers et aussi pour le getModel du block.
N’oubliez pas non plus les balise qui entoures la table dans etc/config.xml
Franchement, ces tuto sont super ! Un grand merci.
Seulement comme tout s’appelle test, on ne sait plus si c’est le module, la table, le model…
avec MonModule , Usr et un autre nom pour la table, c’est très clair, et même facile
Si comme moi vous avez effacé ce que vous avez fait depuis le tutoriel 1 afin de tout refaire tout seul pour vous entraîner, et que vous n’arrivez pas à afficher les données de la table et que vous n’avez aucun message d’erreur …
Vérifiez ceci :
Dans votre fichier afficher.phtml faites bien attention à faire un – echo – de la fonction de votre fichier Monblock.php qui retourne les données de la bdd …
Moi j’avais oublié le echo … *se cache*
Au moins ça ne risque plus de se reproduire … Et ça m’aura permit de bien assimiler ces 4 premiers tutoriels … je les ait retournés dans tout les sens !
Petite pause maintenant ^_^ »
Merci pour ce super tutoriel
C’est bien sauf avec la nouvelle version 1.6 c’est different pour les paths
qelqu’un peut m’expliquer c’est quoi ce path de test/test
$this->_init(‘test/test’, ‘id_pfay_test’);
Merci
/* on fait une requette : aller chercher Tous les elements
de la table pfay_test (grace à notre model test/test
et les trier par id_pfay_test */
c’est quoi ce model test/test??
j’ai ce message d’ereur
Fatal error: Call to a member function getCollection() on a non-object in C:\xampp\htdocs\magento\app\code\local\Pfay\Test\Block\Monblock.php on line 11
Any HELP?
Youpi ça marche…
astuce: regrde bien et sui bien les directoires de test.
Merci