309 votes

Comment créer un simple module "Hello World" dans Magento ?

Comment réaliser ce qui suit dans Magento ?

  • Afficher un message "Hello World" en utilisant une approche contrôleur/vue/modèle. Donc, si je vais dans http://example.com/myController il affichera la chaîne "Hello World". La possibilité d'afficher cette chaîne dans le modèle de mon site Web (par exemple, dans l'en-tête, le pied de page, etc.) serait un bonus.

  • Comment ajouter une méthode à ce contrôleur (ou à un nouveau contrôleur si nécessaire), qui interagit avec un modèle, et exécute la requête Select * FROM articles where id='10' et renvoie la ligne (contenant les colonnes id, title, content ) au contrôleur ? Et ensuite utiliser le contrôleur pour inclure une vue, qui afficherait cette ligne. Donc, en allant dans http://example.com/myController/show_row (ou quelque chose de similaire) afficherait la ligne dans une vue. (Pas besoin d'être fantaisiste, juste une echo $row->id; ou quelque chose de similaire fonctionnerait).

Toute autre information sur la structure du code de Magento sera également très utile.

544voto

Alan Storm Points 82442

D'abord et avant tout, je vous recommande vivement d'acheter les PDF/E-Book de PHP Architect . Il coûte 20 dollars, mais c'est la seule ressource directe "Voici comment fonctionne Magento" que j'ai pu trouver. J'ai également commencé à écrire Tutoriels Magento sur mon propre site .

Deuxièmement, si vous avez le choix, et que vous n'êtes pas un programmeur expérimenté ou que vous n'avez pas accès à un programmeur expérimenté (idéalement en PHP et Java), choisir un autre chariot . Magento est bien conçu, mais il a été conçu pour être une solution de panier d'achat sur laquelle d'autres programmeurs peuvent construire des modules. Il n'a pas été conçu pour être facilement compris par des personnes intelligentes, mais qui ne sont pas des programmeurs.

Troisièmement, le MVC de Magento est très différent du Ruby on Rails , Django , CodeIgniter , CakePHP etc. Le modèle MVC qui est populaire auprès des développeurs PHP de nos jours. Je pense qu'il est basé sur le modèle Zend et l'ensemble est très proche du modèle Java OOP. Il y a deux des contrôleurs dont vous devez vous préoccuper. Le contrôleur module/frontName, et ensuite le contrôleur MVC.

Quatrièmement, l'application Magento elle-même est construite à l'aide du même système de modules que celui que vous utiliserez, de sorte que le fait de fouiller dans le code de base est une tactique d'apprentissage utile. En outre, une grande partie de ce que vous ferez avec Magento est Remplacement de les classes existantes. Ce que je couvre ici est créer une nouvelle fonctionnalité, pas un remplacement. Gardez cela à l'esprit lorsque vous examinez les échantillons de code disponibles.

Je vais commencer par votre première question, en vous montrant comment configurer un contrôleur/routeur pour répondre à une URL spécifique. Il s'agira d'un petit roman. J'aurai peut-être le temps plus tard d'aborder les sujets liés aux modèles et aux templates, mais pour l'instant, ce n'est pas le cas. Je vais cependant aborder brièvement votre question SQL.

Magento utilise un VAE l'architecture des bases de données. Dans la mesure du possible, essayez d'utiliser les objets du modèle fournis par le système pour obtenir les informations dont vous avez besoin. Je sais que tout est là dans les tables SQL, mais il est préférable de ne pas penser à saisir les données à l'aide de requêtes SQL brutes, sinon vous deviendrez fou.

Dernier avertissement. Je n'utilise Magento que depuis deux ou trois semaines, donc caveat emptor. C'est un exercice pour mettre les choses au clair dans ma tête autant que pour aider Stack Overflow.

Créer un module


Tous les ajouts et personnalisations de Magento se font par le biais de modules. La première chose que vous devez faire est donc de créer un nouveau module. Créez un fichier XML dans app/modules nommés comme suit

cd /path/to/store/app
touch etc/modules/MyCompanyName_HelloWorld.xml

<?xml version="1.0"?>
<config>
     <modules>
        <MyCompanyName_HelloWorld>
            <active>true</active>
            <codePool>local</codePool>
        </MyCompanyName_HelloWorld>
     </modules>
</config>

MyCompanyName est un espace de nom unique pour vos modifications, il ne doit pas nécessairement être le nom de votre entreprise, mais c'est la convention recommandée par Magento. HelloWorld est le nom de votre module.

Effacer le cache de l'application


Maintenant que le fichier du module est en place, nous devons le faire savoir à Magento (et vérifier notre travail). Dans l'application d'administration

  1. Allez dans Système->Gestion du cache
  2. Sélectionnez Rafraîchir dans le menu Tous les caches
  3. Cliquez sur Enregistrer les paramètres du cache

Maintenant, nous nous assurons que Magento connaît le module

  1. Allez dans Système->Configuration
  2. Cliquez sur Avancé
  3. Dans la boîte de réglage "Désactiver la sortie des modules", recherchez votre nouveau module nommé "MyCompanyName_HelloWorld".

