Dropdowns en los formularios de backend de Magento

Uno de los ejemplos que el creador de módulos de Magento no incluye para el caso de los formularios del backend, es el del uso de dropdowns que deben ser llenados con valores de algún modelo que referencia a una tabla.

Por defecto, nos encontramos con esto.

Dropdown en un formulario de backend en Magento

Para lograrlo, el código que se utiliza en la composición del formulario es el siguiente.

$fieldset->addField('status', 'select', array(
    'label'     => Mage::helper('news')->__('Status'),
    'required'  => true,
    'name'      => 'status',
    'values'    => array(
        array(
            'value'     => 1,
            'label'     => Mage::helper('news')->__('Enabled'),
        ),
        array(
            'value'     => 2,
            'label'     => Mage::helper('news')->__('Disabled'),
        ),
    ),
));

Uno de los problemas de ésta modalidad, es que luego nuestro modelo deberá responder por esos mismos id’s para poder mostrar, «hacia afuera», los valores como corresponden. Queda claro que dependiendo de la cantidad de opciones que vayan a utilizarse para llenar el dropdown, esto podría convertirse en una situación difícil de mantener.

Supongamos que estamos haciendo un módulo que se compone por más de un formulario, y donde uno de éstos genera valores que serán usado por un segundo. A manera de ejemplo, podríamos pensar en un sencillo módulo de noticias, en donde en el primero de los formularios cargaríamos una categoría y luego en el segundo seleccionaríamos en un dropdown la categoría.

¿Cómo hacer entonces para que los que carguemos como categorías sea utilizable por el segundo formulario sin tener que estar editándolo?.

La solución no dista de ser sencilla. Para empezar, vamos a agregar un método al modelo que gestiona (siguiendo el ejemplo) las categorías de nuestro módulo de noticias. En particular vamos a tomar la clase collection.

Supongamos que el módulo se llamara Dc_News. Vamos a buscar el archivo Dc_News_Model_Mysql4_Categories_Collection y le agregamos el siguiente código.

public function toOptionArray()
{
    return $this->_toOptionArray('campo_id', 'campo_texto_a_mostrar');
}

Ahora volvemos a nuestro formulario y vamos a modificar un poco la definición del campo que estamos rendereando como dropdown.

Previo a la definición vamos a agregar ésta línea.

$_categories = Mage::getModel('news/categories')->getCollection()->toOptionArray();

Luego, en la especificación del campo, en lugar de agregar el array de valores utilizamos la variable que definimos previamente como el value de éste campo.

$fieldset->addField('category', 'select', array(
    'label'     => Mage::helper('news')->__('Category'),
    'required'  => true,
    'name'      => 'category',
    'values'    => $_categories,
));

Una vez hecho esto, y suponiendo que ya cargamos algunos valores, el campo en nuestro formulario debiera de mostrar algo como esto.

Dropdown con los valores obtenidos desde base de datos

Con ésto tenemos las dos variantes para utilizar dropdowns en nuestros módulos de Magento.