Une mise à jour de cet article pour Magento 2 est disponible : Magento 2 : Ajouter des nouveaux attributs aux formulaires de création de compte
Dans cet article nous allons voir ensemble comment ajouter proprement un nouvel attribut client qui sera affiché dans les formulaires suivants

  • Création de compte ( normal )
  • Création de compte ( checkout )
  • Création de compte ( admin )

Pour l’exemple nous allons créer un attribut « website_know », qui permettra de demander au client via quel source il a connu le site.

Le tout va être géré via un module nommé « Hhennes_Customer ».
Je ne détaillerais pas toutes les étapes de création du module mais uniquement les points particuliers.

Partie Code :

Pour commencer voici le fichier de configuration de notre module.

 <?xml version="1.0"?>
 
<config>
 
    <!-- Configuration de base du Module -->
    <modules>
        <Hhennes_Customer>
            <version>0.1.0</version>    
        </Hhennes_Customer>
    </modules>
 
    <!-- Configuration globale -->
    <global>
        <helpers>
            <hhennes_customer>
                <class>Hhennes_Customer_Helper</class>    
            </hhennes_customer>
        </helpers>
       <!-- Configuration de l'installation -->
        <resources>
            <hhennescustomer_setup>
                <setup>
                    <module>Hhennes_Customer</module>
                    <class>Mage_Customer_Model_Entity_Setup</class>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </hhennescustomer_setup>
        </resources>
        <!-- Nouveau champ de création de compte dans le checkout -->
        <fieldsets>
            <customer_account>
                <website_know>
                    <create>1</create>
                    <update>1</update>
                    <to_quote>*</to_quote>
                </website_know>
            </customer_account>
            <checkout_onepage_quote>
                <website_know>
                    <to_customer>*</to_customer>>
                </website_know>
            </checkout_onepage_quote>
        </fieldsets>
    </global>
    <frontend>
        <layout>
            <updates>
                <hhennes_customer>
                    <file>hhennes_customer.xml</file>
                </hhennes_customer>
            </updates>
        </layout>
    </frontend>
</config>

Nous reviendrons plus tard sur la signification de l’ensemble des noeuds.

Passons à présent à l’installation avec le fichier mysql4-install-0.1.php dans le dossier sql/hhennescustomer_setup de notre module

 <?php
/**
 * Installation du module Hhennes Customer
 * 
 * Création d'un nouvel attribut qui demande à l'utilisateur comment il a connu le site
 * Ce paramètre doit être disponible dans tous les formulaires de création de compte
 */
 
 
$installer = $this;
$installer->startSetup();
 
$entityTypeId = $installer->getEntityTypeId('customer');
 
//Création d'un nouvel attribut qui demande à l'utilisateur comment il a connu le site
$this->addAttribute('customer', 'website_know', array(
    'input' => 'select',
    'type' => 'int',
    'label' => 'Website Know',
    'source' => 'eav/entity_attribute_source_table',
    'visible' => 1,
    'required' => false,
    'user_defined' => 1,
    'system' => false,
    //'option' => array('values' => array('By a friend', 'By the work', 'By google', 'Other')) 
    //Si on veut ajouter sur un seul store , on peut utiliser la syntaxe commentée
));
 
/**
 * Ajout des Options
 */
$websiteOptions = array(
    'attribute_id' => $this->getAttributeId('customer', 'website_know'), //Identifiant de l'attribut
    'value' => array(
        'friend' => array( // Ce tableau n'a pas de clé numérique l'option va donc être créée
            0 => 'By a friend', //Valeur Admin
            1 => 'Par un ami' // Valeur Store 1
        ),
        'work' => array(
            0 => 'By the work',
            1 => 'Par le travail'
        ),
        'google' => array(
            0 => 'By google',
            1 => 'Par google'
        ),
        'other' => array(
            0 => 'Other',
            1 => 'Autre'
        ),
    ),
    'order' => array( //Classement des éléments
        'friend' => 1,
        'work' => 2,
        'google' => 3,
        'other' => 4,
    )
);
 
