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


305

Comment effectuer les opérations suivantes dans Magento?

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

  • Comment ajouter une méthode à ce contrôleur (ou un nouveau contrôleur si nécessaire), qui interagit avec un modèle, 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 puis utilisez le contrôleur pour inclure une vue, qui afficherait cette ligne. Aller à http://example.com/myController/show_row(ou quelque chose de similaire) afficherait la ligne dans une vue. (Pas besoin d'être sophistiqué, juste un echo $row->id;ou quelque chose de similaire fonctionnerait.)

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


6
Il semble que le système ne reconnaisse pas votre prime.
Alan Storm

2
Je ne peux pas encore ouvrir la prime car elle n'a pas 48 heures .. mais je l'ouvrirai dès que je le pourrai et je l'attribuerai à la meilleure réponse
Cliquez sur Upvote le

Ah, je ne savais pas que les primes s'appliquaient uniquement aux anciens postes, excuses.
Alan Storm

3
Enfant, il avait toujours une attirance pour les magents; son code fonctionne de la même manière.
vol7ron

Réponses:


539

Tout d'abord, je vous recommande fortement d'acheter le PDF / E-Book auprès de PHP Architect . C'est 20 $ US, mais c'est la seule ressource simple "Voici comment fonctionne Magento" que j'ai pu trouver. J'ai également commencé à écrire des tutoriels Magento sur mon propre site Web .

Deuxièmement, si vous avez le choix et que vous n'êtes pas un programmeur expérimenté ou si vous n'avez pas accès à un programmeur expérimenté (idéalement en PHP et Java), choisissez un autre panier . Magento est bien conçu, mais il a été conçu pour être une solution de panier d'achat que d'autres programmeurs peuvent créer 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, Magento MVC est très différent du modèle MVC Ruby on Rails , Django , CodeIgniter , CakePHP , etc. qui est populaire auprès des développeurs PHP de nos jours. Je pense qu'il est basé sur le modèle Zend , et le tout est très semblable à Java OOP. Il y a deux contrôleurs dont vous devez vous préoccuper. Le contrôleur module / frontName, puis le contrôleur MVC.

Quatrièmement, l'application Magento elle-même est construite en utilisant le même système de modules que vous utiliserez, donc fouiller autour du code principal est une tactique d'apprentissage utile. En outre, une grande partie de ce que vous ferez avec Magento remplace les classes existantes. Ce que je couvre ici, c'est la création de nouvelles fonctionnalités, pas la substitution. Gardez cela à l'esprit lorsque vous regardez les exemples de code.

Je vais commencer par votre première question, vous montrant comment configurer un contrôleur / routeur pour répondre à une URL spécifique. Ce sera un petit roman. J'aurai peut-être du temps plus tard pour les sujets liés au modèle / modèle, mais pour l'instant, je n'en ai pas. Je parlerai cependant brièvement de votre question SQL.

Magento utilise une architecture de base de données EAV . Dans la mesure du possible, essayez d'utiliser les objets de 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 vaut mieux ne pas penser à récupérer des données à l'aide de requêtes SQL brutes, sinon vous deviendrez fou.

Clause de non-responsabilité finale. J'utilise Magento depuis environ deux ou trois semaines, alors mettez en garde Emptor. C'est un exercice pour obtenir ce droit dans ma tête autant que pour aider Stack Overflow.

Créer un module

Tous les ajouts et personnalisations à Magento se font via des modules. Donc, la première chose que vous devrez faire est de créer un nouveau module. Créez un fichier XML dans app/modulesnommé 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 noms unique pour vos modifications, ce n'est pas nécessairement le nom de votre entreprise, mais c'est la convention recommandée mon magento. HelloWorldest le nom de votre module.

Vider le cache de l'application

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

  1. Allez dans Système-> Gestion du cache
  2. Sélectionnez Actualiser dans le menu All Cache
  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 configuration "Désactiver la sortie des modules", recherchez votre nouveau module nommé "MyCompanyName_HelloWorld"

Si vous pouvez vivre avec un ralentissement des performances, vous souhaiterez peut-être désactiver le cache d'application pendant le développement / l'apprentissage. Rien n'est plus frustrant qu'oublier l'effacement du cache et se demander pourquoi vos modifications n'apparaissent pas.

Configurer la structure du répertoire

Ensuite, nous devrons configurer une structure de répertoires pour le module. Vous n'aurez pas besoin de tous ces répertoires, mais il n'y a aucun mal à les configurer tous maintenant.

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 à l'intérieur du 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>

