¿Cómo creo un módulo simple 'Hello World' en Magento?

305

¿Cómo se puede lograr lo siguiente en Magento?

  • Muestre un mensaje de "Hola mundo" utilizando un enfoque de controlador / vista / modelo. Entonces, si http://example.com/myControllerfuera, mostraría la cadena 'Hello World'. Poder 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, realiza la consulta Select * FROM articles where id='10'y devuelve la fila (que contiene las columnas id, title, content) al controlador? Y luego use el controlador para incluir una vista, que mostraría esta fila. Entonces ir a http://example.com/myController/show_row(o algo similar) mostraría la fila dentro de una vista. (No es necesario ser elegante, solo una echo $row->id;o algo similar funcionaría).

Cualquier otra información sobre la estructura del código de Magento también será muy útil.

Haga clic en Votación a favor
fuente
66
Parece que el sistema no está reconociendo tu recompensa.
Alan Storm
2
Todavía no puedo abrir la recompensa porque no tiene 48 horas ... pero la abriré tan pronto como pueda y la
otorgaré
Ah, no sabía que las recompensas solo se aplicaban a publicaciones antiguas, disculpas.
Alan Storm
3
Cuando era niño, siempre tuvo una gravitación hacia los magos; Su código funciona de la misma manera.
vol7ron

Respuestas:

539

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/modulessiguiente 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. HelloWorldes 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

  1. Vaya a Sistema-> Gestión de caché
  2. Seleccione Actualizar en el menú Toda la caché
  3. Haga clic en Guardar configuración de caché

Ahora, nos aseguramos de que Magento conozca el módulo.

  1. Vaya a Sistema-> Configuración
  2. Haga clic en avanzado
  3. 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/foolo 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.

Alan Storm
fuente
44
Gracias, esto es muy útil. Considere agregar alguna información sobre el uso de modelos / bases de datos y vistas para que su respuesta pueda completarse
Haga clic en Votación a favor
77
asegúrese de que la aplicación / código / local / MyCompanyName / HelloWorld / etc / config.xml tenga el mismo caso que el xml ubicado en etc / modules (MyCompanyName_HelloWorld NO mycompanyname_helloworld) de lo contrario habrá entradas en el backend.
Moak
8
Solo tengo un pequeño comentario sobre la respuesta perfecta de Alan: "Lo que acabamos de configurar es el controlador de módulo / nombre frontal. Este NO es el controlador MVC". Es exactamente el mismo tipo de controlador que FooController. En ZF, la acción de índice en IndexController se llama por defecto, por lo que solicitar example.com/magento/index.php/helloworld llamará a IndexController :: indexAction () en el módulo helloworld. Llamando así ... / helloworld / foo intentará encontrar FooController en el módulo helloworld y llamará a indexAction () en él. Para activar IndexController :: fooAction () necesita solicitar: ... / helloworld / index / foo.
Matus Zeman
2
asegúrese de leer la respuesta de @Matus Zeman para comprender por qué fooAction no se encontró en el IndexController, es solo una cosa 'normal' de Zend Framework MVC / router y usó la URL incorrecta, por lo que debe eliminar la "Esta NO es la Controlador MVC "parte de su respuesta.
regilero
2
@ hypervisor666 Active "modo desarrollador" (google it). Con el modo de desarrollador activado, Magento se bloqueará ante cualquier error en los archivos XML.
Alan Storm
39

He estado luchando con Magento durante el último mes más o menos y todavía estoy tratando de resolverlo. Entonces este es un caso de ciegos guiando a los ciegos. 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ó 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 mirar su fuente HTML cuando algo sale mal. El método de depuración de eco ole realmente no funciona tan bien.

La arquitectura general es tan intrincadamente compleja, que incluso si la entendiera completamente, necesitaría escribir un libro para cubrirla. Lo mejor que puedo hacer es darte un consejo que desearía que alguien me hubiera dado cuando comencé ...

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 que pueda ejecutar sus propias cosas en lugar de la funcionalidad central, necesita el xml correcto. Desafortunadamente no hay una guía sobre cómo construir tu XML; necesitas mirar ejemplos y hacer algunas pruebas serias. Para complicar las cosas, el contenido de estos archivos distingue entre mayúsculas y minúsculas. Sin embargo, si domina estos, 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')a devolver objetos de ciertas clases. Los encuentra por defecto en su espacio de nombres principal. Si desea que use los suyos, debe anularlos en su config.xmlarchivo.

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 a 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, verá que se usa 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 extremadamente lento, pero te ahorrará mucho trauma en la cabeza (de golpearlo en tu escritorio).

