Extendiendo la configuración gráfica del cron en Magento

Para evitar tener que lidiar con la configuración por xml, en Magento podemos crear la configuración gráfica para los cron jobs de nuestros módulos, de manera que estamos dando mayor flexibilidad al usuario y nos evitamos riesgos que podrían ocasionarse por una mala edición de los archivos.

Normalmente las opciones que nos ofrece la configuración suelen ser suficiente.

En otros casos, es posible que no nos alcance con sólo poder configurar una ejecución diaria, semanal o mensual. En éste esquema, nos estamos perdiendo la posibilidad de configurar la ejecución con repetición por horas o por minutos.

Para poder obtener esas opciones vamos a necesitar crear dos modelos para nuestro módulo, que serán los encargados de brindarnos esas nuevas posibilidades (y de paso vamos a arreglar otras que no funcionan desde la implementación original).

Continue reading

Cómo modificar los botones de la grilla en un módulo de Magento

Cuando utilizamos el generador automático de modulos, nuestra grilla viene un botón para agregar nuevos registros.

En algunas oportunidades, posiblemente necesitemos hacer algunos cambios, ya sea agregando acciones o quitando las que obtenemos por defecto.

Para comenzar, tenemos que identificar la clase que se encarga de definir dicha sección. Suponiendo que el módulo se llama Dc_Test, tenemos que buscar el siguiente archivo: /app/code/local/Dc/Test/Block/Adminhtml/Test.php.

Lo que vamos a ver en el archivo es lo siguiente:

class Dc_Test_Block_Adminhtml_Test extends Mage_Adminhtml_Block_Widget_Grid_Container {
 
    public function __construct()     {
        $this->_controller = 'adminhtml_test';
        $this->_blockGroup = 'test';
        $this->_headerText = Mage::helper('test')->__('Item Manager');
        $this->_addButtonLabel = Mage::helper('test')->__('Add Item');
        parent::__construct();
    }
 
}

Continue reading

Agregar columnas a la grilla de Productos en Magento

Una pequeña pero útil customización que suelen pedirme es la de agregar más información en la grilla de productos y, en otros casos, en la grilla de productos de las categorías. La idea es proveer de mayor cantidad de filtros según la necesidad de cada catalogación.

La grilla de productos, por defecto, tiene éstas columnas.

Si bien hay varios tipos de filtros, los que suelo usar en éstas modificaciones son los campos de texto y los dropdown.

Por ejemplo, para agregar la columna Descripción a la grilla, y que funcione como filtro, debemos realizar el siguiente cambio en el archivo /app/code/core/Mage/Adminhtml/Block/Catalog/Product/Grid.php.

(En realidad, modificamos el archivo del Core sólo para el ejemplo. Lo que hay que hacer es aplicar una reescritura del bloque).

Continue reading

Ajax en las grillas de nuestros módulos Magento

Por defecto, las grillas que podemos armar para el backend, utilizando los elementos que nos provee la plataforma, nos permiten realizar distintas acciones (buscar, ordenar, etc) a través de un post y recargando por completo la página.

Como siempre, tomo como punto de partida o módulo de ejemplo, el que podemos armar utilizando el creador de módulos de Magento. Para el ejemplo, el nombre del módulo no puede ser otro que Dc_Test.

Volviendo sobre el tema de las acciones de la grilla, vamos a tomar una grilla generada por el módulo y vamos a agregar pequeñas modificaciones para tener funcionalidad ajax.

Para lograrlo, sólo necesitamos modificar dos archivos y tan sólo agregar algunas líneas de código.

Continue reading

Incluir archivos JS por layout según configuración en Magento

Ya hemos visto como sobreescribir templates y cómo agregar archivos css de forma modular.

Siguiendo con la idea de armar módulos que podamos reutilizar, vamos a ver cómo agregar archivos javascript pero sólo si hemos configurado desde el backend su inclusión.

Si antes aplicamos el método addCss, en ésta oportunidad tenemos dos formas de llamar a un archivo js.

El código a usar, si nuestro archivo js debe incluirse cada vez que se instancie nuestro módulo, sería el siguiente si es que el archivo se encuentra en la carpeta /skin.

<layout version="0.1.0">
 
    ...
 
    <default>
        <reference name="head">
            <action method="addItem"><type>skin_js</type><name>js/archivo.js</name></action>
        </reference>
    </default>
 
    ...
 
</layout>

Y de ésta otra forma lo hacemos si es que estamos agregando una librería ubicada en /js.

<layout version="0.1.0">
 
    ...
 
    <default>
        <reference name="head">
            <action method="addJs"><script>carpeta/archivo.js</script></action>
        </reference>
    </default>
 
    ...
 
</layout>

Supongamos ahora que armamos un módulo que requiere de una librería (para mi ejemplo y por preferencia, pensemos que es jQuery), pero que siendo la nuestra una extensión, podría pasarnos que al agregarla a un proyecto, jQuery ya se esté usando.

Continue reading

Cómo agregar un archivo CSS por layout en Magento

Siguiendo un poco con el tema de las buenas prácticas en cuanto a maquetación, módulos y esas yerbas; vamos a ver cómo incluir un nuevo archivo css dentro de nuestro template.

