Configurar la cantidad de registros por defecto en una grilla

Por defecto las grillas del backend de Magento muestran hasta 20 registros.

Como otras, ésta propiedad puede ser redefinida en el constructor de la clase.

Si queremos que el valor por defecto de paginación sea otro, sólo tenemos que agregar una línea al constructor de nuestra grilla.

public function __construct()
    {
        parent::__construct();
        ...
        $this->setDefaultLimit(100);
    }

De ésta forma, si no se especifica un valor, el que aquí asignemos será el usado.

El único detalle a tener en cuenta es que los valores posibles a establecer tienen que coincidir con los que se muestran en el dropdown.

Si quisiéramos modificarlos, tendríamos que editar el archivo /app/design/adminhtml/default/default/template/widget/grid.phtml y establecer aquellos valores que nos estén faltando.

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

Agregar un icono propio a la grilla de nuestro módulo en Magento

Gracias al generador automático de módulos podemos disponer rápidamente de una extensión (que funciona a manera de ejemplo) en nuestro backend de Magento.

Esto se debe (además de la investigación que fue necesaria en su momento para llegar al generador) al uso y aprovechamiento de los elementos disponibles dentro del código de la plataforma.

Para aquél que lo haya usado, ya sabrá que dispondremos de una nueva tabla en la base de datos, en el backend habrá una grilla y un formulario de edición de datos, y también tendremos un controlador disponible en el store para acceder a esos datos que manipulemos en el backend.

Vamos a centrarnos en la grilla del módulo.

Como ven ésta grilla es igual a cualquier otra de las que encontramos en el backend. Por supuesto, las leyendas y columnas pertenecen a un módulo específico.

Continue reading

Provincias en un formulario de contacto personalizado en Magento

Supongamos que necesitamos armar un formulario de contacto adicional al que ya provee Magento. Supongamos también que necesitamos utilizar datos de la plataforma.

En éste ejemplo vamos a ver cómo invocar las provincias/regiones en nuestro formulario.

La porción de código referente al dropdown que mostrará las regiones se vería, pensando en el skin default, de la siguiente manera:

<div class="input-box">
    <label for="state"><?php echo Mage::helper('customcontacts')->__('State') ?> <span class="required">*</span></label><br />
    <?php $_regions = Mage::getModel('directory/region')->getCollection();?>
    <select name="state" id="state" class="required-entry validate-select">
        <option value=""><?php echo Mage::helper('customcontacts')->__('Select State') ?></option>
        <?php foreach($_regions as $_region): ?>
            <option value="<?php echo $_region->getName(); ?>"><?php echo $_region->getName(); ?></option>
        <?php endforeach; ?>
    </select>
</div>

El resultado de éste código seria el siguiente.

Ahora bien, no buscamos todas las provincias, estados o regiones que tenemos disponibles, sino que vamos a filtrar según un país dado.

En el ejemplo, previo instalación de la extensión Dc_Argentineregions, vamos a buscar obtener sólo las provincias de Argentina.

Para esto, tenemos que hacer un pequeño cambio a nuestro código.

<div class="input-box">
    <label for="state"><?php echo Mage::helper('customcontacts')->__('State') ?> <span class="required">*</span></label><br />
    <?php $_regions = Mage::getModel('directory/region')->getResourceCollection()->addCountryFilter('AR')->load();?>
    <select name="state" id="state" class="required-entry validate-select">
        <option value=""><?php echo Mage::helper('customcontacts')->__('Select State') ?></option>
        <?php foreach($_regions as $_region): ?>
            <option value="<?php echo $_region->getName(); ?>"><?php echo $_region->getName(); ?></option>
        <?php endforeach; ?>
    </select>
</div>

Y el resultado será el siguiente:

Lo que hicimos fue cambiar el método de lectura del modulo y agregarle el método addCountryFilter pasandole el código del país que necesitamos.

Convertir productos simples en virtuales en Magento

Cada tanto suele aparecer la misma pregunta (en alguna de sus dos variantes): ¿como hago para convertir un producto simple en un producto virtual? (o podría ser el caso inverso).

En líneas generales, dentro de Magento, los productos simples y los virtuales son lo mismo (atributo más, atributo menos). Veamos un ejemplo de producto simple.

+-----------+----------------+------------------+---------+----------------+--------------+---------------------+---------------------+-------------+------------------+
| entity_id | entity_type_id | attribute_set_id | type_id | sku            | category_ids | created_at          | updated_at          | has_options | required_options |
+-----------+----------------+------------------+---------+----------------+--------------+---------------------+---------------------+-------------+------------------+
|         3 |              4 |                4 | simple  | simple-product | 4            | 2009-12-12 18:31:36 | 2009-12-12 18:31:36 |           0 |                0 |
+-----------+----------------+------------------+---------+----------------+--------------+---------------------+---------------------+-------------+------------------+

Como ven, en la columna type_id se especifica qué tipo de producto estamos usando.