Sur-simplifiant les choses, ce fichier de configuration vous permettra de dire à Magento quel code vous souhaitez exécuter.

Configuration du routeur

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

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

Donc, 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, c'est "n'importe quelle URL avec le frontName de helloworld ...

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

doit utiliser le contrôleur frontName MyCompanyName_HelloWorld ".

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

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

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

Controller file was loaded but class does not exist

Alors, ouvrez 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.

<?php
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. Il s'agit du contrôleur par défaut et de l'action par défaut du module. Si vous souhaitez ajouter des contrôleurs ou des actions, vous devez vous rappeler que la première partie de l'arborescence d'une URL Magento est immuable, ils iront toujours de cette façonhttp://example.com/magento/index.php/frontName/controllerName/actionName

Donc, si vous voulez faire correspondre cette URL

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

Vous devrez avoir un FooController, que vous pouvez faire de cette façon:

touch app/code/local/MyCompanyName/HelloWorld/controllers/FooController.php
<?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';
    }
}

Veuillez noter que le contrôleur par défaut IndexController et l'action par défaut indexAction peuvent être implicites mais doivent être explicites si quelque chose vient après. Il en http://example.com/magento/index.php/helloworld/foosera de même pour le contrôleur FooController et l'action indexAction et NON l'action fooAction de l'IndexController. Si vous voulez avoir une fooAction, dans le contrôleur IndexController, vous devez alors appeler ce contrôleur explicitement comme ceci: http://example.com/magento/index.php/helloworld/index/fooparce que la deuxième partie de l'URL est et sera toujours controllerName. Ce comportement est un héritage du Zend Framework fourni dans Magento.

Vous devriez maintenant pouvoir frapper les URL suivantes et 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

Donc, cela devrait vous donner une idée de base sur la façon dont Magento est envoyé à un contrôleur. À partir de là, j'avais recommandé de fouiller dans les classes de contrôleurs Magento existantes pour voir comment les modèles et le système de modèle / disposition devraient être utilisés.


4
Merci, ceci est très utile. Veuillez envisager d'ajouter des informations sur l'utilisation du modèle / de la base de données et des vues pour que votre réponse soit complète
Cliquez sur Upvote

7
assurez-vous que l'application / code / local / MyCompanyName / HelloWorld / etc / config.xml a le même cas que le xml situé dans etc / modules (MyCompanyName_HelloWorld NOT mycompanyname_helloworld) sinon il y aura des entrées dans le backend!
Moak

8
J'ai juste un petit commentaire sur la réponse parfaite d'Alan: "Ce que nous venons de configurer est le contrôleur module / frontName. Ce n'est PAS le contrôleur MVC." C'est exactement le même type de contrôleur que FooController. Dans l'action d'indexation ZF dans IndexController est appelée par défaut, donc demander example.com/magento/index.php/helloworld appellera IndexController :: indexAction () dans le module helloworld. Ainsi, appeler ... / helloworld / foo va essayer de trouver FooController dans le module helloworld et appeler indexAction () dessus. Pour déclencher IndexController :: fooAction (), vous devez demander: ... / helloworld / index / foo.
Matus Zeman

2
assurez-vous de lire la réponse de @Matus Zeman pour comprendre pourquoi fooAction n'a pas été trouvé sur IndexController, c'est juste une chose "normale" Zend Framework MVC / routeur et vous avez utilisé la mauvaise URL, vous devez donc supprimer le "Ce n'est PAS le Contrôleur MVC "sur votre réponse.
regilero

2
@ hypervisor666 Activez le "mode développeur" (google it). Lorsque le mode développeur est activé, Magento se bloque sur toutes les erreurs dans les fichiers XML.
Alan Storm

39

Je lutte avec Magento depuis environ un mois et j'essaie toujours de comprendre. Il s'agit donc d'un cas où des aveugles conduisent des aveugles. Il y a peu de documentation et le forum / wiki est au mieux chaotique. Non seulement cela, mais il existe plusieurs solutions obsolètes ou loin d'être optimales. Je ne sais pas si vous avez un projet ou si vous essayez simplement de le comprendre, mais c'est probablement plus facile si vous commencez par modifier des fonctionnalités existantes plutôt que de créer quelque chose de complètement nouveau. Pour cela, j'irais certainement avec les "articles recommandés pour les développeurs" dans le wiki. Le nouveau mode de paiement a été une véritable révélation.

Pour le débogage, je recommanderais certainement d' utiliser FirePHP et de regarder votre source HTML en cas de problème. La méthode de débogage de l'écho olé ne fonctionne pas vraiment bien.

