Tutorial para la creación de una Extensión de Magento (parte 4)

6 Comments

En las partes anteriores del tutorial vimos cómo crear una nueva extensión para Magento siguiendo el modelo vista-controlador (MVC). En la última parte vimos una forma sencilla, aunque no muy flexible, de crear una vista para nuestra extensión. En esta parte del tutorial veremos una forma más potente para crear nuestras vistas utilizando «templates» o plantillas PHP para generar las diferentes partes de las páginas de nuestra extensión.

Vamos a comenzar modificando el fichero de layout que teníamos en el tutorial anterior:

[sourcecode light=»true»]
/app/design/frontend/base/default/layout/holamundo.xml
[/sourcecode]
[sourcecode language=»xml»]






[/sourcecode]

En el template podemos contar con una autoreferencia a nuestro propio objeto ($this). Pero no hemos creado ninguna clase! Es por eso que he incluido la línea que imprime por pantalla el nombre de la clase de $this en el template. Si accedemos a la url www.mitiendamagento.com/holamundo/index/saludar, podremos ver que estamos imprimiendo por pantalla el texto "Mage_Page_Block_Html". Se trata de un bloque, nuestro template siempre estará asociado a un bloque, sólo que la salida ya no se genera, como en el tutorial anterior, mediante el método _toHtml del bloque, sino que se hace utilizando el template. En este caso hemos utilizado un bloque genérico de Magento para mostrar templates. Si nuestro template no necesitara realizar ninguna acción podríamos dejarlo así, ¡pero nosotros queremos nuestro propio bloque! Así que vamos a crearlo:

[sourcecode light="true"]
/app/code/local/Brainsins/Holamundo/Block/Formsaludos.php
[/sourcecode]
[sourcecode language="php"]getRequest()->getParam("nombre");
$name = $input ? $input : "Desconocido";
return Mage::getSingleton("holamundo/holamundo")->construirSaludo($name);
}
}
[/sourcecode]

A diferencia del último tutorial, ahora extendemos la clase Mage_Core_Block_Template. Sólo con esto, nuestro bloque ya está preparado para trabajar con templates. Simplemente hemos añadido un método para poder utilizarlo cómodamente desde el template. Si cambiamos en el template page/html por holamundo/formsaludos, veremos que ahora, la clase de bloque que se estará utilizando es Brainsins_Holamundo_Block_Formsaludos, es decir, nuestro nuevo bloque. A continuación vamos a modificar el template que ya hemos creado para que se encargue de saludar. En este caso, vamos a mostrar dos páginas diferentes en función de si está presente el parámetro GET "nombre" con el nombre a saludar. Si está presente, lo saludaremos, y en caso contrario mostraremos un pequeño formulario para preguntar al usuario por su nombre.

[sourcecode light="true"]
/app/design/frontend/base/default/template/holamundo/holamundo.phtml
[/sourcecode]
[sourcecode language="php"]

Bienvenido al Saludador

