Ajouter des attributs de catégorie personnalisés

Difficulté :+++-

Ajouter des attributs de catégorie personnalisésIl peut arriver qu'un e-commerce ait besoin de champs spécifiques relatifs aux catégories (plusieurs images, description courte...). Sous Magento il est aisé d'ajouter des attributs de produit depuis l'interface, mais cela est beaucoup moins évident pour les attributs de catégorie.

Le modèle de données EAV (Entity-Attribute-Value) utilisé par Magento offre une grande souplesse dans la gestion des attributs. Il permet d'ajouter de nouvelles entrées sans pour autant modifier la structure même des tables. Ce type de modèle de données complexifie énormément la base (données "éclatées") mais se justifie amplement par la souplesse et la modularité apportée.

L'ajout de caractéristiques produit est grandement simplifié par la gestion des attributs disponible sur le backend. Pour l'ajout d'attributs de catégorie il va falloir procéder autrement...

Une des méthodes consiste à ajouter manuellement une nouvelle entrée dans la table eav_attribute de la base de données. Cette méthode a cependant ses limites, elle peut notamment poser problème lors d'une réinstallation ou d'une réinitialisation complète de la boutique, et va à l'encontre du principe de modularité apporté par Magento (modifier la base de données c'est un peu comme trifouiller les fichiers du core).

Pour ajouter nos attributs de catégorie, nous allons simplement développer une extension qui se chargera d'alimenter la table eav_attribute de 2 nouvelles entrées (picture et short_description).

Architecture du module

  • app/code/local/Magentix/CategoriesAttributes/etc/
  • config.xml
  • app/code/local/Magentix/CategoriesAttributes/sql/categoriesattributes_setup/
  • mysql4-install-0.1.0.php
  • app/etc/modules/
  • Magentix_CategoriesAttributes.xml

Développement du module

L'extension doit donc permettre l'ajout de 2 entrées dans la table eav_attribute. Les attributs seront initialisés lors de l'installation du module. Pour ce faire, nous allons instancier un installeur sql, puis faire appel à la méthode addAttribute() de la classe Mage_Eav_Model_Entity_Setup, évitant ainsi la saisie de requêtes un peu lourdes.

Magento exécutera l'installeur si le code de la ressource du module n'est pas déjà listé dans la table core_resource. L'exécution dépendra également de la version de l'extension (on utilisera un update pour la mise à jour du module).

Table core_resource

Le code de notre ressource sera categoriesattributes_setup et la version du module la 0.1.0. Nous pouvons maintenant configurer l'extension que l'on nommera CategoriesAttributes :

app/code/local/Magentix/CategoriesAttributes/etc/config.xml

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

Reste à déterminer les attributs de catégorie que l'on souhaite ajouter lors de l'exécution de l'installeur. Dans notre exemple nous allons ajouter 2 champs :

  • Le premier pour le chargement d'une deuxième image
  • Le second pour la rédaction d'une description courte

L'entité sera dans les 2 cas de type catalog_category et nous nommerons les champs respectivement picture et short_description.

Un attribut possède de nombreuses options. Il est possible de définir sa portée, sa visibilité, sa valeur par défaut, de l'associer à un modèle... Beaucoup d'options sont cependant réservées aux attributs des produits.

Pour l'ajout des 2 nouveaux attributs nous allons calquer ceux déjà existants : image et description.

La méthode addAttribute() nous simplifie la vie en générant la requête SQL à partir des données passées en paramètre.

app/code/local/Magentix/CategoriesAttributes/sql/categoriesattributes_setup/mysql4-install-0.1.0.php

<?php

$installer = $this;

$installer->startSetup();

