En primer lugar, le recomiendo que compre el PDF / E-Book de PHP Architect . Es de US $ 20, pero es el único recurso sencillo "Así es como funciona Magento" que he podido encontrar. También comencé a escribir tutoriales de Magento en mi propio sitio web .
En segundo lugar, si tiene una opción y no es un programador experimentado o no tiene acceso a un programador experimentado (idealmente en PHP y Java), elija otro carrito . Magento está bien diseñado, pero fue diseñado para ser una solución de carrito de compras sobre la cual otros programadores pueden construir módulos. No fue diseñado para ser entendido fácilmente por personas que son inteligentes, pero que no son programadores.
En tercer lugar, Magento MVC es muy diferente de Ruby on Rails , Django , CodeIgniter , modelo MVC de CakePHP , etc. que es popular entre los desarrolladores de PHP en estos días. Creo que está basado en el modelo Zend , y todo es muy similar a OOP de Java. Hay dos controladores de los que debe preocuparse. El controlador del módulo / frontName y luego el controlador MVC.
En cuarto lugar, la aplicación Magento en sí está construida utilizando el mismo sistema de módulos que usará, por lo que hurgar en el código central es una táctica de aprendizaje útil. Además, mucho de lo que harás con Magento es anular las clases existentes. Lo que estoy cubriendo aquí es crear una nueva funcionalidad, no anular. Tenga esto en cuenta cuando vea las muestras de código que existen.
Comenzaré con su primera pregunta, que le mostrará cómo configurar un controlador / enrutador para responder a una URL específica. Esta será una pequeña novela. Es posible que tenga tiempo más tarde para los temas relacionados con el modelo / plantilla, pero por ahora, no. Sin embargo, hablaré brevemente sobre su pregunta SQL.
Magento usa un arquitectura de base de datos EAV . Siempre que sea posible, intente utilizar los objetos modelo que proporciona el sistema para obtener la información que necesita. Sé que todo está allí en las tablas SQL, pero es mejor no pensar en obtener datos utilizando consultas SQL sin formato, o se volverá loco.
Descargo de responsabilidad final. He estado usando Magento durante aproximadamente dos o tres semanas, así que tenga cuidado. Este es un ejercicio para aclarar esto tanto como para ayudar a Stack Overflow.
Crear un módulo
Todas las adiciones y personalizaciones a Magento se realizan a través de módulos. Entonces, lo primero que deberá hacer es crear un nuevo módulo. Cree un archivo XML con el app/modules
siguiente nombre
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 es un espacio de nombres único para sus modificaciones, no tiene que ser el nombre de su empresa, sino que la convención recomendada es mi magento. HelloWorld
es el nombre de tu módulo.
Borrar el caché de la aplicación
Ahora que el archivo del módulo está en su lugar, necesitaremos que Magento lo sepa (y verifique nuestro trabajo). En la aplicación admin
- Vaya a Sistema-> Gestión de caché
- Seleccione Actualizar en el menú Toda la caché
- Haga clic en Guardar configuración de caché
Ahora, nos aseguramos de que Magento conozca el módulo.
- Vaya a Sistema-> Configuración
- Haga clic en avanzado
- En el cuadro de configuración "Desactivar salida de módulos", busque su nuevo módulo llamado "MyCompanyName_HelloWorld"
Si puede vivir con la ralentización del rendimiento, es posible que desee desactivar el caché de la aplicación mientras desarrolla / aprende. Nada es más frustrante que olvidarse de limpiar el caché y preguntarse por qué sus cambios no se muestran.
Configurar la estructura del directorio
A continuación, necesitaremos configurar una estructura de directorio para el módulo. No necesitará todos estos directorios, pero no hay nada malo en configurarlos ahora.
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
Y agregue un archivo de configuración
touch app/code/local/MyCompanyName/HelloWorld/etc/config.xml
y dentro del archivo de configuración, agregue lo siguiente, que es esencialmente una configuración "en blanco".
<?xml version="1.0"?>
<config>
<modules>
<MyCompanyName_HelloWorld>
<version>0.1.0</version>
</MyCompanyName_HelloWorld>
</modules>
</config>
Simplificando demasiado las cosas, este archivo de configuración le permitirá decirle a Magento qué código desea ejecutar.
Configurar el enrutador
A continuación, necesitamos configurar los enrutadores del módulo. Esto le permitirá al sistema saber que estamos manejando cualquier URL en forma de
http://example.com/magento/index.php/helloworld
Entonces, en su archivo de configuración, agregue la siguiente sección.
<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>
Lo que estás diciendo aquí es "cualquier URL con el frontName de helloworld ...
http://example.com/magento/index.php/helloworld
debe usar el controlador frontName MyCompanyName_HelloWorld ".
Entonces, con la configuración anterior en su lugar, cuando cargue la página de helloworld anterior, obtendrá una página 404. Eso es porque no hemos creado un archivo para nuestro controlador. Hagámoslo ahora.
touch app/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php
Ahora intenta cargar la página. ¡Progreso! En lugar de un 404, obtendrá una excepción PHP / Magento
Controller file was loaded but class does not exist
Entonces, abra el archivo que acabamos de crear y pegue el siguiente código. El nombre de la clase debe basarse en el nombre que proporcionó en su enrutador.
<?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";
}
}
Lo que acabamos de configurar es el controlador de módulo / frontName. Este es el controlador predeterminado y la acción predeterminada del módulo. Si desea agregar controladores o acciones, debe recordar que la primera parte del árbol de una URL de Magento es inmutable, siempre irá de esta manerahttp://example.com/magento/index.php/frontName/controllerName/actionName
Entonces, si quieres hacer coincidir esta url
http://example.com/magento/index.php/helloworld/foo
Tendrá que tener un FooController, que puede hacer de esta manera:
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';
}
}
Tenga en cuenta que el controlador predeterminado IndexController y la acción predeterminada indexAction pueden ser implícitas pero deben ser explícitas si algo viene después. Por http://example.com/magento/index.php/helloworld/foo
lo tanto , coincidirá con el controlador FooController y la acción indexAction y NO con la acción fooAction del IndexController. Si desea tener una fooAction, en el controlador IndexController debe llamar a este controlador explícitamente de esta manera:
http://example.com/magento/index.php/helloworld/index/foo
porque la segunda parte de la URL es y siempre será el nombre del controlador. Este comportamiento es una herencia del Marco Zend incluido en Magento.
Ahora debería poder presionar las siguientes URL y ver los resultados de sus declaraciones de eco
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
Entonces, eso debería darle una idea básica sobre cómo Magento envía a un controlador. Desde aquí, recomendé hurgar en las clases de controladores Magento existentes para ver cómo deberían usarse los modelos y el sistema de plantilla / diseño.