Guide Magento Developpeur (Leçon 6) – Créer un module d’administration sur le backoffice

Ce tutoriel est le 6eme 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.

Dans ce tutoriel je vais commencer par arrêter de vous énumérer tout ce qu’on a fait depuis le début parce que ca commence à faire beaucoup et ca va devenir lourd ^^ bref…vous avez déjà fait un module complet qui fonctionne sur le frontoffice, aujourd’hui on va s’intéresser au Backoffice !

Vous avez votre carnet d’adresse qui s’affiche en frontend, comment faire en sorte que notre formulaire (que nous avons crée dans le tutoriel précédent) s’affiche dans le backoffice

Prêt ? Ok commençons…

1- Magento et l’administration

Avant de se lancer comme des gros bourrins sur le code, commençons d’abord par comprendre comment fonctionne l’administration de magento.

Déjà pour la partie admin du module, c’est toujours pareil, il va y avoir une partie « code » et une partie « template » (c’est le principe du MVC…séparer le code et la vue), la partie code se trouvera dans le dossier de la partie « code » de votre module, sous un répertoire appelé Adminhtml.

Ainsi, les Blocks de l’administration de votre module se trouveront dans /app/code/local/Pfay/Test/ Block/Adminhtml/
Les controllers se trouveront dans /app/code/local/Pfay/Test/controllers/Adminhtml/
Et le model, c’est le même pour la partie admin et pour la partie front, évidement on ne va pas en recréer un alors qu’il existe déjà ;)

Pour la partie backoffice, vous allez chercher vos templates et vos layout dans /app/design/adminhtml/default/Pfay/, une fois que vous êtes ici, c’est pareil que pour le front, vous avez votre dossier layout et votre dossier template ou vous stockerez respectivement vos layout et vos templates.

2- Hum…6eme tutoriels, a vous de jouer : premier truc à faire…?

Evidement vous avez l’habitude, on commence par éditer le fichier config.xml de notre module, allez dans /app/code/local/Pfay/Test/etc/.

Apres </frontend> et avant <global> ajoutez :

   <admin>
       <routers>
           <test>
              <use>admin</use>
              <args>
                 <module>Pfay_Test</module>
                 <frontName>admintest</frontName>
              </args>
           </test>
        </routers>
   </admin>
   <adminhtml>
     <layout>
        <updates>
            <test>
                <file>test.xml</file>
             </test>
        </updates>
     </layout>
     <menu>
        <test translate="title" module="adminhtml">
           <title>Mes modules</title>
           <sort_order>100</sort_order>
           <children>
               <set_time>
                     <title>Carnet d'adresse</title>
                     <action>admintest/adminhtml_index</action>
                </set_time>
            </children>
         </test>
      </menu>
  </adminhtml>

 

Une petite explication ?

 

 <admin>
     <routers>
        <test>
            <use>admin</use>
            <args>
              <module>Pfay_Test</module>
              <frontName>admintest</frontName>
            </args>
         </test>
     </routers>
 </admin>

Tout d’abord on crée un routeur d’administration, la balise use a pour valeur admin ce qui permet de dire que ca sera un module d’administration (contrairement à si on avait utilisé la valeur standard).

Pour accéder a la partie admin de notre module, on définit un raccourci pour l’url grâce à l’attribut frontName qu’on met à admintest. Pour accéder à notre module on va donc aller a l’url :

http://votresite.com/admintest/adminhtml_index

  <adminhtml>
      <layout>
         <updates>
             <test>
                <file>test.xml</file>
             </test>
         </updates>
      </layout>
      <menu>
        <test translate="title" module="adminhtml">
            <title>Mes modules</title>
            <sort_order>100</sort_order>
            <children>
               <set_time>
                  <title>Carnet d'adresse</title>
                  <action>admintest/adminhtml_index</action>
               </set_time>
           </children>
        </test>
    </menu>
 </adminhtml>


On définit ensuite que le layout à charger pour ce module sera le fichier test.xml qui se trouvera dans le dossier /app/design/adminhtml/default/Pfay/layout/

Puis grâce à la balise menu on crée le menu de l’administration

La balise me parait assez explicite :

Title : le titre de la colone (ici « Mes modules »)
set_order : l’odre dans le menu ( ici 100 pour le mettre en dernier)

