Introduction au Model View Controller (MVC) de magento
octobre 25, 2009 5 CommentairesLe model view controler (MVC) de magento permet de charger le code approprié en fonction de l’URL demandée. Le contrôleur reçoit une demande d’URL à partir du navigateur et renvoie le code approprié, cela se fait via un routeur. Nous allons voir dans ce tutoriel, le fonctionnement du MVC de magento, en prenant comme exemple le module catalogsearch. Le model view controler se sert des fichiers contenus dans le dossier controllers d’un module.
Comprendre le Model, View Controller
Sur un site magento lorsque l’on clique sur recherche avancée on tombe sur cette URL :
http://localhost/magento/catalogsearch/advanced/
Nous allons décortiquer cette URL pour comprendre le fonctionnement du MVC.
Le nom du module
Le premier élément important de l’URL est le nom du module ici catalogsearch. Il correspond au nom du module sur le frontent, il est définit dans le fichier de configuration du module config.xml
app\code\core\Mage\CatalogSearch\etc\config.xml
Le nom du module est définit dans frontName qui se trouve dans la balise routers, qui elle même se trouve dans le noeud frontend :
<frontend> <routers> <catalogsearch> <use>standard</use> <args> <module>Mage_CatalogSearch</module> <frontName>catalogsearch</frontName> </args> </catalogsearch> </routers> <layout> <updates> <catalogsearch> <file>catalogsearch.xml</file> </catalogsearch> </updates> </layout> </frontend>
Si vous changez le nom comme ceci :
<frontName>rechercheavancee</frontName>
Et vous tapez sur le frontend :
http://localhost/magento/rechercheavancee/advanced/
Vous obtenez le même résultat le formulaire de recherche avancée apparaît.
Les contrôleurs
Les contrôleurs pour la recherche dans magento se trouvent dans :
app\code\core\Mage\CatalogSearch\controllers\
Le fichier qui nous intéresse pour notre tutoriel est « AdvancedController.php » car nous allons étudier le fonctionnement du (MVC) au travers de la recherche avancée.
L’action du contrôleur
La classe du controlleur possède deux méthodes indexAction() et resultAction() qui correspondent aux actions possibles grâce à ce controlleur. indexAction() est exécuté en premier lors de l’affichage de la page de recherche avancée. C’est l’action de base, la méthode charge le layout associé au module.
Définition du layout
Autre élément important se trouve dans le fichier config.xml plus précisément dans le noeud frontend, il va définir l’emplacement du layout catalogsearch.xml
<layout> <updates> <catalogsearch> <file>catalogsearch.xml</file> </catalogsearch> </updates> </layout>
Une fois chargé, le layout est ajouté à la page grâce à la méthode renderLayout().
Ensuite ce sont les paramètres du layout et template qui se chargent de l’affichage sur la page pour en savoir plus sur les layout et template.
<catalogsearch_advanced_index> <!-- Mage_Catalogsearch --> <reference name="root"> <action method="setTemplate"><template>page/2columns-right.phtml</template></action> </reference> <reference name="head"> <action method="addItem"><type>js_css</type><name>calendar/calendar-win2k-1.css</name><params/><!--<if/><condition>can_load_calendar_js</condition>--></action> <action method="addItem"><type>js</type><name>calendar/calendar.js</name><!--<params/><if/><condition>can_load_calendar_js</condition>--></action> <action method="addItem"><type>js</type><name>calendar/calendar-setup.js</name><!--<params/><if/><condition>can_load_calendar_js</condition>--></action> </reference> <reference name="content"> <block type="catalogsearch/advanced_form" name="catalogsearch_advanced_form" template="catalogsearch/advanced/form.phtml"/> <block type="core/html_calendar" name="html_calendar" as="html_calendar" template="page/js/calendar.phtml"/> </reference> </catalogsearch_advanced_index>
Pour le noeud « catalogsearch_advanced_index »
- catalogsearch = le nom du routeur
- advanced = le nom du controller
- index le le nom de la méthode du controller.
L’autre action du contrôleur de la recherche avancée resultAction()
C’est le même principe pour la méthode resultAction() du contrôleur qui renverra cette URL :
http://localhost/magento/catalogsearch/advanced/result/
avec le même layout associé « catalogsearch.xml », mais avec un noeud de traitement de requête différent :
<catalogsearch_advanced_result> ....
Voilà une très bonne idée de dossier à développer, le MCV de Magento.
Je parle pour moi mais, n’ayant aucune formation en développement, je fais partie de ces « parasites » qui apprennent de façon empirique et grâce à Google
Donc, de façon générale, il serait très intéressant d’avoir une introduction plus globale sur le modèle MCV. Qu’est-ce que le MCV ? Quel est le rôle et la définition de chacun de ses composants et des termes de cet acronyme ? Quel est l’historique de ce mode de développement ? Quels avantages ? Quels inconvénients ? Magento a-t-il une façon spécifique de le mettre en oeuvre ?
Autre question directement relative à ce post maintenant. J’ai (bien ?) compris que la fonction indexAction() du controller était appelée au chargement de la page. Mais, concrètement, comment est-elle appelée ? Y-a-t-il un fichier dont c’est le rôle ?
Aussi, y a-t-il une nomenclature de nommage ? En effet, comment Magento est-t-il au courant des controllers à charger et de leur dossier de stockage ? Je n’y vois aucune référence dans config.xml ni system.xml… Car, si une nomenclature de nommage est nécessaire type [nomducontroler]Controller.php je comprends l’intérêt de créer plusieurs fichiers controllers (AjaxController, ResultController…) sinon, pourquoi ne pas mettre toutes les fonctions dans un unique fichier controller ?
Exemple concret avec un autre module : si je tape …/customer/address/edit, Magento se dira-t-il :
1- je dois aller chercher le module Customer
2- puis le fichier addressControler.php (address dans l’URL+Controller+.php)
3- executer l’action edit (edit dans l’URL + Action() )
Car, en effet, je note que dans les fichiers controllers, toutes les fonctions finissent par « Action » ce qui expliquerait qu’en fait l’URL est en lui-même l’appel à une fonction ainsi de l’emplacement du fichier la contenant dans l’arbo.
Si j’ai bon, çà répond à toutes mes questions ci-dessus…
Si j’ai faux… quelques éclaircissements sur soit la façon dont est interprété l’URL après le nom du module soit la manière avec laquelle les actions sont appellées seraient vraiment salutaires !
Ahhh ce que je regrette de ne pas connaître la théorie…
Si tu as quelques références bibliographiques… je suis preneur !
Merci pour ce blog qui, j’en suis sûr répondra à beaucoup de question que les dév Magento se posent !
Salut
c’est une introduction au MVC je voulais pas trop surcharger le tutoriel pour pas le rendre trop inabordable je referai un tutoriel en complément.
Mais pour te répondre
en fait tout se passe dans le fichier config.xml il y a bien une référence au controler dans le noeud routeur
Mage_CatalogSearch
catalogsearch
dans arg
donc pour notre URL
=> /magento/catalogsearch/advanced/result/
catalogsearch nom du frontend
advanced indique a magento de regarder le fichier avanced du controller
result indique, a magento qu’il faut regarder la méthode result du fichier advancedcontroler.php
pour ton exemple :
1- je dois aller chercher le module Customer oui
2- puis le fichier addressControler.php il va chercher dans le dossier controlleur du module AddressController.php
3- executer l’action edit (edit dans l’URL + Action() ) oui exécute la méthode edit () du fichier AddressController.php
si dans cette methode tu supprimes le contenu et la remplace par un echo « yesss » ; tu vera que tu es sur la bonne piste.
ce qui expliquerait qu’en fait l’URL est en lui-même l’appel à une fonction oui l’url est la base de tout, appel au module au controleur et
a la methode du controler
Toutes les méthodes des controlers se terminent par action() oui , de même que tous les noms des controlers se termine par Controller
Comment magento fait le lien entre et le controler je ne suis pas encore remonté jusque-là , mais il me semble que tout se passe dans
dans le dossier Mage\Core\Controller\Varien\Router\
Standard.php
Abstract.php
Admin.php
Default.php
Pour la lecture j’ai rien a te proposer, sinon ton ami google mais déjà avec ce que tu sais ça te suffit pour magento je pense.
Tout dépends tes objectifs dans un prochain tutoriel j’irai plus loin avec un petit module sans contrôler et ensuite un plus conséquent.
Voila j’espère que j’ai répondu a toutes tes questions si j’ai oublier ou tu en as d’autre n’hésite .
Merci pour tes réponses qui me confirment que j’avais bien compris
Me voilà avec une vision bien plus clair de la façon dont Magento traite les données !
Merci !
bonjour
très bon tutoriel concise et claire, mais de préférence et de faire un exemple complet sur les layouts et les templates car le V (view ) de magento est très complex a comprende pour un débutant
je vous remercie beaucoup pour cette effort
bonne continuation en attendant de vos prochains lires
Bonjour,
Pour un exemple plus complet il faut regarder les tutoriels création d’un module simple ( en 3 étapes)