Magento Avancé Episode 4 – Attribute, Attributeset, AttributeGroup

17 octobre 2012

Vous l’avez vu dans les tutoriels sur la création de module, dans cette nouvelle série de tutoriels on va voir comment fonctionne magento plus en détails. Dans les précédents tutoriels on a déjà rajouter des attributs mais pour l’instant j’ai jamais vraiment expliquer comment ça fonctionne ou encore comment créer ses propres options d’attributs (a afficher dans un select par exemple). Je vais donc m’en occuper dans ce tutoriel.

L’AttributeSet :

Qu’est ce qu’un attributeSet :

Quand on crée un produit, on peu lui associer un regroupement d’attribut (on dit un attributeSet, “Default” est l’attributeSet présent par défault) et un type de produit (par exemple produit simple). Imaginons qu’on veuille créer plusieurs types de produits : balais et moto par exemple. On va créer deux attributeSet qui auront chacun une liste d’attributs différent.

Le balais aura comme attribut :
– taille du manche
– type de balais
– poids

La moto :
– puissance du moteur
– couleur
– marque

On va donc créer deux AttributeSet qui contiendront chacun leurs attributs. On pourra sélectionner l’attributeSet lors de la création d’un produit :

Comment on crée un attributeSet :

Pour créer l’attributeSet on va faire comme ca : (dans toute la suite de ce tutoriel, on supposera qu’on est dans un fichier de setup sql Magento).

  $entityType = 'catalog_product';
  $attrSetName = 'Balais';
  $installer->addAttributeSet($entityType, $attrSetName);

Souvent, on veut copier tous les attributs des produits simples et en rajouter des autres en plus pour notre attributeSet.
Pour cela on va faire copier les attributs dans notre attributeSet à partir de l’attributSet par défaut grâce à la méthode initFromSkeleton($attributeSetId)

  $entityType = 'catalog_product';
  $attrSetName = 'Balais';
  //on récupére l'id de l'attributeSet par défaut
  $attrSetDefaultId =  $installer->getAttributeSet($entityType, 'Default', 'attribute_set_id');
  //on recupere l'id de l'attributeSet qu'on a crée précédemment
  $attrSetId = $installer->getAttributeSet($entityType, $attrSetName, 'attribute_set_id');
  //on copie les champs par défaut grace a la méthode initFromSkeleton
  $attrSet = Mage::getModel('eav/entity_attribute_set')->load($attrSetId);
  $attrSet->initFromSkeleton($attrSetDefaultId);
  $attrSet->save();

L’AttributeGroup :

Souvent on veut ajouter son attribut dans un groupe, pour cela on assigne un groupe à l’attributeSet :

//Attribute group creation
 $entityType = 'catalog_product';
 $attrSetName = 'Balais';
 $attrGroupName = 'Balais';
 //on recupere l'id de l'attributeSet "Balais"
 $attrSetId = $installer->getAttributeSet($entityType, $attrSetName, 'attribute_set_id');
 //on crée l'attributeGroup
 $installer->addAttributeGroup($entityType, $attrSetId, $attrGroupName);

L’Attribute :

On l’a déjà fait, l’attribut est ajouté grâce à cette méthode :

/*
  * ATTRIBUT taillemanche
  */
  //Creation de l'Attribut
  $installer->addAttribute($entityType, 'taillemanche',
  array('label'             => 'Taille du manche', //le label
        'type'              => 'int',    //backend_type
        'input'             => 'select', //frontend_input
        'source'            => 'pfay_test/attribute_source_taillemanche',    //ici on définit les options du select (voir la suite)
        'required'        => true, //le champs est requis
        'visible'         => true, //le champs est visible
        'default'        => '0', //la valeur par default est 0
        'group'          => 'Balais', //il sera dans l'onglet "Balais" de la fiche produit (en admin)
        'global'       => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_STORE, //il est défini par Store
  ));
//On ajoute l'attribut à l'attributeSet
 $installer->addAttributeToSet(
            $entityType,
            $attrSetId,
            $attrGroupName,
            'taillemanche'
  );

si on veut rajouter un attribut déjà existant à un attributeGroup (qui lui même est rattaché à un attributeSet) on utilisera la fonction addAttributeToGroup:

 $entityType = 'catalog_product';
 $attrSetName = 'Balais';
 $attrSetId = $installer->getAttributeSet($entityType, $attrSetName, 'attribute_set_id');
 $installer->addAttributeToGroup($entityType, $attrSetId, 'General', 'name', 0);

Ce bout de code rajoutera l’attribut “name” dans l’onglet General de la fiche produit (onglet présent par défaut).

Les options de l’attribut avec la source :

Afin de définir une liste déroulante avec nos label et nos valeurs, on va définir dans notre config.xml, le répertoire pour les models :

...
 <global>
         <models>
            <pfay_test>
                <class>Pfay_Test_Model</class>
            </pfay_test>
         </models>
</global>
...

Notre attribut “taillemanche” va utiliser la source pfay_test/attribute_source_taillemanche, ce qui veut dire qu’il ira dans /app/code/local/Pfay/Test/Model/Attribute/Source/Taillemanche.php pour récupérer ses infos. On va donc créer cette classe (qui étendra Mage_Eav_Model_Entity_Attribute_Source_Abstract):

<?php
class Pfay_Test_Model_Attribute_Source_Taillemanche extends Mage_Eav_Model_Entity_Attribute_Source_Abstract
{
    const UNMETRECINQUANTE= 150;
    const DEUXMETRE = 200;
    public function getAllOptions()
    {
        if (is_null($this->_options)) {
            $this->_options = array(
                array(
                    'label' => Mage::helper('core')->__('1m50'),
                    'value' => self::UNMETRECINQUANTE
                ),
                array(
                    'label' => Mage::helper('core')->__('2m'),
                    'value' => self::DEUXMETRE
                ),
            );
        }
        return $this->_options;
    }
    public function getOptionText($value)
    {
        $options = $this->getAllOptions();
        foreach ($options as $option) {
                if (in_array($option['value'], $value)) {
                    return $option['label'];
                }
        }
        return false;
    }
}

Et voilà, vous savez maintenant utiliser les AttributeSet, rajouter un attribut et définir des options pour un attribut. Maintenant au boulot !! ;)

retourner au sommaire

A voir aussi :

  • Rien pour le moment
Vincent # 4 décembre, 2012

Bonjour,
si l’on veux crée des attributs sans option c’est à dire des input type text. Par exemple pour crée un ballai unique avec une taille rentrer par l’utilisateur. Cette taille devras mettre le prix à jour à l’aide d’une variable globale prix au cm =). A ce moment la comment sa se passe?

J’ai compris comment crée un attribut ce que j’ai du mal à visualiser c’est les interactions. Si l’utilisateur rentre une taille je vois pas ce que je dois appeler pour mettre à jour le prix. Et surtout ou je dois mettre ma fonction pour traiter l’appel (dans un contrôler j’imagine).
Une petite aide informative pourrais m’éclairer fortement.
Merci d’avance.

# 24 décembre, 2012 Pierre FAY

Salut Vincent,
Tu peux commencer par créer un controlleur, ton formulaire une fois rempli fera une requette ajax vers celui ci qui fera le calcul et qui te renverra tout ca et te mettra a jour le tout.
Pour faire ca il faut faire un peu de calculs, un peu d’ajax, un peu de développement mais c’est faisable…faut se creuser un peu la tête la par contre c’est du développement c’est vrai que pour commencer c’est un exercice pas évident :) mais ca peu etre un bon exercice :) bon courrage Vincent :)

Vous aussi donnez votre avis
(requis)



Rechercher dans le site :