La gran diferencia entre un tipo de producto y otro, dada su naturaleza, es que el virtual no necesita de especificación del método de envío (dado que es un producto que no se enviaría).

Si vemos el checkout de un simple, el 3º y 4º paso hace referencia a los envíos.

Checkout de un producto simple en Magento

Continue reading

Accediendo a configuraciones de Magento

Hace unos días me tocó armar una extensión en la cual se sobreescribían varios bloques, controladores y modelos de Magento.

El problema con el cual me encontré, era que necesitaba obtener valores de configuración (de los que se almacenan en la tabla core_config_data) en módulos que no eran los originales.

Normalmente, dentro de un módulo que guarda valores en esa tabla, utilizamos algo como ésto para recuperar dicho valor.

<?php
$this->getConfigData('clave_a_buscar');
?>

Ahora bien, con $this sabemos que estamos en nuestro módulo y lo que busca es la calve.

El caso que comento tenía una diferencia: $this no era $this. Es decir, $this es un módulo creado por mi, pero la configuración pertenece a otro módulo.

Para poder solucionarlo, el truco consiste en llamar al método de forma estática y en lugar de pedir sólo la clave que buscamos, tenemos que indicar el path completo.

<?php
Mage::app()->getStore()->getConfig('mi_modulo/mi_clave');
?>

De ésta manera, obtenemos cualquier valor de configuración, en cualquier lugar del código, sin importar el scope.

Magento, Flash player 10 y el Uploader de fotos de productos

En el segundo semestre del año pasado hubo una actualización casi compulsiva de la versión de Falsh player, lo cual nos llevo de la versión 9.x a la 10.

Para los que ya disfrutábamos/sufríamos Magento, esto se convirtió en un problema mayor. Hasta el final de la rama 1.1.x, el uploader de fotos utilizado para la ficha de productos no funcionaba con la nueva versión del Flash player.

Este fallo se debía a la forma en que el nuevo player maneja la llamada a los archivos, lo cual fue cambiado por cuestiones de seguridad (no es éste el tema del post).

Como decía, al querer subir fotos para un producto, nos encontrábamos con el siguiente error.

Error en el uploader de Magento 1.1.x

Hace unas semanas me llegó un pedido a través de la comunidad para tratar de resolver este problema para la versión 1.1.8. El cliente tiene esa versión en producción y por motivos varios, no está en condiciones de realizar una actualización de versión.

Una solución intermedia era realizar un downgrade de la versión de Flash en al menos, un navegador; pero ésto tampoco es una solución sólida.

Bajo este esquema, estuve revisando un poco el código de las versiones más recientes y pude dar con la solución.

Continue reading

Opciones de formatDate en Magento

Hace un tiempo ya vimos como empezar a trabajar con el método formatDate.

El mismo se encuentra disponible en casi cualquier phtml, debido a la estructura de herencias de bloques.

La única función que tiene, y no por eso despreciable, es manipular el formato en el cuál se mostrará una fecha proveniente de la base de datos. Si bien lo vamos a usar de manera habitual dentro de nuestros phtmls, es posible utilizarlo también dentro de las plantillas de email.

Vamos a suponer que tenemos un objeto $data en una variable en nuestro phtml, que contiene un registro cualquiera (un producto, una página, etc) y que tiene un campo de fecha (al que vamos a llamar date haciendo honor a la falta de creatividad de ésta hora).

Ahora bien, si quisiéramos mostrarlo y simplemente lo invocamos, obtendríamos la fecha tal cual viene desde la base de datos.

< ?php
echo $data->getDate();
?>

Mostraría

2009-09-03 11:19:31 PM

Claro está que lo que buscamos es hacer presentable ese valor, y que, además, funcione de manera acorde a nuestra configuración regional.

Para lograrlo, recurrimos al método formatDate (que lo pueden encontrar en /app/code/core/Mage/Core/Helper/Data.php).

Continue reading

¿Cómo saber si una constante ha sido definida en Php?

Es posible que ante ciertos escenarios, utilizemos una constante para almacenar algún valor global dentro de nuestro código.

Para definir una constante, basta con la siguiente línea:

<?php
define("CONSTANTE", "Hola mundo.");
?>

Una vez definida, simplemente debemos invocarla para hacer uso de ese valor.

<?php
echo CONSTANTE;
//El resultado en pantalla será "Hola mundo."
?>

Normalmente, damos por sentado que dichas constantes están definidas, pero, ¿y si por algún motivo una constante no se definió?.

Si hacemos uso de esa constante y se diera ése último caso, lo más probable es que el resultado que obtengamos no sea el esperado.

Para controlar si la constante está declara, basta con hacer la siguiente pregunta.

<?php
if (defined('CONSTANTE')) {
    echo CONSTANTE;
} else {
    echo "La constante no ha sido definida";
}
?>

Un tip bastante sencillo, para algunos hasta obvio, pero de seguro útil.