Si vous pouvez supporter le ralentissement des performances, vous pouvez désactiver le cache de l'application pendant le développement et l'apprentissage. Rien n'est plus frustrant que d'oublier de vider le cache et de se demander pourquoi vos modifications n'apparaissent pas.

Configurer la structure du répertoire

Ensuite, nous devons établir une structure de répertoire pour le module. Vous n'aurez pas besoin de tous ces répertoires, mais il n'y a aucun mal à les mettre en place maintenant.

mkdir -p app/code/local/MyCompanyName/HelloWorld
mkdir -p app/code/local/MyCompanyName/HelloWorld/Block
mkdir -p app/code/local/MyCompanyName/HelloWorld/controllers
mkdir -p app/code/local/MyCompanyName/HelloWorld/Model
mkdir -p app/code/local/MyCompanyName/HelloWorld/Helper
mkdir -p app/code/local/MyCompanyName/HelloWorld/etc
mkdir -p app/code/local/MyCompanyName/HelloWorld/sql

Et ajoutez un fichier de configuration

touch app/code/local/MyCompanyName/HelloWorld/etc/config.xml

et dans le fichier de configuration, ajoutez ce qui suit, qui est essentiellement une configuration "vierge".

<?xml version="1.0"?>
<config>
    <modules>
        <mycompanyname_helloworld>
            <version>
                0.1.0
            </version>
        </mycompanyname_helloworld>
    </modules>
</config>

En simplifiant à l'extrême, ce fichier de configuration vous permettra d'indiquer à Magento le code que vous souhaitez exécuter.

Configurer le routeur

Ensuite, nous devons configurer les routeurs du module. Cela permettra au système de savoir que nous traitons toutes les URL sous forme de

http://example.com/magento/index.php/helloworld

Ainsi, dans votre fichier de configuration, ajoutez la section suivante.

<config>
<!-- ... -->
    <frontend>
        <routers>
            <!-- the <helloworld> tagname appears to be arbitrary, but by
            convention is should match the frontName tag below-->
            <helloworld>
                <use>standard</use>
                <args>
                    <module>MyCompanyName_HelloWorld</module>
                    <frontName>helloworld</frontName>
                </args>
            </helloworld>
        </routers>
    </frontend>
<!-- ... -->
</config>

Ce que vous dites ici est "toute URL avec le frontName de helloworld ...

http://example.com/magento/index.php/helloworld

doit utiliser le contrôleur frontName MyCompanyName_HelloWorld".

Donc, avec la configuration ci-dessus en place, lorsque vous chargez la page helloworld ci-dessus, vous obtiendrez une page 404. C'est parce que nous n'avons pas créé de fichier pour notre contrôleur. Faisons-le maintenant.

touch app/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php

Essayez maintenant de charger la page. Progrès ! Au lieu d'un 404, vous obtiendrez une exception PHP/Magento

Controller file was loaded but class does not exist

Ouvrez donc le fichier que nous venons de créer, et collez le code suivant. Le nom de la classe doit être basé sur le nom que vous avez fourni dans votre routeur.

class MyCompanyName_HelloWorld_IndexController extends Mage_Core_Controller_Front_Action{
    public function indexAction(){
        echo "We're echoing just to show that this is what's called, normally you'd have some kind of redirect going on here";
    }
}

Ce que nous venons de configurer est le contrôleur module/frontName. Ce n'est PAS le contrôleur MVC. Essayez l'URL suivante et vous obtiendrez un message 404, même si vous avez une méthode fooAction dans le contrôleur MyCompanyName_HelloWorld_IndexController.

http://example.com/magento/index.php/helloworld/foo