$installer->addAttribute('catalog_category', 'picture', array(
                        'type'              => 'varchar',
                        'backend'           => 'catalog/category_attribute_backend_image',
                        'frontend'          => '',
                        'label'             => '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->addAttribute('catalog_category', 'short_description', array(
                        'type'              => 'text',
                        'backend'           => '',
                        'frontend'          => '',
                        'label'             => 'Short description',
                        'input'             => 'textarea',
                        '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();

Il ne reste plus qu'à activer notre nouveau module. Lors du rafraîchissement du cache l'installeur sera exécuté.

app/etc/modules/Magentix_CategoriesAttributes.xml

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

Si l'on observe maintenant la table eav_attribute, on y trouve les 2 nouvelles entrées :

Table eav_attribute

Les champs peuvent alors être renseignés lors de l'édition d'une catégorie :

Édition d'une catégorie

On peut enfin les exploiter dans nos templates, comme par exemple dans le template catalog/category/view.phtml :

catalog/category/view.phtml

$_helper    = $this->helper('catalog/output');
$_category  = $this->getCurrentCategory();

/* Afficher l'image */

$_picHtml = '';
if($_category->getPicture()) {
        $_picUrl = Mage::getBaseUrl('media').'catalog/category/'.$_category->getPicture();
        $_picHtml = '<img src="'.$_picUrl.'" alt="'.$this->htmlEscape($_category->getName()).'" />';
        $_picHtml = $_helper->categoryAttribute($_category, $_picHtml, 'picture');
}
        
echo $_picHtml;

/* Afficher la description courte */
        
if($_category->getShortDescription()) {
        echo $_category->getShortDescription();
}

Commentez cet article Ajouter des attributs de catégorie personnalisés

vrnet le 21/06/2010 à 00:00:32
Hello
quel fichier csv gère la traduction des libellés qui, si je ne m'abuse sont stockés en dur dans la base ?

Je vois que sur ton exemple, le "backend label" de "Picture" n'est pas traduit alors que "Short description" est traduit par "Description courte" (backend) mais est-ce parce que cette traduction existe déjà dans Mage_Catalog.csv (de mémoire) ? De nombreux libellés d'attributs (catégory et customer en particulier) ne sont pas traduits dans la BO lors d'une fresh install. Sur toutes mes install Magento (1.4 comprises), par exemple, le libellé du nom de la catégorie et "Name" plutôt que "Nom" ; à l'inverse de tes screenshots. Ou peut-être installe-je en standard un module qui les écrase mais je ne vois pas...

Donc, une unique question : sais-tu comment gérer les traductions des libellés d'attributs autres que ceux des produits qui sont, eux, gérables via la gestion des attributs ?

Merci !
Marc le 21/06/2010 à 00:00:57
Très bonne question pour la traduction, j'ai également des soucis.
Merci
Magentix le 21/06/2010 à 00:01:12
Oui, j'avoue que pour le coup la réponse est pas forcement évidente... J'ai regardé rapidement la semaine dernière sans trouver... Par exemple l'attribut "coût" a pour nom "cost" dans la base et il ne semble pas apparaître dans les fichiers de traduction...
Ftug le 22/06/2010 à 21:29:36
Bonjour,
avant tout, merci pour ce très bon tuto. il est clair et très bien fait.
Pour ma part, j'ai ajouté deux images et deux dates mais je n'arrive pas à récupérer leurs valeurs sur le front. Je les vois bien lors d'un getAttributes mais les getData ne me retourne rien (les variable sont pourtant bien initialisé dans l'admin et par là même en base).
Pour information, j'ai mes propre classe custom qui étendent Mage_Catalog_Model_Category et Mage_Catalog_Helper_Category.
vois-tu une raison a cela?
Ftug le 25/06/2010 à 03:44:04
Le problème était au niveau de ma catégorie.
Je n'utilise pas le getCurrentCategory. Mon objectif était de récupérer toutes les catégories comprise entre les deux dates nouvellement ajoutées. J'ai fini par faire appel au getResourceModel('catalog/category_collection'). Sans ca, avec un getCategories(), mes champs n'étaient pas initialisé.

ce qui donne :
$categories = Mage::getResourceModel('catalog/category_collection')
->setStore(Mage::app()->getStore())
->addAttributeToSelect('name')
->addAttributeToSelect('url_key')
->addFieldToFilter('is_active', 1)
->addFieldToFilter('date_start', array('date'=>true, 'to' => $now))
->addFieldToFilter('date_stop', array('date'=>true, 'from' => $now))
->load()
->getItems();
fred le 09/07/2010 à 15:00:13
Bonjour,
J'ai ajouté un attribut sur une catégorie de type oui/non et j'essaye de le récupérer avec le code comment faire ?

$_helper = $this->helper('catalog/output');
$_category = $this->getCurrentCategory();
$_helper->categoryAttribute('nom-de-monattribut')
Problème le code de marche pas.
Magentix le 09/07/2010 à 15:58:14
Et "$_category->getMonAttribut()" tout simplement ? Je n'ai jamais testé avec un attribut de type "oui/non"...
MowWow le 09/07/2010 à 16:05:31
Je viens d'appliquer ce code, ça marche, j'ai ajouté un champ dans category et cela fonctionne. Seul problème, default value ne marche pas. Mon champ et un input text, de type int, j'ai spécifié comme default_value 9, mais ça ne marche pas, quand je crée une nouvelle catégorie, mon champ est vide.. Pourtant j'ai bien checké dans la base de donné, la valeur 9 est bien spécifiée..

Pouvez vous m'aider ? Merci
franckm le 24/08/2010 à 16:43:02
Bonjour,

Une petite interrogation sur ce code et un coup de gueule contre la doc de Magento (quelle doc?). Comment indiquer que l'attribut est un champs à renseigner avec l'éditeur WYSIWYG ?

Si quelqu'un a la réponse il aura toute ma considération.
Anthony Charrex le 25/08/2010 à 11:01:38
En toute logique, ces labels devraient pouvoir être traduits à l'aide du fichier Mage_Adminhtml.csv.

Tu as essayer "is_wysiwyg_enabled" ?

Ajouter un commentaire

Cliquez pour générer un nouveau code

* champs obligatoires