Ajouter des champs personnalisés sur les adresses de facturation et de livraison

  • De le 16 juillet 2012
  • Difficulté : 2/4

Ajouter des champs personnalisés sur les adresses de facturation et de livraison Lors de la saisie de l'adresse postale par le client (facturation et livraison), il est parfois utile d'intégrer des champs supplémentaires non prévus initialement par Magento. Ces champs dépendent généralement de la spécificité de la boutique. (Rédigé à partir d'un Magento CE 1.7)

Dans cet exemple nous souhaitons ajouter un champ SIRET à l'adresse de facturation du client.

Attention, notez bien que cet attribut sera accessible via un objet de type Address (héritant de la classe Mage_Customer_Model_Address_Abstract) :

  • Mage_Customer_Model_Address
  • Mage_Sales_Model_Order_Address
  • Mage_Sales_Model_Quote_Address

Address Objects

Mage::getModel('customer/customer')->load(1)->getPrimaryBillingAddress()->getSiret();

Mage::getModel('sales/order')->load(1)->getBillingAddress()->getSiret();

Mage::getSingleton('checkout/session')->getQuote()->getBillingAddress()->getSiret();

Architecture du module

Admin : Address Templates

Développement du module

config.xml

Commençons par éditer le fichier de configuration config.xml. Il nous faut :

  • Ajouter de nouvelles données dans la base
  • Gérer la copie de l'attribut entre les objets
  • Permettre l'export de l'attribut

Les tags contenus dans le noeud fieldsets ne servent qu'à la conversion d'un objet vers un autre. Dans notre cas il s'agit généralement de créer une réplique de l'adresse contenu dans un quote vers la commande (order), et inversement.

Pour schématiser, un quote peut être assimilé à un "devis". Si le client l'accepte il est alors converti en commande. Le quote contient donc l'ensemble des données de la commande avant sa validation : articles, méthodes de paiement et de livraison, adresses... Le quote est conservé en session jusqu'à validation de la commande.

Les objets convertis sont explicités sous forme de commentaire dans le fichier.

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

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_Address>
            <version>0.1.0</version>
        </Magentix_Address>
    </modules>
    <global>
        <resources>
            <address_setup>
                <setup>
                    <module>Magentix_Address</module>
                    <class>Mage_Customer_Model_Entity_Setup</class>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </address_setup>
        </resources>
        <fieldsets>
            <!-- Mage_Sales_Model_Order >> Mage_Adminhtml_Model_Session_Quote -->
            <sales_copy_order_billing_address>
                <siret><to_order>*</to_order></siret>
            </sales_copy_order_billing_address>

            <!-- Mage_Sales_Model_Order >> Mage_Adminhtml_Model_Session_Quote -->
            <sales_copy_order_shipping_address>
                <siret><to_order>*</to_order></siret>
            </sales_copy_order_shipping_address>

            <sales_convert_quote_address>
                <siret>
                    <!-- Mage_Sales_Model_Quote_Address >> Mage_Sales_Model_Order_Address -->
                    <to_order_address>*</to_order_address>
                    <!-- Mage_Sales_Model_Quote_Address >> Mage_Customer_Model_Address -->
                    <to_customer_address>*</to_customer_address>
                </siret>
            </sales_convert_quote_address>

            <!-- Mage_Sales_Model_Order_Address >> Mage_Sales_Model_Quote_Address -->
            <sales_convert_order_address>
                <siret><to_quote_address>*</to_quote_address></siret>
            </sales_convert_order_address>

            <!-- Mage_Customer_Model_Address >> Mage_Sales_Model_Quote_Address -->
            <customer_address>
                <siret><to_quote_address>*</to_quote_address></siret>
            </customer_address>
        </fieldsets>
    </global>
    <admin>
        <fieldsets>
            <customer_dataflow>
                <siret>
                    <billing>1</billing>
                    <shipping>1</shipping>
                </siret>
            </customer_dataflow>
        </fieldsets>
    </admin>
</config>

mysql4-install-0.1.0.php

Deuxième étape, ajouter dans la base l'attribut Siret. Cet ajout se réalise lors du "setup" de notre module. Nous devons :

1. Ajouter l'attribut siret de type customer_address dans la table eav_attribute

2. Permettre la saisie de données depuis les formulaires

Magento ajoute ces informations dans la table customer_form_attribute. Celle-ci fait le lien entre l'attribut et le type de formulaire depuis lequel le champ doit apparaître : customer_register_address, customer_address_edit et adminhtml_customer_address

3. Ajouter une colonne siret dans les tables utilisées pour le flat

Pour une question de performance lors de l'accès aux données, celles-ci sont regroupées au sein d'une même table. Nous n'avons pas le choix que d'ajouter de nouvelles colonnes.

app/code/local/Magentix/Address/sql/address_setup/mysql4-install-0.1.0.php

<?php

$installer = $this;

$installer->startSetup();

$this->addAttribute('customer_address', 'siret', array(
    'type' => 'varchar', // varchar, text, int, static, datetime
    'input' => 'text', // text, select, date
    'label' => 'Siret',
    'global' => 1,
    'visible' => 1,
    'required' => 0,
    'user_defined' => 1,
    'visible_on_front' => 1
));

/**
 * Si attribut de type select :
 * 'type' => 'select',
 * 'source' => 'eav/entity_attribute_source_table',
 * 'option' => array('values' => array('Mon Option 1', 'Mon Option 2')),
 */

Mage::getSingleton('eav/config')
    ->getAttribute('customer_address', 'siret')
    ->setData('used_in_forms', array('customer_register_address','customer_address_edit','adminhtml_customer_address'))
    ->save();

$installer->run("ALTER TABLE ".$installer->getTable('sales/quote_address')." ADD `siret` varchar(255) NOT NULL");

$installer->run("ALTER TABLE ".$installer->getTable('sales/order_address')." ADD `siret` varchar(255) NOT NULL");

$installer->endSetup();

Magentix_Address.xml

Il nous reste à activer le module, et rafraîchir le cache :

app/etc/modules/Magentix_Address.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_Address>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Customer />
            </depends>
        </Magentix_Address>
    </modules>
</config>

A ce stade le champ Siret apparaît dans les formulaires accessibles depuis l'administration.

Edition de l'adresse client

billing.phtml / shipping.phtml

Pour qu'un client puisse saisir son Siret lors du passage de la commande, éditez le fichier checkout/onepage/billing.phtml de votre template, en ajoutant à l'endroit souhaité :

app/design/frontend/base/default/template/checkout/onepage/billing.phtml

<div class="field">
    <label for="billing:siret"><?php echo $this->__('Siret') ?></label>
    <div class="input-box">
        <input type="text" id="billing:siret" name="billing[siret]"
               value="<?php echo $this->escapeHtml($this->getAddress()->getSiret()) ?>"
               title="<?php echo $this->__('Siret') ?>" class="input-text" />
    </div>
</div>

Vous pouvez faire de même pour le fichier checkout/onepage/shipping.phtml.

Address Templates

Dernière étape, il faut que la nouvelle donnée apparaisse dans tous les templates où les adresses sont affichées. Pour cela, il suffit de se rendre dans l'administration :

  • System > Configuration > Customer > Customer Configuration > Address Templates

On y ajoute la directive correspondant à notre Siret pour l'affichage en mode texte, texte sur une ligne, HTML et PDF :

Address Templates

{{depend siret}}{{var siret}}{{/depend}}
commentaires

Commentez cet article : Ajouter des champs personnalisés sur les adresses de facturation et de livraison