Donc, pour configurer le contrôleur MVC, créez un nouveau fichier, et entrez le code suivant (Oui, cela étend également le contrôleur Mage_Core_Controller_Front_Action, même si ce n'est pas une action frontale. Oui, c'est déroutant, mais je pensez à c'est comme ça que les choses se font)

touch app/code/local/MyCompanyName/HelloWorld/controllers/FooController.php
class MyCompanyName_HelloWorld_FooController extends Mage_Core_Controller_Front_Action{
    public function indexAction(){
        echo 'Foo Index Action';
    }

    public function addAction(){
        echo 'Foo add Action';
    }

    public function deleteAction(){
        echo 'Foo delete Action';
    }
}

Vous devriez maintenant être en mesure de cliquer sur les URL suivantes et de voir les résultats de vos déclarations d'écho.

http://example.com/magento/index.php/helloworld/foo
http://example.com/magento/index.php/helloworld/foo/add
http://example.com/magento/index.php/helloworld/foo/delete

Cela devrait vous donner une idée de base de la façon dont Magento envoie les données à un contrôleur. A partir de là, je vous recommande de vous pencher sur les classes de contrôleurs Magento existantes pour voir comment les modèles et le système de template/layout doivent être utilisés.

39voto

Manos Dilaverakis Points 4035

Je me débats avec Magento depuis environ un mois et j'essaie toujours de le comprendre. Il s'agit donc d'un cas où l'aveugle guide l'aveugle. Il y a peu de documentation et le forum/wiki est au mieux chaotique. De plus, il existe plusieurs solutions qui sont soit dépassées, soit loin d'être optimales. Je ne sais pas si vous avez un projet ou si vous essayez simplement de vous débrouiller, mais il est probablement plus facile de commencer par modifier les fonctionnalités existantes plutôt que de créer quelque chose de complètement nouveau. Pour cela, j'irais définitivement vers les "Articles recommandés pour les développeurs" dans le wiki. L'article sur les nouvelles méthodes de paiement m'a vraiment ouvert les yeux.

Pour le débogage, je recommande vivement en utilisant FirePHP et regarder votre source HTML quand quelque chose ne va pas. La bonne vieille méthode de débogage par écho ne fonctionne pas si bien que ça.

L'architecture générale est si complexe que, même si je la comprenais parfaitement, il me faudrait écrire un livre pour la couvrir. Le mieux que je puisse faire est de vous donner des conseils que j'aurais aimé que quelqu'un me donne quand j'ai commencé...

Restez à l'écart des fichiers de base. Ne les modifiez pas, écrivez plutôt votre propre module et remplacez ce dont vous avez besoin.

Magento utilise des fichiers de configuration composés de XML pour décider de ce qu'il doit faire. Pour que Magento exécute vos propres fonctions plutôt que les fonctions de base, vous devez utiliser le bon fichier XML. Malheureusement, il n'existe pas de guide sur la façon de construire votre XML ; vous devez regarder des exemples et faire quelques tests sérieux. Pour compliquer les choses, le contenu de ces fichiers est largement sensible à la casse. Cependant, si vous les maîtrisez, vous pouvez remplacer n'importe quelle partie de la fonctionnalité de base, ce qui en fait un système très puissant.

Magento utilise des méthodes comme Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper') pour retourner des objets de certaines classes. Il les trouve par défaut dans son espace de noms principal. Si vous voulez qu'il utilise le vôtre, vous devez les remplacer dans votre fichier config.xml.

Le nom de vos classes doit correspondre au dossier dans lequel elles se trouvent.

Un grand nombre d'objets dans Magento étendent finalement quelque chose appelé Varien_Object. Il s'agit d'une classe à usage général (un peu comme un couteau suisse) dont le but est de vous permettre de définir vos propres méthodes/variables à la volée. Par exemple, vous la verrez utilisée comme un tableau glorifié pour faire passer des données d'une méthode à une autre.

Pendant le développement, assurez-vous que la mise en cache est désactivée. Cela rendra Magento atrocement lent, mais cela vous évitera de nombreux traumatismes crâniens (en le frappant sur votre bureau).

Vous verrez que $this est souvent utilisé. Cela signifie une classe différente selon le fichier dans lequel vous le voyez. get_class($this) est votre ami, surtout en conjonction avec FirePHP.

Notez les choses sur papier. Beaucoup de choses. Il y a d'innombrables petits faits dont vous aurez besoin un ou deux jours après les avoir rencontrés.

Magento aime l'OO. Ne soyez pas surpris si le traçage d'une méthode vous fait passer par 5 à 10 classes différentes.

Lire le guide du concepteur ici . Il est principalement destiné aux graphistes, mais vous besoin de pour comprendre où et pourquoi la sortie de votre module aboutira. Pour cela, n'oubliez pas d'activer l'option "Template path hints" dans la section "developer" du panneau d'administration.

Il y a plus, mais je vais m'arrêter ici avant que cela ne se transforme en une dissertation.

4voto

jbotnik Points 11

Je développe un peu plus le point de vue de Matus :

exemple.com/magento/index.php/helloworld

pointe de manière transparente vers

exemple.com/magento/index.php/helloworld/index/index

Donc, en gros, vous avez la structure URI suivante pour les modules

exemple.com/magento/index.php/:module/:controller/:action/:param1[/:paramN ...]

4voto

Mark Shust Points 639

Cela pourrait aider quelqu'un. J'ai réalisé un screencast sur la façon de configurer Helloworld dans Magento. Certaines personnes travaillent mieux visuellement.

http://vimeo.com/37074797

2voto

Cela fait un moment qu'Alan n'a pas posté de message, mais il a bien répondu à cette question. J'ai passé un certain temps à travailler moi-même sur les contrôleurs. Il y a quelques commentaires relatifs à la substitution de contrôleurs existants dans le code source de Magento app/code/core/Mage/Core/Controller/Varien/Action.php.

Le code source de Magento est très propre et bien écrit, mais pas très bien commenté. Je recommande vivement l'utilisation de Nusphere PhpEd, car il est possible de suivre le code, de définir des points d'arrêt et d'examiner les objets, les variables, les tableaux, etc. pour découvrir ce que fait le code. Je trouve PhpEd incroyablement utile et nettement meilleur que FirePHP, mais il coûte quelques $$$. Cela dit, je ne voudrais pas m'en passer.

Assurez-vous d'utiliser PhpEd 5.6 build 5641 (la plus récente à ce jour) ou une version plus récente, car la version originale 5.6 comportait des bogues qui causaient des problèmes exaspérants de débogage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X