¿Cómo creo un módulo simple 'Hola mundo' en Magento?

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

  • Muestre un mensaje "Hola mundo" usando 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, 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 columnas id, title, content) al controlador? Y luego use el controlador para incluir una vista, que mostraría esta fila. Así que yendo a http://example.com/myController/show_row (o algo similar) mostraría la fila dentro de una vista. (No hay necesidad de ser elegante, solo un 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.

preguntado el 23 de febrero de 09 a las 06:02

Parece que el sistema no está reconociendo su recompensa. -

No puedo abrir la recompensa todavía porque no tiene 48 horas de antigüedad ... pero la abriré tan pronto como pueda y la otorgaré a la mejor respuesta:

Ah, no sabía que las recompensas solo se aplicaban a publicaciones más antiguas, disculpas. -

Cuando era niño, siempre le atraían los magos; su código funciona de la misma manera. -

Siga este enlace para crear un módulo simple: rohanhapani.com/create-a-simple-module-in-magento-2 -

6 Respuestas

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. Yo tambien 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 que lo entiendan fácilmente las personas que son inteligentes, pero que no son programadores.

En tercer lugar, Magento MVC es muy diferente del Ruby on Rails, Django, CodeIgniter, CakePHP, etc. Modelo MVC que es popular entre los desarrolladores de PHP en estos días. Creo que se basa en el Zend modelo, 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 anulación clases existentes. Lo que estoy cubriendo aquí es la creación nueva funcionalidad, no invalidante. Tenga esto en cuenta cuando esté mirando los ejemplos de código que hay.

Comenzaré con su primera pregunta y 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 sobre su pregunta sobre SQL.

Magento usa un EAV arquitectura de base de datos. 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
<?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, pero la convención recomendada es my magento. HelloWorld es el nombre de su módulo.

Borrar el 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

  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. Clic Avanzado
  3. 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 nada de malo 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".

<?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 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.

<?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 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
<?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 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é hurgar en las clases de controladores Magento existentes para ver cómo se deben usar los modelos y el sistema de plantilla / diseño.

Respondido 03 Oct 17, 23:10

Gracias, esto es muy útil. Considere agregar información sobre el uso del modelo / base de datos y las vistas para que su respuesta pueda ser completa: Haga clic en Upvote

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

Solo tengo un pequeño comentario sobre la respuesta perfecta de Alan: "Lo que acabamos de configurar es el controlador module / frontName. Este NO es el controlador MVC". Es exactamente el mismo tipo de controlador que FooController. En el índice ZF, la acción en IndexController se llama de forma predeterminada, por lo que se solicita ejemplo.com/magento/index.php/holamundo llamará a IndexController :: indexAction () en el módulo helloworld. Por lo tanto, llamar a ... / 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 Zemán

asegúrese de leer la respuesta de @Matus Zeman para comprender por qué no se encontró fooAction en el IndexController, es solo una cosa 'normal' de Zend Framework MVC / enrutador y usó la URL incorrecta, por lo que debe eliminar el "Este NO es el Controlador MVC "parte de su respuesta. - regilero

@ hypervisor666 Activa el "modo de desarrollador" (google it). Con el modo de desarrollador activado, Magento se bloqueará ante cualquier error en los archivos XML. - alan tormenta

He estado luchando con Magento durante el último mes y todavía estoy tratando de resolverlo. Así que este es un 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 uno fue una verdadera revelación.

Para depurar definitivamente lo recomiendo usando 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 completamente, 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 archivo.

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, 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é 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.

Leer la guía del diseñador aquí. Está destinado principalmente a diseñadores gráficos, pero necesite 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.

Respondido 13 Abr '17, 13:04

Por favor, publique más si puede, toda la información es muy útil :) - Haga clic en Upvote

Misa, probablemente deberías registrarte aquí en Stackoverflow, si perdieras tu cookie, toda tu reputación desaparecería;) - Haga clic en Upvote

¡Gracias! Esto es muy útil. Ner - Ner

Prefiero recomendar Mago2Gen, esto le ayudará a generar el modelo estándar y podrá concentrarse en la lógica empresarial central. solo ayuda a acelerar las cosas.

Respondido el 27 de junio de 18 a las 15:06

Un módulo de Magento es un grupo de directorios que contienen bloques, controladores, ayudantes y modelos necesarios para crear una función 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 permite instalarlos, eliminarlos o deshabilitarlos. Desde la perspectiva tanto de los comerciantes como de los 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 usando 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 de módulo El módulo debe estar registrado en el sistema Magento 2 usando 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 usando 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

respondido 20 nov., 18:14

Estaba intentando hacer mi módulo del tutorial de magaplaza hello world, 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 módulo desplegable de categorías subcategorías ajax select. 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 Puedes 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

Respondido el 03 de Septiembre de 19 a las 08:09

Y,

Le sugiero que aprenda sobre la configuración del sistema.

¿Cómo mostrar todas las categorías en el campo de configuración del sistema?

Aquí lo resolví con un buen ejemplo. Está funcionando. Puede comprobar y aprender el flujo del código.

También hay otros muchos ejemplos que debería aprender.

Respondido el 05 de enero de 20 a las 13:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.