construirSaludo("alex");
echo("

" . $saludo . "

");
} else {
?>





[/sourcecode]

Otras partes del tutorial:

Parte 1: Creación de un nuevo módulo con un controlador
Parte 2: Creación de un modelo para la extensión
Parte 3: Creación de una vista para la extensión

Referencias

Magento for Developers: Part 1 - Introduction to Magento 
Magento for Developers: Part 4 - Magento Layouts, Blocks and Templates

Suscríbete a nuestra newsletter

6 Comments
    • pepe escobar
    • 05/02/2015
    Responder

    Hermanos, les comparto el codigo completo

    que me funciona a mi.

    unicamente en el codigo deben reemplazar

    en donde encuentren las siguientes lineas:

    //aqui abrir tag de php

    //aqui cerrar tag de php

    por las etiquetas para abrir y cerrar php

    un saludo!.

    pepe.

    —————————————————————————

    Block/Formsaludos.php

    —————————————————————————

    //aqui abrir tag de php

    class Brainsins_Holamundo_Block_Formsaludos extends Mage_Core_Block_Template {

    public function _prepareLayout()

    {

    return parent::_prepareLayout();

    }

    public function construirSaludo() {

    $input = $this->getRequest()->getParam(«nombre»);

    $name = $input ? $input : «Desconocido»;

    return Mage::getSingleton(‘holamundo/saludador’)->construirSaludo($name);

    }

    }

    —————————————————————————

    Block/Holamundo.php

    —————————————————————————

    //aqui abrir tag de php

    class Brainsins_Holamundo_Block_Holamundo extends Mage_Core_Block_Abstract {

    public function _prepareLayout()

    {

    return parent::_prepareLayout();

    }

    protected function _toHtml() {

    $input = $this->getRequest()->getParam(«nombre»);

    $name = $input ? $input : «Desconocido»;

    //$saludador = Mage::getSingleton(«holamundo/holamundo»);

    $saludador = Mage::getSingleton(«holamundo/saludador»);

    return «» . $saludador->construirSaludo($name) . «»;

    }

    }

    —————————————————————————

    controllers/IndexController.php

    —————————————————————————

    //aqui abrir tag de php

    class Brainsins_Holamundo_IndexController extends Mage_Core_Controller_Front_Action {

    // public function indexAction() {

    // echo ‘Hola Mundo!’;

    // }

    public function indexAction() {

    $this->loadLayout();

    $this->renderLayout();

    }

    public function saludarAction() {

    $this->loadLayout();

    $this->renderLayout();

    }

    // public function saludarAction() {

    // $input = $this->getRequest()->getParam(«nombre»);

    // $name = $input ? $input : «Desconocido»;

    // echo(«Hola » . $name . «!»);

    // }

    //

    // public function saludarAction() {

    // $input = $this->getRequest()->getParam(«nombre»);

    // $name = $input ? $input : «Desconocido»;

    // $saludador = Mage::getSingleton(‘holamundo/saludador’);

    // $saludo = $saludador->construirSaludo($name);

    // echo($saludo);

    // }

    public function imprimirAction() {

    echo «estoy en la accion imprimir»;

    }

    }

    —————————————————————————

    etc/config.xml

    —————————————————————————

    0.1.0

    standard

    Brainsins_Holamundo

    holamundo

    holamundo.xml

    Brainsins_Holamundo_Model

    Brainsins_Holamundo_Block

    —————————————————————————

    etc/Saludador.php

    —————————————————————————

    //aqui abrir tag de php

    class Brainsins_Holamundo_Model_Saludador extends Mage_Core_Model_Abstract {

    public function _construct() {

    parent::_construct();

    $this->_init(‘holamundo/saludador’);

    }

    public function construirSaludo($nombre) {

    return ‘hola ‘ . $nombre . ‘!’;

    }

    }

    —————————————————————————

    layout/holamundo.xml

    —————————————————————————

    —————————————————————————

    template/holamundo/holamundo.phtml

    —————————————————————————

    Bienvenido al Saludador

    //aqui abrir tag de php

    if (isset($_GET[‘nombre’])) {

    //$saludo = $this->construirSaludo(«alex»);

    $saludo = $this->construirSaludo($_GET[‘nombre’]);

    echo(«» . $saludo . «»);

    } else {

    //aqui cerrar tag de php

    Dime tu nombre

    //aqui abrir tag de php

    }

    • Leocongo
    • 20/09/2012
    Responder

    un agradecimiento a Brainsins por este aporte que ha hecho, seguí todos los tutoriales de este tema y en este último necesite ayuda extra, aca les dejo algunos de las lineas que adicione o cambié:
    En holamundo.xml

    Por

    De esta manera vinculamos el bloque con el template

    Por otro lado no importa el nombre «alex» en el template ya que la función construirSaludo() toma es el nombre desde es GET, para esto es bueno aclarar que hay dos funciones con el mismo nombre que podrían confundir(se podrían llamar distinto), una es la del modelo y la otra es la del bloque, la del bloque hace uso de la del modelo.

    Denuevo Gracias a Alejandro por este artículo

    • Fredys Fonseca
    • 18/07/2012
    Responder

    Buenas excelente blog me podrían encaminar necesito crear una forma de pago para magento tengo la ultima versión 1.7 pero no se por donde empezar que debo tener en cuenta es facil, dificil o imposible agradezco su ayuda

    • Josue Hernandez
    • 07/03/2012
    Responder

    Gracias Bro te sigo desde el tutorial uno, este no lo eh programado, pero me ah sido de muchísima ayuda igual gracias

    • edgar
    • 20/01/2012
    Responder

    Alejandro, felicitarte por la iniciativa, el tutorial me está valiendo de mucho, aunque esté un poco pesado pretendiendo corregir, pero creo que puede ser útil para todos mejorar las cosillas que pueden ir mal.

    He descubierto el problemilla del layout, se había quedado una etiqueta de la anterior versión que ahora no hace falta. El fichero que me ha funcionado es:
    ——-

    ———
    Con este cambio se muestra el formulario, pero no lee el parámetro de la url si lo tiene y si envío un nombre me da una página de error por intentar violar la seguridad.

    • edgar
    • 20/01/2012
    Responder

    He estado siguiendo el tutorial, hasta la parte 3 todo iba bien, pero de esta parte no me funciona nada. Es hacer el cambio en el fichero del layout y se acabó.

    Me he fijado que hay un errorcillo en la construcción del template con el formulario.
    En la línea:
    $saludo = $this->construirSaludo($_GET[‘alex’]);
    debería ir:
    $saludo = $this->construirSaludo($_GET[‘nombre’]);

    Pero este error no es el culpable de que no me funcione siquiera la versión del template que ejecuta el get_class. ¿Qué podría ser?

 

Deja tu comentario