web-dev-qa-db-fra.com

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

Comment peut-on accomplir ce qui suit dans Magento?

  • Afficher un message "Hello World" en utilisant une approche contrôleur/vue/modèle. Donc, si je consultais http://example.com/myController, la chaîne "Hello World" serait affichée. Pouvoir afficher cette chaîne dans le modèle de mon site Web (par exemple, l'en-tête, le pied de page, etc.) constituera 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 utilisez ensuite le contrôleur pour inclure une vue, qui afficherait cette ligne. Donc, 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.

298
Click Upvote

Tout d’abord, je vous recommande vivement d’acheter le PDF/E-Book de PHP Architect }. C'est US $ 20, mais c'est la seule ressource simple "Voici comment Magento fonctionne" que j'ai pu trouver. J'ai aussi commencé à écrire 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 que vous n'avez pas accès à un programmeur expérimenté (idéalement dans 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’achats sur laquelle d’autres programmeurs peuvent construire des modules par-dessus. Il n'a pas été conçu pour être compris facilement par des personnes intelligentes mais qui ne sont pas des programmeurs.

Troisièmement, Magento MVC est très différent du Ruby on Rails , Django , CodeIgniter , CakePHP , etc. Le modèle MVC populaire avec PHP développeurs ces jours-ci. Je pense que cela est basé sur le modèle Zend , et le tout est très semblable à la POO Java. Vous devez vous préoccuper de deux contrôleurs. Le contrôleur module/frontName, puis le contrôleur MVC.

Quatrièmement, l'application Magento elle-même est conçue à l'aide du même système de modules que celui que vous utiliserez. Il est donc utile d'explorer le code principal. En outre, une grande partie de ce que vous allez faire avec Magento consiste à surcharger les classes existantes. Ce que je couvre ici, c'est créer une nouvelle fonctionnalité, sans la remplacer. Gardez cela à l'esprit lorsque vous consultez 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 relatifs aux modèles/modèles, mais pour l'instant, je ne les ai pas. Je vais toutefois aborder brièvement 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.

Déni final. J'utilise Magento depuis deux ou trois semaines environ, donc attention à tout. C’est un exercice qui m’aide à résoudre ce problème autant qu’à aider Stack Overflow.

Créer un module

Tous les ajouts et personnalisations à Magento se font par le biais de modules. La première chose à faire est donc de créer un nouveau module. Créez un fichier XML dans app/modules nommé 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, il ne doit pas nécessairement s'agir du nom de votre société, mais de la convention recommandée par magento. HelloWorld est le nom de votre module.

Effacer le cache de l'application

Maintenant que le fichier de module est en place, nous devrons en informer Magento (et consulter notre travail). Dans l'application admin

  1. Allez dans Système-> Gestion du cache
  2. Sélectionnez Actualiser dans le menu Tout le cache.
  3. Cliquez sur Enregistrer les paramètres du cache.

Maintenant, nous nous assurons que Magento connaisse le module

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

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

Configurer la structure de répertoire

Ensuite, nous devrons configurer une structure de répertoire pour le module. Vous n'aurez pas besoin de tous ces répertoires, mais rien ne vous empêche de les configurer 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 ajouter 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>

Ce fichier de configuration vous permettra de dire à Magento quel code vous souhaitez exécuter.

Mise en place du 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

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 est "toute URL avec le nom avant 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 cela maintenant.

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

Maintenant, essayez de charger la page. Le progrès! Au lieu d'un 404, vous aurez 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, elle ira toujours de cette façon http://example.com/magento/index.php/frontName/controllerName/actionName

Donc, si vous voulez correspondre à cette URL

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

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 .
 Donc http://example.com/magento/index.php/helloworld/foo correspondra au contrôleur FooController et à l'action indexAction et PAS à l'action fooAction de IndexController. Si vous voulez avoir fooAction, dans le contrôleur IndexController, vous devez alors appeler explicitement ce contrôleur de la manière suivante: 
http://example.com/magento/index.php/helloworld/index/foo car la deuxième partie de l’URL est et sera toujours le controllerName .
 Ce comportement est une l'héritage du Zend Framework fourni dans Magento.

Vous devriez maintenant pouvoir accéder aux URL suivantes et voir les résultats de vos instructions echo.

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

So, that should give you a basic idea on how Magento dispatches to a controller. From here I'd recommended poking at the existing Magento controller classes to see how models and the template/layout system should be used.

530
Alan Storm

Je lutte avec Magento depuis environ un mois et j'essaie encore de le comprendre. C'est donc un cas d'aveugle qui conduit l'aveugle. Il y a peu de documentation et le forum/wiki est au mieux chaotique. Non seulement cela, mais il existe plusieurs solutions qui sont soit dépassées 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 avez commencé par modifier les fonctionnalités existantes au lieu de créer quelque chose de complètement nouveau. Pour cela, je choisirais certainement les "articles recommandés pour les développeurs" dans le wiki. Le nouveau mode de paiement 1 a été une véritable révélation.

Pour le débogage, je recommanderais certainement avec FirePHP et consultez votre source HTML en cas de problème. La méthode de débogage ole echo ne fonctionne pas vraiment bien.

L'architecture générale est tellement complexe, que même si je la comprenais parfaitement, il me faudrait un livre pour le 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. Afin de le faire fonctionner par vous-même, par opposition aux fonctionnalités de base, vous avez besoin du bon fichier 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 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 telles que Mage::getModel('mymodel'), Mage::getSingleton('mysingleton'), Mage::helper('myhelper') pour renvoyer des objets de certaines classes. Il les trouve par défaut dans son espace de noms principal. Si vous voulez qu'il utilise les vôtres, vous devez les remplacer dans votre fichier config.xml.

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

Beaucoup d'objets dans Magento étendent finalement quelque chose appelé un Varien_Object. C’est une classe polyvalente (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 verrez qu'il est 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 incroyablement lent, mais cela vous évitera beaucoup de traumatismes à la tête (ne pas le taper sur votre bureau).

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

Notez les choses sur le papier. Beaucoup. Il y a d'innombrables petits faits 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 guide à travers 5 à 10 classes différentes.

Lisez le guide du concepteur ici . Cela concerne principalement les concepteurs graphiques, mais vous avez besoin de comprendre où et pourquoi la sortie de votre module aboutira. Pour cela, n'oubliez pas d'activer "Conseils de chemin de modèle" dans la section développeur du panneau d'administration.

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

38
Manos Dilaverakis

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 de base. cela aide simplement à accélérer les choses. 

2
Sajid

Un module Magento est un groupe de répertoires contenant des blocs, des contrôleurs, des aides et des modèles nécessaires à la création d'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 soutien pour influencer l'expérience utilisateur et l'apparence de la vitrine. Son cycle de vie 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 constituent l’unité centrale de la plate-forme Magento.

Déclaration de module

Nous devons déclarer le module en utilisant le fichier de configuration. En tant que Magento 2, recherchez le module de configuration dans le répertoire etc du module. Nous allons maintenant 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. Nous allons maintenant vérifier l'état du module et savoir s'il est activé ou désactivé à l'aide de 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 traversé le processus complet

0