



Il 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).
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).
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 :
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 :
Les champs peuvent alors être renseignés lors de l'é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
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 !
Merci
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?
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();
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.
Pouvez vous m'aider ? Merci
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.
Tu as essayer "is_wysiwyg_enabled" ?