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
- Allez dans Système->Gestion du cache
- Sélectionnez Rafraîchir dans le menu Tous les caches
- 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 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.