Verás que te $thisusan mucho. Significa una clase diferente dependiendo de qué archivo lo veas. get_class($this)es tu amigo, especialmente en conjunción con FirePHP.

Anote las cosas en papel. Mucho. Hay innumerables pequeños hechos que necesitarás 1-2 días después de que los encuentres.

Magento ama a OO. No se sorprenda si rastrear un método lo lleva a través de 5-10 clases diferentes.

Lea la guía del diseñador aquí . Está destinado principalmente a diseñadores gráficos, pero lo necesita 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 desarrollador del panel de administración.

Hay más, pero me detendré aquí antes de que esto se convierta en una disertación.

Manos Dilaverakis
fuente
Si puede, publique más, toda la información es muy útil :)
Haga clic en Votar a favor
Misa, probablemente deberías registrarte aquí en Stackoverflow, si perdieras tu cookie, todo tu representante se habría ido;)
Haz clic en Votar a favor
¡Gracias! Esto es muy útil. Ner
Ner
2

Prefiero recomendar Mage2Gen , esto lo ayudará a generar la repetitiva y puede concentrarse en la lógica comercial central. solo ayuda a acelerar las cosas.

Sajid
fuente
0

Un módulo de Magento es un grupo de directorios que contiene bloques, controladores, ayudantes y modelos que se necesitan para crear una característica de tienda específica. Es la unidad de personalización en la plataforma Magento. Los módulos Magento se pueden crear para realizar múltiples funciones con lógica de soporte para influir en la experiencia del usuario y la apariencia de la tienda. Tiene un ciclo de vida que les permite instalarse, eliminarse o deshabilitarse. Desde la perspectiva de los comerciantes y desarrolladores de extensiones, los módulos son la unidad central de la plataforma Magento.

Declaración de módulo

Tenemos que declarar el módulo utilizando el archivo de configuración. Como Magento 2, busque el módulo de configuración en el directorio, etc. del módulo. Así que ahora crearemos el archivo de configuración module.xml.

El código se verá así:

<?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Cloudways_Mymodule" setup_version="1.0.0"></module> </config>

Registro del módulo El módulo debe estar registrado en el sistema Magento 2 utilizando la clase Magento Component Registrar. Ahora crearemos el archivo registration.php en el directorio raíz del módulo:

app/code/Cloudways/Mymodule/registration.php

El Código se verá así:

?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Cloudways_Mymodule',
__DIR__
);

Verificar el estado del módulo Después de seguir los pasos anteriores, habríamos creado un módulo simple. Ahora vamos a verificar el estado del módulo y si está habilitado o deshabilitado utilizando la siguiente línea de comando:

php bin/magento module:status

php bin/magento module:enable Cloudways_Mymodule

Comparta sus comentarios una vez que haya completado el proceso completo

AbdurRahman Lakhani
fuente
0

Estaba tratando de hacer mi módulo de magaplaza hello world tutorial, pero algo salió mal. Importé el código de este módulo https://github.com/astorm/magento2-hello-world desde github y funcionó. a partir de ese módulo, lo creé un subcategorías categorías ajax select desplegable Módulo. Después de instalarlo en el directorio aap / code de su instalación de magento2, siga esta URL. Http://www.example.com/hello_mvvm/hello/world Puede descargar su código desde aquí https://github.com/sanaullahAhmad/Magento2_cat_subcat_ajax_select_dropdowns y colóquelo en su carpeta aap / code. que ejecutar estos comandos ...

php bin/magento setup:update
php bin/magento setup:static-content:deploy -f
php bin/magento c:c

Ahora puede verificar la funcionalidad del módulo con la siguiente URL http: // {{www.example.com}} / hello_mvvm / hello / world

Sanaullah Ahmad
fuente