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



magento mageplaza (2)

Je me suis battue avec Magento depuis un mois ou deux et j'essaie toujours de le comprendre. C'est donc un cas d'aveugle conduisant 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 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 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. La nouvelle méthode de paiement a été une véritable révélation.

Pour le débogage, je recommande fortement d'utiliser FirePHP et de regarder votre source HTML quand quelque chose ne va pas. 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 complètement, je devrais écrire un livre pour la couvrir. Le mieux que je puisse faire est de vous donner des conseils que quelqu'un aurait souhaité que je vous 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. Afin de le faire fonctionner vos propres choses par opposition à la fonctionnalité de base, vous avez besoin du bon xml. Malheureusement, il n'y a pas de guide sur la façon de vous construire 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 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 utiliser 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 quelque chose appelé 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 le verrez utilisé comme un tableau glorifié pour transmettre des données d'une méthode à une autre.

Au cours du développement, assurez-vous que la mise en cache est désactivée. Cela rendra magento atrocement lent, mais cela vous épargnera beaucoup de traumatisme crânien (en le frappant sur votre bureau).

Vous verrez $this est beaucoup 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 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 suivi d'une méthode vous emmène à travers 5 à 10 classes différentes.

Lisez le guide du concepteur here . C'est principalement destiné 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 les «indications 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 ne devienne une dissertation.

https://src-bin.com

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 suis allé à http://example.com/myController il afficherait la chaîne 'Hello World'. Être capable 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 puis-je 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? Ensuite, utilisez le contrôleur pour inclure une vue qui afficherait cette ligne. Donc, aller sur http://example.com/myController/show_row (ou quelque chose de similaire) afficherait la ligne dans une vue. (Pas besoin d'être chic, 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.


Answer #1

Tout d'abord, je vous recommande fortement d'acheter le PDF / E-Book de PHP Architect . C'est US $ 20, mais c'est la seule ressource "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 n'êtes pas un programmeur expérimenté ou 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 que d'autres programmeurs peuvent construire des modules. Il n'a pas été conçu pour être facilement compris par des gens intelligents, mais qui ne sont pas des programmeurs.

Troisièmement, Magento MVC est très différent du modèle MVC de Ruby on Rails , de Django , de CodeIgniter , de CakePHP , etc. qui est populaire auprès des développeurs PHP ces jours-ci. Je pense que c'est basé sur le modèle Zend , et tout ça ressemble beaucoup à 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 module que vous utiliserez, donc piquer autour du code de base est une tactique d'apprentissage utile. En outre, une grande partie de ce que vous allez faire avec Magento remplacera les classes existantes. Ce que je couvre ici est de créer de nouvelles fonctionnalités, pas de surcharger. Gardez cela à l'esprit lorsque vous regardez les exemples de code disponibles.

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. Je pourrais avoir le temps plus tard pour les sujets liés au modèle / modèle, mais pour l'instant, je ne le fais pas. Je vais cependant parler 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 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 vaut mieux ne pas penser à saisir des données en utilisant des requêtes SQL brutes, sinon vous allez devenir fou.

Avertissement final. J'utilise Magento depuis environ deux ou trois semaines, donc caveat emptor. C'est un exercice qui me permet d'aller droit au but dans .

Créer un module

Toutes les additions et personnalisations à Magento sont faites à travers des modules. Donc, la première chose à faire est de créer un nouveau module. Créez un fichier XML dans l' 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 noms unique pour vos modifications, il ne doit pas être le nom de votre entreprise, mais que la convention recommandée mon 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 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 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 Advanced
  3. Dans la boîte de dialogue "Désactiver la sortie des modules", recherchez votre nouveau module nommé "MyCompanyName_HelloWorld"

Si vous pouvez vivre avec la performance ralentir, vous pouvez désactiver le cache de l'application pendant le développement / l'apprentissage. Rien n'est plus frustrant que d'oublier d'effacer le cache et de se demander pourquoi vos changements ne sont pas visibles.

Configurer la structure de répertoire

Ensuite, nous aurons besoin de configurer une structure de répertoire pour le module. Vous n'aurez pas besoin de tous ces répertoires, mais il n'y a pas de mal à tout 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 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 "vide".

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

Oversimplifying choses, ce fichier de configuration vous permettra de dire à Magento quel code vous voulez 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

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

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

devrait 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

Maintenant, essayez 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. C'est le contrôleur par défaut et 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 faire correspondre cette URL

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

Vous devrez avoir un FooController, ce 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. Donc, http://example.com/magento/index.php/helloworld/foo correspondra au contrôleur FooController et à l'action indexAction et PAS à l'action fooAction de l'IndexController. Si vous voulez avoir un fooAction, dans le contrôleur IndexController vous devez alors appeler ce contrôleur explicitement comme ceci: http://example.com/magento/index.php/helloworld/index/foo parce que la seconde partie de l'URL est et sera toujours le controllerName. Ce comportement est un héritage de Zend Framework fourni avec Magento.

Vous devriez maintenant être en mesure d'atteindre 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 envoie à un contrôleur. De là, je vous avais recommandé d'explorer les classes de contrôleurs Magento existantes pour voir comment les modèles et le système de template / layout devraient être utilisés.





controller