Nuestro grupo redactor ha pasado horas investigando la resolución a tu interrogante, te brindamos la solución por eso esperamos servirte de gran apoyo.
Solución:
En primer lugar, le recomiendo que compre el PDF / E-Book de PHP Architect. Cuesta 20 dólares, 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), elige otro carrito. Magento está bien diseñado, pero fue diseñado para ser una solución de carrito de compras sobre la que otros programadores pueden construir módulos. No fue diseñado para ser fácilmente entendido por personas inteligentes, pero que no son programadores.
En tercer lugar, Magento MVC es muy diferente del modelo MVC de Ruby on Rails, Django, CodeIgniter, 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 Java OOP. Hay dos controladores de los que debe preocuparse. El controlador module / frontName y luego el controlador MVC.
En cuarto lugar, la aplicación Magento en sí está construida con 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 primordial clases existentes. Lo que estoy cubriendo aquí es creando nueva funcionalidad, no invalidante. Tenga esto en cuenta cuando esté mirando los ejemplos de código que hay.
Comenzaré con su primera pregunta, mostrándole cómo configurar un controlador / enrutador para responder a una URL específica. Esta será una pequeña novela. Puede que tenga tiempo más tarde para los temas relacionados con el modelo / plantilla, pero por ahora, no lo tengo. Sin embargo, hablaré brevemente sobre su pregunta sobre SQL.
Magento utiliza una arquitectura de base de datos EAV. Siempre que sea posible, intente utilizar los objetos de modelo que proporciona el sistema para obtener la información que necesita. Sé que está todo en las tablas SQL, pero es mejor no pensar en capturar datos usando consultas SQL sin procesar, o te volverás loco.
Descargo de responsabilidad final. He estado usando Magento durante aproximadamente dos o tres semanas, así que advertencia emptor. Este es un ejercicio para aclarar esto en mi cabeza tanto como para ayudar a Stack Overflow.
Crea 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 en app/modules
nombrado de la siguiente manera
cd /path/to/store/app
touch etc/modules/MyCompanyName_HelloWorld.xml
true
local
MyCompanyName es un espacio de nombres único para sus modificaciones, no tiene que ser el nombre de su empresa, pero la convención recomendada es my magento. HelloWorld
es el nombre de su módulo.
Limpiar la caché de la aplicación
Ahora que el archivo del módulo está en su lugar, tendremos que informarle a Magento (y verificar nuestro trabajo). En la aplicación de administración
- 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 “Deshabilitar salida de módulos”, busque su nuevo módulo llamado “MyCompanyName_HelloWorld”
Si puede vivir con el rendimiento lento, es posible que desee desactivar la caché de la aplicación mientras desarrolla / aprende. Nada es más frustrante que olvidar borrar el caché y preguntarse por qué sus cambios no aparecen.
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 ningún problema en configurarlos todos 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 agrega 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”.
0.1.0
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.
MyCompanyName_HelloWorld
helloworld
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 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 intente cargar la página. ¡Progreso! En lugar de un 404, obtendrá una excepción de 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.
Lo que acabamos de configurar es el controlador module / 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 manera. http://example.com/magento/index.php/frontName/controllerName/actionName
Entonces, si quieres hacer coincidir esta URL
http://example.com/magento/index.php/helloworld/foo
Deberá tener un FooController, que puede hacer de esta manera:
touch app/code/local/MyCompanyName/HelloWorld/controllers/FooController.php
Tenga en cuenta que el controlador predeterminado IndexController y la acción predeterminada indexAction pueden ser implícitos, pero deben ser explícitos si algo viene después. Entonces http://example.com/magento/index.php/helloworld/foo
coincidirá con el controlador FooController y la acción indexAction y NO con la acción fooAction del IndexController. Si desea tener una acción foo, 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 será siempre el nombre del controlador. Este comportamiento es una herencia del Zend Framework incluido en Magento.
Ahora debería poder acceder a 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 se envía a un controlador. Desde aquí, recomendé examinar las clases de controladores de Magento existentes para ver cómo se deben usar los modelos y el sistema de plantilla / diseño.
He estado luchando con Magento durante el último mes y todavía estoy tratando de resolverlo. Así que este es el caso de un ciego guiando a otro ciego. Hay poca documentación y el foro / wiki es caótico en el mejor de los casos. No solo eso, sino que hay varias soluciones que están desactualizadas o lejos de ser óptimas. No estoy seguro de si tiene un proyecto o simplemente está tratando de resolverlo, pero probablemente sea más fácil si comenzó modificando la funcionalidad existente en lugar de crear algo completamente nuevo. Para eso definitivamente iría con los "Artículos recomendados para desarrolladores" en la wiki. El nuevo método de pago fue una verdadera revelación.
Para la depuración, definitivamente recomendaría usar FirePHP y mirar su fuente HTML cuando algo sale mal. El método de depuración de ole echo realmente no funciona tan bien.
La arquitectura general es tan increíblemente compleja que, incluso si la entendiera por completo, tendría que escribir un libro para cubrirla. Lo mejor que puedo hacer es darte un consejo que desearía que alguien me hubiera dado cuando empecé ...
Manténgase alejado de los archivos principales. No los modifique, en su lugar, escriba su propio módulo y anule lo que necesita.
Magento usa archivos de configuración que consisten en XML para decidir lo que necesita hacer. Para que ejecute sus propias cosas en lugar de la funcionalidad principal, necesita el xml correcto. Desafortunadamente, no hay una guía sobre cómo construir su XML; necesita mirar ejemplos y hacer algunas pruebas serias. Para complicar las cosas, el contenido de estos archivos distingue en gran medida entre mayúsculas y minúsculas. Sin embargo, si los domina, puede anular cualquier parte de la funcionalidad básica, lo que lo convierte en un sistema muy poderoso.
Magento usa métodos como Mage::getModel('mymodel')
, Mage::getSingleton('mysingleton')
, Mage::helper('myhelper')
para devolver objetos de ciertas clases. Los encuentra de forma predeterminada en su espacio de nombres principal. Si desea que utilice el suyo, debe anularlos en su config.xml
expediente.
El nombre de sus clases debe corresponder a la carpeta en la que se encuentran.
Muchos de los objetos en Magento finalmente extienden algo llamado Varien_Object
. Esta es una clase de propósito general (algo así como una navaja suiza) y su propósito en la vida es permitirle definir sus propios métodos / variables sobre la marcha. Por ejemplo, lo verá usado como un glorificado array para pasar datos de un método a otro.
Durante el desarrollo, asegúrese de que el almacenamiento en caché esté desactivado. Hará que magento sea insoportablemente lento, pero te evitará muchos traumatismos en la cabeza (de golpear tu escritorio).
Verás $this
siendo utilizado mucho. Significa una clase diferente dependiendo del archivo que veas. get_class($this)
es su amigo, especialmente en conjunto con FirePHP.
Anote las cosas en un papel. Mucho. Hay innumerables pequeños hechos que necesitará 1-2 días después de encontrarlos.
A Magento le encanta OO. No se sorprenda si el rastreo de un método lo lleva a través de 5 a 10 clases diferentes.
Lea la guía del diseñador aquí. Está destinado principalmente a diseñadores gráficos, pero necesitar para comprender dónde y por qué terminará la salida de su módulo. Para eso, no olvide activar "Sugerencias de ruta de plantilla" en la sección de desarrolladores del panel de administración.
Hay más, pero me detendré aquí antes de que esto se convierta en una disertación.
Preferiría recomendar Mage2Gen, esto lo ayudará a generar el modelo estándar y puede concentrarse en la lógica empresarial central. solo ayuda a acelerar las cosas.
valoraciones y comentarios
Si haces scroll puedes encontrar las referencias de otros administradores, tú además tienes el poder mostrar el tuyo si te gusta.