Le grand avantage de Magento par rapport aux solutions concurrentes réside dans l’utilisation du modèle EAV, qui apporte une grande souplesse dans la gestion de votre boutique.
Ce qui vous permets de rajouter à la volée des paramètres à vos produits ( entre autre )

Pour cet article je souhaite réaliser les éléments suivants :

  • Création d’un nouveau jeu d’attribut “Vélo”
  • Création d’un groupe d’attributs “vélo”
  • Création de nouveaux attributs ” wheel_size”,”supension”
  • Afficher ces attributs dans l’administration, et dans le front office

Le tout bien évidement sans toucher à l’administration 🙂
C’est donc parti pour la création d’un module qui va gérer tout ça , il va s’appeller Specific_Catalog et qui sera en version 0.1.0

Je ne détaille pas les éléments standards de la création du module, mais uniquement les éléments spécifiques à la problématique.

Pour commencer dans le fichier config.xml de notre module il faut créer insérer le code suivant ( dans la balise global )
Celui-ci va nous permettre de définir les ressources d’installation de notre module.

<resources>
<!-- Installation de notre module -->
<specificcatalog_setup>
  <setup>
   <module>Specific_Catalog</module>
   <class>Specific_Catalog_Model_Resource_Eav_Mysql4_Setup</class> <!-- Classe specifique d'installation -->
  </setup>
  <connection>
   <use>core_setup</use>
  </connection>
 </specificcatalog_setup>
<!-- Resource write -->
 <specificcatalog_write>
  <connection>
   <use>core_write</use>
  </connection>
 </specificcatalog_write>
 <!-- Resource Read -->
 <specificcatalog_read>
  <connection>
   <use>core_read</use>
  </connection>
 </specificcatalog_read>
</resources>

Créér ensuite le fichier app/code/local/Specific/Catalog/Model/Resource/Eav/Mysql4/Setup.php qui contiendra le code suivant :

<?php
class Specific_Catalog_Model_Resource_Eav_Mysql4_Setup extends Mage_Eav_Model_Entity_Setup
{
 
/**
* Création d'un jeu d'attribut avec tous les champs par défaut
* @param type $productEntityTypeId
* @param type $attributeSetName
* @return \Specific_Catalog_Model_Resource_Eav_Mysql4_Setup
*/
    public function createAttributeSetFromDefault($productEntityTypeId, $attributeSetName)
    {
        Mage::getModel('eav/entity_attribute_set')
            ->setEntityTypeId($productEntityTypeId)
            ->setAttributeSetName($attributeSetName)
            ->save()
            ->initFromSkeleton($this->getDefaultAttributeSetId($productEntityTypeId))
            ->save();
 
        return $this;
    }
}
?>

Cette classe étends Mage_Eav_Model_Entity_Setup qui permets de gérer les installations des attributs EAV.
Dans celle-ci j’ai créé une nouvelle fonction qui créer un jeu d’attribut avec tous les champs et groupes du jeu d’attribut par défaut

Pour finir tous va s’effectuer dans le fichier d’installation du module dans :

app/code/local/Specific/Catalog/sql/specificcatalog_setup/mysql4-install-0.1.0.php

Le nom du dossier specificcatalog_setup correspond au nom de la balise utilisé dans le noeud resources de votre fichier config.xml
Le numéro ( 0.1.0 ) , correspond à la version de votre module définie dans ce même fichier.

 

<?php
 
//Début de l'installation
$installer = $this;
$installer->startSetup();
 
//Identifiant du type EAV Catalog Product
$productEntityTypeId = $installer->getEntityTypeId('catalog_product');
 
//Création des nouveaux jeux d'attributs ( Vélos // Casque // Vêtement , lister les autres à la suite )
//On n'utilise pas la méthode standard, mais une fonction perso car on veut ajouter tous les champs du jeu d'attribut défaut
$this->createAttributeSetFromDefault($productEntityTypeId,'velo');
 
//Identifiant du jeu d'attribut vélo créé
$attributeSetId = $this->getAttributeSetId($productEntityTypeId,'velo');
 
//Ajout d'un nouveau groupe d'attribut "velo" rattaché au jeu d'attributs vélo
$this->addAttributeGroup($productEntityTypeId, $attributeSetId , 'velo');
 
//Identifiant du groupe "Vélo" créé
$attributeGroupId = $this->getAttributeGroupId($productEntityTypeId, $attributeSetId, 'velo');
 
//Création de l'attribut wheel_size
$this->addAttribute($productEntityTypeId, 'wheel_size',
   array(
    'label'                      => 'Taille des roues',
    'group'                      => '',
    'type'                       => 'text',
    'input'                      => 'text',
    'global'                     => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,// Mettre ici la portée de l'attribut ( global, website, store )
    'user_defined'               => true,
    'required'                   => false,
    'visible'                    => true,
    'source'                     => 'eav/entity_attribute_source_table',
    'backend'                    => null,
    'searchable'                 => true,
    'visible_in_advanced_search' => true,
    'visible_on_front'           => true,
    'is_configurable'            => false,
    'is_html_allowed_on_front'   => false,
       )
    );
 
//Création de l'attribut suspension
$this->addAttribute($productEntityTypeId, 'suspension',
   array(
    'label'                      => 'Suspension',
    'group'                      => '',
    'type'                       => 'text',
    'input'                      => 'text',
    'global'                     => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL, 
    'user_defined'               => true,
    'required'                   => false,
    'visible'                    => true,
    'source'                     => 'eav/entity_attribute_source_table',
    'backend'                    => null,
    'searchable'                 => true,
    'visible_in_advanced_search' => true,
    'visible_on_front'           => true,
    'is_configurable'            => false,
    'is_html_allowed_on_front'   => false,
       )
    );
 
//Rattachement des attributs au groupe "Vélo" du jeu d'attribut "Vélo" avec les positions
$this->addAttributeToGroup($productEntityTypeId, $attributeSetId, $attributeGroupId, $this->getAttributeId($productEntityTypeId, 'wheel_size'), 1);
$this->addAttributeToGroup($productEntityTypeId, $attributeSetId, $attributeGroupId, $this->getAttributeId($productEntityTypeId, 'suspension'), 2);
 
//Fin de l'installation
$installer->endSetup();

Déposez les fichiers de votre module sur votre serveur, vider de le cache et exécutez n’importe quelle page.
Le script d’installation va tourner et les nouveaux attributs seront bien installés et visibles dans le back-office !

eav-product

 

Pour afficher les attributs dans le front office, il faut procéder de la même manière que pour n’importe quel autre attribut :
Ex sur la fiche produit :

echo $_product->getWheelSize();
echo $product->getSuspension();