L'architecture générale est si incroyablement complexe, que même si je la comprenais complètement, j'aurais besoin d'é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é ...

Éloignez-vous 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 pouvoir exécuter vos propres trucs par opposition aux fonctionnalités de base, vous avez besoin du bon xml. Malheureusement, il n'y a pas de guide sur la façon de construire votre XML; vous devez regarder des exemples et faire des 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 des fonctionnalités 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 souhaitez qu'il utilise le vôtre, vous devez les remplacer dans votre config.xmlfichier.

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

Beaucoup d'objets dans Magento étendent finalement ce que l'on appelle un Varien_Object. C'est une classe à usage général (un peu comme un couteau suisse) et son but dans la vie est de vous permettre de définir vos propres méthodes / variables à la volée. Par exemple, vous le verrez utilisé comme un tableau glorifié pour transmettre 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 beaucoup de traumatismes crâniens (de le frapper sur votre bureau).

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

Notez les choses sur papier. Beaucoup. Il y a d'innombrables petits factoids dont vous aurez besoin 1-2 jours après les avoir rencontrés.

Magento aime OO. Ne soyez pas surpris si le traçage d'une méthode vous mène à travers 5 à 10 classes différentes.

Lisez le guide du designer ici . Il est destiné principalement aux graphistes, mais vous en avez besoin pour comprendre où et pourquoi la sortie de votre module se terminera. Pour cela, n'oubliez pas d'activer "Astuces de chemin de modèle" dans la section développeur du panneau d'administration.

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


Veuillez poster plus si vous le pouvez, toutes les informations sont très utiles :)
Cliquez sur Upvote

Misa, vous devriez probablement vous inscrire ici sur Stackoverflow, si vous avez perdu votre cookie, tout votre représentant serait parti;)
Cliquez sur Upvote le

Je vous remercie! C'est très utile. Ner
Ner

2

Je recommanderai plutôt Mage2Gen , cela vous aidera à générer le passe-partout et vous pourrez simplement vous concentrer sur la logique métier principale. cela aide simplement à accélérer les choses.


0

Un module Magento est un groupe de répertoires contenant des blocs, des contrôleurs, des assistants et des modèles qui sont nécessaires pour créer une fonctionnalité de magasin spécifique. C'est l'unité de personnalisation de la plateforme Magento. Les modules Magento peuvent être créés pour exécuter plusieurs fonctions avec une logique de prise en charge pour influencer l'expérience utilisateur et l'apparence de la vitrine. Il a un cycle de vie qui leur permet d'être installés, supprimés ou désactivés. Du point de vue des commerçants et des développeurs d'extensions, les modules sont l'unité centrale de la plate-forme Magento.

Déclaration de module

Nous devons déclarer le module en utilisant le fichier de configuration. Comme Magento 2, recherchez le module de configuration dans le répertoire etc du module. Alors maintenant, nous allons créer le fichier de configuration module.xml.

Le code ressemblera à ceci:

<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Cloudways_Mymodule" setup_version="1.0.0"></module> </config>

Enregistrement du module Le module doit être enregistré dans le système Magento 2 à l'aide de la classe Magento Component Registrar. Nous allons maintenant créer le fichier registration.php dans le répertoire racine du module:

app/code/Cloudways/Mymodule/registration.php

Le code ressemblera à ceci:

?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Cloudways_Mymodule',
__DIR__
);

Vérifier l'état du module Après avoir suivi les étapes ci-dessus, nous aurions créé un module simple. Maintenant, nous allons vérifier l'état du module et s'il est activé ou désactivé en utilisant la ligne de commande suivante:

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

Partagez vos commentaires une fois que vous avez terminé le processus


0

J'essayais de faire mon module à partir du tutoriel magaplaza hello world, mais quelque chose s'est mal passé. J'ai importé le code de ce module https://github.com/astorm/magento2-hello-world de github et cela a fonctionné. à partir de ce module, je l'ai créé un module sous-catégories de catégories ajax select drop downs. Après l'avoir installé dans le répertoire aap / code de votre installation magento2, suivez cette URL. Http://www.example.com/hello_mvvm/hello/world Vous pouvez télécharger son code ici https://github.com/sanaullahAhmad/Magento2_cat_subcat_ajax_select_dropdowns et placez-le dans votre dossier aap / code. que d'exécuter ces commandes ...

php bin/magento setup:update
php bin/magento setup:static-content:deploy -f
php bin/magento c:c

Vous pouvez maintenant vérifier la fonctionnalité du module avec l'URL suivante http: // {{www.example.com}} / hello_mvvm / hello / world


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.