$this->addAttributeOption($websiteOptions);
 
/**
 * Ajout de l'attribut aux formulaires nécessaires
 */
Mage::getModel('eav/config')
        ->getAttribute('customer', 'website_know')
        ->setData('used_in_forms', array(
            'adminhtml_customer',
            'checkout_register',
            'customer_account_create')
        )
        ->save();
 
//Ajout de l'attribut dans la table salesquote pour les création de comptes dans le checkout
$tablequote = $this->getTable('sales/quote');
$installer->run("ALTER TABLE $tablequote ADD `website_know` INT(11) NOT NULL");
 
$installer->endSetup();

Dans ce fichier plusieurs étapes sont importantes pour que le nouvel attribut créé soit bien disponible dans les formulaires de création de compte.

  • L’ajout de l’attribut aux formulaires :

Il faut indiquer les formulaires pour lequel vous souhaitez que le nouvel attribut soit disponible. ( adminhtml_customer , checkout_register, customer_account_create dans notre cas)

  • Ajout d’un champ dans la table sales/quote

Cette étape est uniquement nécessaire si vous souhaitez ajouter votre attribut sur le formulaire checkout_register.
Elle est combinée avec les noeuds fieldset du formulaire de configuration, ,nous verrons plus loin leur fonctionnement en détail

Nous pouvons maintenant installer le module, et vous pouvez constater que du côté de l’administration, le nouvel attribut est bien disponible et affiché :

Customer admin

 

Partie Front Office

Passons maintenant au coté désign Front Office :

Pour que notre nouvel attribut puisse être édité, il faut donc maintenant afficher ce champ dans les formulaires.

Le fichier de création du compte client standard est situé dans : app/design/frontend/base/default/template/persistent/customer/form/register.phtml
Le fichier de création du compte client dans le checkout : app/design/frontend/base/default/template/checkout/onepage/billing.phtml

Vous pouvez constatez que ces fichiers comportent le code suivant  avant la fin du formulaire de création de compte.

<?php echo $this->getChildHtml('form.additional.info'); ?>

Nous allons ajouter le template de notre module sur cet élément.

Pour cela nous allons utiliser un fichier de layout pour réaliser cette action.
Ce fichier sera à placer dans le dossier app/design/frontend/base/default/layout/hhennes_customer.xml
Avec le contenu suivant :

 <?xml version="1.0" encoding="UTF-8"?>
<layout version="0.1.0">
 
    <!-- Ajout du champ supplémentaire dans le formulaire de création de compte -->
    <customer_account_create>
        <reference name="form.additional.info">
            <!-- On peut rajouter ici autant de blocks que souhaités -->
            <block type="core/template" name="hhennes.customer.fields" as="hhennes.customer.fields" template="hhennes/customer/form/register.phtml" />
        </reference>
    </customer_account_create>
    
    <!-- Ajout du champ supplémentaire dans le formulaire de création de compte du checkout -->
    <checkout_onepage_index>
        <reference name="checkout.onepage.billing">
            <reference name="form.additional.info">
                <block type="core/template" name="hhennes.customer.fields" as="hhennes.customer.fields" template="hhennes/customer/form/register.phtml">
                    <!-- On défini que le block est dane le checkout pour définir les variables -->
                    <action method="setData">
                        <name>in_checkout</name>
                        <value>1</value>
                    </action>
                </block>
            </reference>
        </reference>
    </checkout_onepage_index>
    
</layout>

Pour éviter de créer des fichiers inutiles vous pouvez constater que je n’utilise qu’un seul template pour les 2 emplacements.
Mais en passant une variable dans le cas du checkout.

Le fichier est à créer dans app/design/frontend/base/default/default/hhennes/customer/form/register.phtml avec le contenu suivant :

 <?php
