Cómo agregar atributos a una categoría en Magento

Entre las tantas personalizaciones que normalmente se hacen en un tienda, es posible que necesitemos agregar atributos a las categorías.

Dado que Magento no ofrece la posibilidad de gestionar los atributos de ésta entidad desde el backend, vamos a ver cómo agregar uno nuevo a través de nuestros módulos.

En éste caso, vamos a usar un módulo (como siempre: Dc_Test) para agregar el atributo.

Dc_Test va a tener sólo tres archivos. El primero, es la configuración del módulo y estará ubicado en /app/code/local/Dc/Test/etc/config.xml.

<?xml version="1.0"?>
<config>
   <modules>
      <Dc_Test>
         <version>0.1.0</version>
      </Dc_Test>
   </modules>
   <global>
      <resources>
         <test_setup>
            <setup>
               <module>Dc_Test</module>
               <class>Mage_Catalog_Model_Resource_Eav_Mysql4_Setup</class>
            </setup>
            <connection>
               <use>core_setup</use>
            </connection>
         </test_setup>
      </resources>
   </global>
</config>

Luego, vamos a especificar las propiedades de nuestro atributo en el instalador, que se encontrará en /app/code/local/Dc/Test/sql/test_setup/mysql4-install-0.1.0.php.

$installer = $this;
 
$installer->startSetup();
 
$installer->addAttribute('catalog_category', 'test', array(
                        'type'              => 'text',
                        'backend'           => '',
                        'frontend'          => '',
                        'label'             => 'My test attribute',
                        'input'             => 'text',
                        'class'             => '',
                        'source'            => '',
                        'global'            => 1,
                        'visible'           => 1,
                        'required'          => 0,
                        'user_defined'      => 0,
                        'default'           => '',
                        'searchable'        => 0,
                        'filterable'        => 0,
                        'comparable'        => 0,
                        'visible_on_front'  => 0,
                        'unique'            => 0,
                        'position'          => 1,
                    ));
 
$installer->endSetup();

Por último, vamos a dejar habilitado el módulo dentro de Magento, agregando el archivo /app/etc/modules/Dc_Test.xml.

<?xml version="1.0"?>
<config>
    <modules>
        <Dc_Test>
            <active>true</active>
            <codePool>local</codePool>
        </Dc_Test>
    </modules>
</config>

Paso siguiente, ingresamos al backend y si estamos utilizando cache, lo refrescamos.

La próxima vez que ingresemos a la edición de categorías debería verse lo siguiente.

Atributo personalizado para la categoría en Magento

El ejemplo sólo agrega un atributo de tipo texto con un input para llenar el valor, pero podemos utilizar cualquiera de los tipos de campos que nos ofrece la plataforma.

Si necesitáramos un atributo para manejar una imagen adicional, el setup podría quedar así:

$installer = $this;
 
$installer->startSetup();
 
$installer->addAttribute('catalog_category', 'test_picture', array(
                        'type'              => 'varchar',
                        'backend'           => 'catalog/category_attribute_backend_image',
                        'frontend'          => '',
                        'label'             => 'Test Picture',
                        'input'             => 'image',
                        'class'             => '',
                        'source'            => '',
                        'global'            => 0,
                        'visible'           => 1,
                        'required'          => 0,
                        'user_defined'      => 0,
                        'default'           => '',
                        'searchable'        => 0,
                        'filterable'        => 0,
                        'comparable'        => 0,
                        'visible_on_front'  => 0,
                        'unique'            => 0,
                        'position'          => 1,
                    ));
 
$installer->endSetup();
Atributo de tipo imagen para las categorías en Magento

Puede ser un campo booleano haciendo uso de los modelos de Magento.

$installer = $this;
 
$installer->startSetup();
 
$installer->addAttribute('catalog_category', 'test_yes_no', array(
                        'type'              => 'int',
                        'backend'           => '',
                        'frontend'          => '',
                        'label'             => 'Test Yes/No',
                        'input'             => 'select',
                        'class'             => '',
                        'source'            => 'eav/entity_attribute_source_boolean',
                        'global'            => 1,
                        'visible'           => 1,
                        'required'          => 0,
                        'user_defined'      => 0,
                        'default'           => '',
                        'searchable'        => 0,
                        'filterable'        => 0,
                        'comparable'        => 0,
                        'visible_on_front'  => 0,
                        'unique'            => 0,
                        'position'          => 1,
                    ));
 
$installer->endSetup();
Atributo de tipo booleano para la categoría en Magento

O incluso podemos crear nuestros propios modelos para llenar los valores de un atributo.

$installer = $this;
 
$installer->startSetup();
 
$installer->addAttribute('catalog_category', 'test_custom', array(
                        'type'              => 'int',
                        'backend'           => '',
                        'frontend'          => '',
                        'label'             => 'Test Custom',
                        'input'             => 'select',
                        'class'             => '',
                        'source'            => 'test/entity_attribute_source_test',
                        'global'            => 1,
                        'visible'           => 1,
                        'required'          => 0,
                        'user_defined'      => 0,
                        'default'           => '',
                        'searchable'        => 0,
                        'filterable'        => 0,
                        'comparable'        => 0,
                        'visible_on_front'  => 0,
                        'unique'            => 0,
                        'position'          => 1,
                    ));
 
$installer->endSetup();

Y agregamos el modelo que nos dará los valores. El archivo estará, para el ejemplo, en /app/code/local/Dc/Test/Model/Entity/Attribute/Source/Test.php.

class Dc_Test_Model_Entity_Attribute_Source_Test extends Mage_Eav_Model_Entity_Attribute_Source_Table
{
    public function getAllOptions()
    {
        return array(
            array(
                'value' => 'none',
                'label' => Mage::helper('adminhtml')->__('No Test')
            ),
            array(
                'value' => 'test1',
                'label' => Mage::helper('adminhtml')->__('Test 1')
            ),
            array(
                'value' => 'test2',
                'label' => Mage::helper('adminhtml')->__('Test 2')
            ),
            array(
                'value' => 'test3',
                'label' => Mage::helper('adminhtml')->__('Test 3')
            )
        );
    }
}

Para que éste modelo sea accesible es necesario modificar el archivo config.xml del módulo. La versión final debería verse así:

<?xml version="1.0"?>
<config>
   <modules>
      <Dc_Test>
         <version>0.1.0</version>
      </Dc_Test>
   </modules>
   <global>
      <resources>
         <test_setup>
            <setup>
               <module>Dc_Test</module>
               <class>Mage_Catalog_Model_Resource_Eav_Mysql4_Setup</class>
            </setup>
            <connection>
               <use>core_setup</use>
            </connection>
         </test_setup>
      </resources>
      <models>
        <test>
            <class>Dc_Test_Model</class>
        </test>
      </models>
   </global>
</config>

El resultado de ésta modificación sería:

Atributo de tipo dropdown con valores propios para las categorías en Magento