Ensuite chaque children de cette balise correspond à une ligne, dans cette entrée du menu. Pour chaque élément children, on retrouve un nom et, un lien… En fait, chaque children du menu est juste un raccourci, quand on va cliquer dessus, on sera redirigé vers la page (dans notre exemple vers http://votresite.com/admintest/adminhtml_index)

3- Créer le controller de la partie admin

Créez le dossier \app\code\local\Pfay\Test\controllers\Adminhtml\ et dedans le fichier IndexController.php qui contiendra :

class Pfay_Test_Adminhtml_IndexController extends Mage_Adminhtml_Controller_Action
{
  public function indexAction()
  {
          $this->loadLayout();
          $this->renderLayout();
  }
}

Je n’explique pas ce fichier, vous avez déjà vu a quoi ca sert dans les tutoriaux précédent

4- Ajouter le formulaire dans la partie admin

Maintenant votre module fonctionne et vous pouvez y accéder via le menu, sauf que bien sur pour l’instant il ne fait rien.

Pour aller plus vite, copier votre fichier phtml qui contient votre formulaire vers l’admin de magento, en clair prenez le fichier afficher.phtml qui se trouve dans /app/design/frontend/pfay/theme/template/test/ et copiez le dans /app/design/adminhtml/default/Pfay/template/test/

et rajoutez dans votre formulaire le champ hidden suivant (requis pour la sécurité dans magento) :

<input name="form_key" type="hidden" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>"  />

Maintenant, modifiez le layout test.xml dans /app/design/adminhtml/default/Pfay/layout/ comme ceci :

<?xml version="1.0" ?>
<layout version="0.1.0">
  <test_adminhtml_index_index>
     <reference name="content">
             <block type="test/monblock"  name="afficher_monbloc"
                  template="test/afficher.phtml" />
      </reference>
   </test_adminhtml_index_index>
</layout>

 

Comme vous avez copié le template dans votre répertoire template d’admin, il associe le block du front avec votre template d’admin et ca marche, vous avez maintenant votre formulaire dans l’administration ;)

Fin de ce tutoriel Félicitation vous avez réussi à tenir jusqu’au bout de ce tutoriel. Comme d’habitude laisser un message en commentaire, ca fait toujours plaisir et si vous avez des questions n’hésitez pas ;)

Retrouvez le sommaire de ce tutoriel

Posted in Magento and tagged , , , , , , , , , .


