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/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, ce n'est pas nécessairement le nom de votre entreprise, mais c'est la convention recommandée mon magento. HelloWorld
est 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
- Allez dans Système-> Gestion du cache
- Sélectionnez Actualiser dans le menu All Cache
- Cliquez sur Enregistrer les paramètres du cache
Maintenant, nous nous assurons que Magento connaît le module
- Allez dans Système-> Configuration
- Cliquez sur Avancé
- 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/foo
sera 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/foo
parce 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.