php - mageplaza - models magento 2
¿Cómo creo un módulo simple ''Hello World'' en Magento? (3)
En primer lugar, le recomiendo que compre el PDF / E-Book de PHP Architect . Es de US $ 20, pero es el único recurso directo "He aquí cómo funciona Magento" que he podido encontrar. También empecé a escribir tutoriales de Magento en mi propio sitio web .
Segundo, 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 que otros programadores pueden construir sobre módulos. No fue diseñado para ser comprendido fácilmente por personas inteligentes, pero que no son programadores.
En tercer lugar, Magento MVC es muy diferente del modelo de MVC 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 por los que debes preocuparte. El controlador de módulo / frontName, y luego el controlador MVC.
En cuarto lugar, la aplicación Magento se construye utilizando el mismo sistema de módulos que usarás, por lo que buscar el código principal es una táctica de aprendizaje útil. Además, gran parte de lo que harás con Magento está anulando las clases existentes. Lo que estoy cubriendo aquí es crear una nueva funcionalidad, no anular. Ten esto en cuenta cuando mires los ejemplos de código que hay.
Voy a 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. 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 de su pregunta SQL.
Magento utiliza una 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 de SQL, pero es mejor no pensar en capturar datos mediante consultas de SQL sin formato, o te volverás loco.
Renuncia final. He estado usando Magento durante aproximadamente dos o tres semanas, por lo tanto, caveat emptor. Este es un ejercicio para aclarar esto tanto como para ayudar a Stack Overflow.
Crear un modulo
Todas las adiciones y personalizaciones a Magento se realizan a través de módulos. Entonces, lo primero que debe hacer es crear un nuevo módulo. Cree un archivo XML en la app/modules
nombrados de la siguiente manera
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 compañía, sino la convención recomendada mi magento. HelloWorld
es el nombre de tu módulo.
Borrar la caché de la aplicación
Ahora que el archivo del módulo está en su lugar, deberemos informarle a Magento (y verificar nuestro trabajo). En la aplicación de administración.
- Ir a Sistema-> Gestión de caché
- Seleccione Actualizar en el menú Todas las caché.
- Haga clic en Guardar configuración de caché
Ahora, nos aseguramos de que Magento sepa sobre el módulo.
- Ir 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 el rendimiento más lento, es posible que desee desactivar el caché de la aplicación mientras desarrolla / aprende. Nada es más frustrante que olvidar el borrado de la memoria caché y preguntarse por qué no se muestran sus cambios.
Configurar la estructura del directorio
A continuación, necesitaremos configurar una estructura de directorios para el módulo. No necesitarás todos estos directorios, pero no hay 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 añada 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>
Para simplificar demasiado las cosas, este archivo de configuración le permitirá decirle a Magento qué código desea ejecutar.
Configurando 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 nombre de frente 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. Vamos a hacer eso ahora.
touch app/code/local/MyCompanyName/HelloWorld/controllers/IndexController.php
Ahora intenta cargar la página. ¡Progreso! En lugar de un 404, obtendrás 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.
<?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 son inmutables y siempre irán de esta manera http://example.com/magento/index.php/frontName/controllerName/actionName
Así que 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í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 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 será siempre el nombre del controlador. Este comportamiento es una herencia de 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é hojear las clases de controlador Magento existentes para ver cómo se deben usar los modelos y el sistema de plantillas / diseño.
¿Cómo se puede lograr lo siguiente en Magento?
Muestra un mensaje de "Hola mundo" utilizando un enfoque de controlador / vista / modelo. Entonces, si fuera a
http://example.com/myController
mostraría la cadena ''Hola mundo''. Ser capaz de mostrar esta cadena dentro de la plantilla de mi sitio web (por ejemplo, el encabezado, el pie de página, etc.) será una ventaja.¿Cómo agrego un método a este controlador (o un nuevo controlador si es necesario), que interactúa con un modelo y realiza la consulta
Select * FROM articles where id=''10''
y devuelve la fila (que contiene las columnasid, title, content
) al controlador? Y luego use el controlador para incluir una vista, que mostraría esta fila. Por lo tanto, ir ahttp://example.com/myController/show_row
(o algo similar) mostrará la fila dentro de una vista. (No es necesario que sea elegante, solo unecho $row->id;
o algo similar funcionaría).
Cualquier otra información sobre la estructura del código de Magento también será muy útil.
He estado luchando con Magento durante el último mes más o menos y todavía estoy tratando de averiguarlo. Así que este es un caso de ciegos guiando a los ciegos. Hay poca documentación y el foro / wiki es, en el mejor de los casos, caótico. No solo eso, sino que hay varias soluciones que están obsoletas o están lejos de ser óptimas. No estoy seguro de si tiene un proyecto o simplemente está intentando resolverlo, pero probablemente sea más fácil si comenzó a modificar 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 ver su fuente HTML cuando algo sale mal. El método de depuración ole echo no funciona realmente tan bien.
La arquitectura general es tan compleja, que incluso si la entendiera completamente, necesitaría escribir un libro para cubrirla. Lo mejor que puedo hacer es darte un consejo. 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 utiliza archivos de configuración que consisten en XML para decidir qué debe hacer. Para poder ejecutar tus propias cosas en lugar de la funcionalidad central, necesitas el xml correcto. Desafortunadamente no hay una guía sobre cómo construir tu XML; Necesitas ver ejemplos y hacer algunas pruebas serias. Para complicar las cosas, el contenido de estos archivos es en gran medida sensible a las mayúsculas y minúsculas. Sin embargo, si los domina, puede anular cualquier parte de la funcionalidad básica que lo convierte en un sistema muy potente.
Magento utiliza métodos como Mage::getModel(''mymodel'')
, Mage::getSingleton(''mysingleton'')
, Mage::helper(''myhelper'')
para devolver objetos de ciertas clases. Los encuentra por defecto en su espacio de nombres central. Si desea que use el suyo propio, debe reemplazar estos en su archivo config.xml
.
El nombre de tus clases debe corresponder a la carpeta en la que están.
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 permitirte definir tus propios métodos / variables sobre la marcha. Por ejemplo, verá que se utiliza como una matriz glorificada para pasar datos de un método a otro.
Durante el desarrollo, asegúrese de que el almacenamiento en caché esté deshabilitado. Hará que el magento sea insoportablemente lento, pero le ahorrará muchos traumas en la cabeza (por golpearlo en su escritorio).
Verás $this
siendo usado mucho. Significa una clase diferente dependiendo del archivo que lo veas. get_class($this)
es tu amigo, especialmente en conjunto con FirePHP.
Anote las cosas en un papel. Mucho. Hay innumerables pequeños factoids que necesitarás de 1 a 2 días después de que los encuentres.
Magento ama a OO. No se sorprenda si el seguimiento de un método lo lleva a través de 5-10 clases diferentes.
Lea la guía del diseñador here . Está pensado principalmente para diseñadores gráficos, pero lo necesita para comprender dónde y por qué terminará la salida de su módulo. Para ello, 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.
Prefiero recomendar Mage2Gen , esto te ayudará a generar el boiler y podrás concentrarte en la lógica de negocios. Simplemente ayuda a acelerar las cosas.