36 Comments

  1. Bonjour,

    Pour ma part ça ne semble pas fonctionner.
    Les templates admins par défaut sont chez moi dans :
    « adminhtml\default\default » où l’on trouve alors les dossiers layout, locale et template.
    Pour « notre module » il ne faut pas les mettre ici ?
    Il faut comme tu le proposes les mettre dans un dossier « adminhtml\default\pfay\ où l’on trouvera layout et template ?
    la place de « pfay » ici n’est-ce pas normalement la place du thème ?

  2. Bonjour,

    si en fait, il faut que tu déclares le théme pfay comme le thème de ton admin Magento, sinon il faut que tu mettes les fichiers dans adminhtml\default\default\

    et pour le formulaire il faut que tu rajoute

    <input name="form_key" type="hidden" value="<?php echo Mage::getSingleton('core/session')->getFormKey() ?>"  />
    

    sinon ca ne marchera pas. Effectivement j’ai oublié de le préciser, je modifie l’article à l’instant.

    Merci ;)

    Pierre

  3. Bonjour, j’en suis a la fin de la partie 3 autrement dit, le menu devrait s’afficher dans la barre du backoffice, mais, rien n’a changé, et je ne vois vraiment pas pourquoi, j’ai bien changé tout les noms en fonction de mon module mais rien.
    Une idée d’où peux venir le problème ?

    Merci d’avance.

  4. J’ai refait le tuto avec le même nom de module que toi mais ça fait exactement la même chose.
    Mon problème à l’air de venir du fait qu’il ne trouve pas Adminhtml/IndexController.
    Car en fin de compte lorsque le met : monsite/Admintest/Adminhtml_index cela me redirige effectivement sur le backoffice mais sur le DashBoard.

  5. Probleme résolu, il venait du fait que Magento ajoutais des clé secrete aux URL si tel est le cas pour vous voila la marche a suivre :
    Système->Configuration->Admin :

    Ajouter la clé secrète aux URLS : NON

    En revanche je n’ai toujours pas de nouveaux lien dans le menu.

  6. verifie dans ton config.xml cette partie :

    <menu>
    <test translate="title" module="adminhtml">
       <title>Mes modules</title>
       <sort_order>100</sort_order>
       <children>
          <set_time>
             <title>Carnet d'adresse</title>
             <action>admintest/adminhtml_index</action>
           </set_time>
        </children>
    </test>
    </menu>
    

    je t’envoie un mail, je vais tenter de t’aider ;)

  7. Bon j’ai trouvé l’astuce :

    Dans Pfay/Test/etc/config.xml : Ne rien mettre entre les balise

    Créez un fichier adminhtml.xml dans Pfay/Test/etc/ et y mettre ceci :

    <?xml version="1.0"?>
    <config>
       <menu>
          <test translate="title" module="adminhtml">
             <title>Mes modules</title>
             <sort_order>1</sort_order>
             <children>
                 <set_time>
                       <title>Carnet d'adresse</title>
                       <action>admintest/adminhtml_index</action>
                  </set_time>
              </children>
           </test>
        </menu>
    </config>
    

    Autrement dit, le contenue de la précédente balise adminhtml.

    Et POUF… Ça marche, par contre me demandais pas pourquoi, je suis juste allé fouiner dans le core et ai vu que chez moi c’était fichu de la sorte.

    En tout cas merci a toi Pierre pour ton aide ;)

  8. bonjour tout le monde, j’ai suivi normalement le tuto, et vu les différents commentaires…

    J’ai bien vérifié mes noms, que le module soit bien vu sous magento !!! Aucun pb par contre qd je clique sur carnet d’adresse, j’obtiens 127.0.0.1/site_magento_1_4_1_1_chevillon/index.php/dluffy/adminhtml_index/index/key/973937e8dcf77b58c5686c86649ddff8/
    Donc je suis bien redirigé vers le bon lien par contre je n’ai pas accès à mon formulaire, ni de message d’erreur, j’obtiens juste une page blanche

  9. Super tuto, encore merci ;)

    Petit question pas très importante mais pourquoi l’onglet de se colorie pas en orange une fois que l’on est sur la page « Mes modules » ? Y’a t’il quelque chose en plus à faire ?

  10. J’avais une petite erreur du à cette partie (et à moi qui lit pas jusqu’au bout lol) :
    « Maintenant, modifiez le layout test.xml dans /app/design/adminhtml/default/Pfay/layout/  »

    Il serait peut êtr eplus judicieux de marquer de créer plutot que de modifier. Moi j’avais édité notre autre fichier test.xml du frontend. Forcémment ça ne marchait pas^^

    • ben oue mais les mecs si vous lisez pas jusqu’au bout on va pas s’en sortir…lol bon ben c’est bon alors tout marche bien du coup je suis rassuré ^^

  11. A savoir que j’ai configuré mon habillage comme suit (Portée : configuration par défaut):

    system > configuration > habillage > nom de l’interface :
    mon_interface

    et

    system > configuration > habillage > par défaut :
    (vide)

    Le tableau ne s’affiche pas que je mets les dossiers « layout » et « template » dans design/adminhtml/default/mon_interface

    Et il s’affiche bien lorsque je transferts « layout » et « template » dans design/adminhtml/default/default

    En gros mon application ne va pas chercher le layout dans l’interface défini dans le back office…

    Une idée ?

    Merci.

  12. Merci pour les tutos.

    par contre à ce stade, j’ai bien mon menu qui s’affiche dans la partie admin plutot j’ai bien l’onglet mais quand il s’agit de l’afficher…. y a plus rien…. error 404. j’ai désactivé l’insertion d’une clef secrète dans l’url ça ne change rien…alors je cherche je cherche…

  13. Bonjour Pierre;
    et merci pour le parfait tuto mais j’ai une question à poser concernant le fichier config.xml, vous avez dis q’il faut mettre ………. après et avan global cela veut dire qu’il faut le mettre de fois dans le code ou il y a une erreur, car apprès frontend il n’y a que c’est à dire la fin du fichier. Merci infiniment

  14. Bonjour Pierre et merci pour tous ces tutoriels bien utiles!

    Je viens de passer plusieurs heures sur un soucis avec pour cause une mauvaise lecture de ma part. Ceci étant en partie dû à l’utilisation récurrente du mot test je me permet d’apporter une petite precision qui pourra être utile à tout ceux qui ne voit pas leur block apparaitre dans leur page d’admin:

    Dans le layout (ici test.xml), la configuration de la page (ici test_adminhtml_index_index) correspond à NomDuRouter_adminhtml_NomDuController_Action. Voilà bonne continuation.

    • Merci Gawat ;) effectivement ca m’arrive souvent aussi lorsque je lit des tutoriels parfois j’oublis des détails et je passe beaucoups de temps pour trouver ou j’ai un soucis ^^ bon courrage pour la suite des tutos

  15. Bonjour,
    j’ai un petit souci lorsque je clic sur mon nouvelle élément dans le menu il me redirige bien vers la page
    monurl/test/adminhtml_index/ mais avec le thème du frontend et sans le formulaire. Quelqu’un a une idée?

  16. Bonjour (enfin re ;)

    Bon, tout fonctionne correctement (merci au passage à Kiwi pour virer l’ajout d’une clef secrète à l’URL).

    Mais un petit détail, si je me sers du formulaire, quand je clique sur « Save », (l’opération se déroule bien, je le vois après en revenant sur la page d’admin, le nom a bien été rajouté) mais je suis renvoyé sur le frontend après avoir cliqué sur « Save ».

    J’imagine que c’est en rapport avec Monblock.php mais je ne vois pas ce qu’il faut mettre pour que ça fonctionne, j’ai fais quelques tests en changeant des paramètres mais non concluant :)

  17. bonjour,
    tout d’abord je vous remercie pour ce guide. bon travail
    mais finalement j’ai un soucie au niveau de l’affichage du formulaire, sachant que je peux voir la rubrique dans l’espace admin le lien est bien rédigé a part ce message d’erreur « Exception printing is disabled by default for security reasons »
    qu’est ce que je peux faire??

  18. Merci Pierre pour ta réponse, mais maintenant j’ai une autre question ;) SVP
    on fait j’ai besoin de savoir comment je peux ajouter d’autres fichiers d’autres fonctions, je dois fait la déclaration ou exactement s’il faut la faire bien sur
    Merci infiniment :)

  19. Grand merci pour ces tutoriels ;)

    Dommage cependant que le nom « test » reviennent un peu trop souvent : à force on s’y perd et on finit pas ne plus savoir qui est quoi (Group name, Class name, controller… ?).

    @Pidoux75 : C’est dû à l’instruction $this->_redirect(‘test/index/index’); de la méthode saveAction() du controller Test_IndexController.

    2 solutions : soit trouver une solution pour connaître l’origine de la requête (et si on vient du back office, rediriger au bon endroit). Dans ce cas, on modifie cette même méthode saveAction().

    Ou soit créer une méthode saveAction() dans le controller du dossier Adminhtml.

  20. Merci Gawat, ça a résolu mon problème, j’avais mis test_adminhtml_index_index alors que j’avais renommé mon routeur pour qu’il soit unique par module.

  21. Pour ceux qui ne veulent pas utiliser le thème admin default/defaut, il faut modifier /app/etc/local.xml en ajoutant dans la balise :

    default

    VOTRE_THEME

  22. Salut Pierre, super tuto ;-)

    Par contre, j’ai un problème, quand je configure à NON le Add Store Code To URLs la page de backoffice de mon module s’affiche correctement, par contre dès que je mets à OUI ce paramètre, j’ai une 404.

    Je suis obligé de spécifier un code de magasin d’en l’URL (ex : http://mondomaine/admin/en/module/index/index à la place de : http://mondomaine/admin/admin/module/index/index)

    Aurais-tu une solution à ce problème ?

  23. Pour ceux qui n’arrivent pas a afficher le formulair :
    Ce tutoriel est fait en partant du principe que votre theme est definit dans le fichier config.xml de votre module.
    Soit :

    default

    Zouc

    Dans le tag . Lien : magentocommerce.com/wiki/4_-_themes_and_template_customization/admin/using_custom_admin_theme_templates et merci aussi a Erdal G qui nous met sur la piste.

    Autrment si vous voulez que ca marche sans ca, il faut utiliser le default/default au lieu de default/Pfay OU default/votreTheme.

Laisser un commentaire

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

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>