Básicamente tenemos dos formas (algunas más en realidad si queremos hacer las cosas poco prolijas).

La primera y más extendida, sería tomar page.xml de nuestro layout y repetir, por ejemplo la siguiente línea.

<action method="addCss"><stylesheet>css/mi_css.css</stylesheet></action>

Le cambiamos el nombre del archivo (que deberá estar ubicado en el path correcto) y con eso vamos a tener nuestro archivo css listo para ser leído.

La segunda forma de hacerlo, que nos sirve para nuestras extensiones, es hacer esto mismo pero desde la definición de layout del módulo.

Esto nos permitirá que sólo en los casos en los que el módulo se instancie, o incluso sólo en una sección, se agregue nuestro archivo css.

Dado que el archivo css ya lo tenemos ubicado dentro de las carpeta de skin correspondiente, vamos a agregar la definición a nuestro módulo.

Vamos a suponer que el módulo se llama Noticias. Normalmente, encontraríamos dentro de la carpeta de layout del frontend un archivo noticias.xml.

Dentro de ese archivo tenemos que agregar las siguientes líneas.

<?xml version="1.0"?>
<layout version="0.1.0">
 
    ...
 
    <default>
        <reference name="head">
            <action method="addCss">
                <name>noticias.css</name>
            </action>
        </reference>
    </default>
 
    ...
 
</layout>

De ésta forma le decimos que tome el bloque “head” (que se encuentra definido en page.xml) y agregue un archivo css. Luego se le pasa el path al archivo que puede ser cualquiera dentro de la carpeta de skin the nuestro theme.

Sobreescribir templates en Magento desde el layout

Una de las grandes bondades (y de los grandes problemas en el comienzo de la curva de aprendizaje) es el manejo de los templates a través de las definiciones xml del layout.

Normalmente, cuando trabajamos con un skin desde el comienzo, más allá de las líneas de diseño que puedan existir, tenemos bastante libertad de elección en la forma en que se va estructurar ese theme.

Ahora bien, cambia radicalmente el escenario cuando nos dedicamos a crear extensiones o cuando ciertas customizaciones que hayamos desarrollado se tornan parte de la batería de módulos y ajustes que usamos en cada proyecto.

Si para cada caso debiéramos estar modificando los archivos phtml, los xml, el css… bueno, sería bastante molesto y estaríamos dejando de tener código reutilizable.

A través de las definiciones de layout podemos aplicar cambios al momento de renderear el template sin hacer modificaciones a los archivos que ya se estén usando. En realidad, hay unas cuantas cosas que pueden hacerse, pero dada la cantidad de funciones con las que contamos para el manejo del layout, sólo me voy a centrar en el reemplazo de llamadas a los phtml.

Como ejemplo, vamos a tomar el selector de moneda. Vamos a suponer también que tenemos definido el update de layout en el módulo.

Continue reading

Configuración gráfica para un cron job en Magento

Siempre que se habla de crear cron jobs para un módulo en Magento, se explica cómo configurar el crontab y el xml del módulo.

Si bien vamos a lograr el objetivo, esto siempre obliga a quien administra el proceso a estar editando un archivo y corrigiendo los tiempos de ejecución.

De ésta forma no sólo estamos ante una situación incómoda sino que, además, podríamos estar comprometiendo la integridad del módulo.

Voy a dar por sentado que ya nuestro cron job funciona como queremos y que hemos creado la configuración de otros parámetros del módulo. Sólo nos vamos a concentrar en agregar la configuración gráfica para la ejecución.

Ahora bien, el primer paso es crear un nuevo modelo que será el encargado de transformar los valores que ingresemos en la configuración a valores que el Cron Manager de Magento entienda.

Continue reading

Crear un cron job en Magento

Muchas veces vamos a necesitar procesos que se ejecuten sin importar si del otro lado de la pantalla hay algún usuario realizando alguna acción.

Por lo general éste tipo de tareas tienen que ver más con procesos administrativos que con la experiencia de compra en si misma.

Una de las funcionalidades de Magento es el cron, que no es más que una extensión del cron del sistema operativo. La pequeña diferencia sería que desde el sistema operativo ejecutamos un único archivo de la plataforma y ésta, según configuraciones, se encargará de correr los procesos que correspondan.

Un cron job para Magento es, básicamente, un método de un modelo que se encargará de realizar una acción.

Para lograr el nuestro, lo primero sería crear la clase y el método que más tarde invocaremos. Un ejemplo podría ser el siguiente.

class Dc_Modulo_Model_Cron {
 
    public function runMyCronJob() {
 
        //Acciones a realizar
 
    }
 
}

De más está decir que lo que haga el método quedará librado a la necesidad de cada uno. No hace al ejemplo definir algún proceso.

Continue reading

Cómo crear un renderer para las grillas en Magento

Si bien tanto para los formularios como para las grilla Magento nos provee de una serie de tipos listos para usar, en algunas oportunidades nos hará falta alguna nueva funcionalidad.

En el caso de las grillas, es bastante sencillo agregar un nuevo tipo de columna.

Normalmente, cuando nuestro formulario permite subir archivos, el resultado en la grilla sería el siguiente.

La columna filename se muestra como texto, pero en realidad es una referencia a un archivo que nos gustaría poder ver como imagen.

Continue reading