// Ce template est utilisé dans le formulaire de création de compte standard et checkout
// On détermine le nom de la variable en fonction du contexte
if ( $this->getData('in_checkout')) {
    $selectName = "billing[website_know]";
}
else {
    $selectName = "website_know";
}
?>
<li class="fields">
    <div class="field">
        <label for="<?php echo $selectName; ?>"><?php echo $this->__('How do you know about this website'); ?></label>
        <div class="input-box">
 
            <?php
            //Récupération des informations de l'attribut
            $attributeId = Mage::getResourceModel('eav/entity_attribute')->getIdByCode('customer', 'website_know');
            $attribute = Mage::getModel('eav/entity_attribute')->load($attributeId);
            $attributeOptions = $attribute->getSource()->getAllOptions();
 
            //On utilise l'affichage standard d'un block html
            echo $this->getLayout()->createBlock('core/html_select')
                    ->setName($selectName)
                    ->setId($selectName)
                    ->setTitle($this->__('website_know'))
                    ->setClass('validate-select')
                    ->setOptions($attributeOptions)
                    ->getHtml();
            ?>
        </div>
    </div>
</li>

Nous avons à présent bien les nouveaux champs qui s’affichent sur le front Office à la fois sur le formulaire de création de compte standard, et checkout.

customer-checkout customer-register

L’enregistrement du nouvel attribut fonctionne déjà dans le formulaire de création de compte, mais pour l’instant ce n’est pas le cas dans le formulaire de checkout.

Enregistrement des informations de l’attribut dans le formulaire création du checkout

Lors de l’enregistrement d’un client depuis le formulaire de création du checkout, le processus est un peu particulier.
J’avais cherché pas mal d’informations sur le sujet , mais je n’ai trouvé aucun article expliquant le processus complet, voici donc un récapitulatif du fonctionnement.

Les données sont associées au panier client ( table :  sales_flat_quote/ ), il faut donc que notre champ puisse y être associé.
C’est pourquoi dans notre fichier d’installation le code suivant est présent :

//Ajout de l'attribut dans la table salesquote pour les création de comptes dans le checkout
$tablequote = $this->getTable('sales/quote');
$installer->run("ALTER TABLE $tablequote ADD `website_know` INT(11) NOT NULL");

L’association des données client au panier est réalisée dans le fichier : app/code/core/Mage/Checkout/Model/Type/Onepage/OnePage.php dans la fonction _validateCustomerData() via le code :

Mage::helper('core')->copyFieldset('customer_account', 'to_quote', $customer, $quote);

Les données fieldset sont récupérées depuis le fichier de configuration du module ( config.xml ) dans les noeuds fieldsets
Afin que les données soient copiées lors de cette étape il est donc nécessaire d’avoir les informations suivantes :

<fieldsets>
<customer_account> <!-- Nom du fieldset -->
    <website_know>
        <create>1</create>
        <update>1</update>
        <to_quote>*</to_quote> <!-- Nom du fieldset de destination-->
    </website_know>
</customer_account>
</fieldsets>

Une fois cette information ajoutées, les données de notre attribut seront bien présentes dans la table des paniers.
Cependant l’information ne sera pas encore stockée dans les données du client.

Pour finir il faut encore que les données de notre attribut soit copiées du panier vers le client.
Cette association est fait dans la fonction _prepareNewCustomerQuote() via le code :

Mage::helper('core')->copyFieldset('checkout_onepage_quote', 'to_customer', $quote, $customer);

C’est pourquoi il faut encore rajouter les informations suivantes dans le noeud fieldset du fichier de configuration, à la suite de customer_account.

 <checkout_onepage_quote>
    <website_know>
    <to_customer>*</to_customer>>
    </website_know>
</checkout_onepage_quote>

Une fois cela terminés, les données de l’attribut client seront bien prises en compte dans tous les cas.

Pour tout ceux qui ne veulent pas se creuser la tête, le module est disponible sur github : https://github.com/nenes25/magento_customer
Si vous avez compris le principe il sera facile de rajouter rapidement d’autres attributs en utilisant cette méthodologie.