Ajouter une nouvelle méthode de paiement

  • De le 06 janvier 2010
  • Difficulté : 4/4

Ajouter une nouvelle méthode de paiement Un petit tutoriel sur l'ajout d'une nouvelle méthode de paiement dans Magento : nous allons mettre en place un module offrant aux clients la possibilité de régler leurs achats par virement bancaire. Ce module peut être dupliqué pour d'autres moyen de paiement...

Magento propose par défaut le mode de règlement Chèque / Mandat. Cette méthode peut être utilisée pour un règlement par chèque, par virement ou pour les deux (au choix du client).

La problématique dans notre exemple est que nous souhaitons proposer les 2 modes de règlement de façon distincte, afin de les différencier facilement par la suite. Nous n'avons donc pas d'autre solution que d'ajouter une nouvelle méthode de règlement...

Ce module pourra être facilement dupliqué pour d'autres méthodes de paiement que vous souhaiteriez ajouter et qui ne nécessitent pas un paiement en ligne (virement administratif, paiement au retrait de la marchandise en magasin...)

Architecture du module

  • app/code/local/Magentix/Virement/Block/
  • Form.php
  • Info.php
  • app/code/local/Magentix/Virement/etc/
  • config.xml
  • system.xml
  • app/code/local/Magentix/Virement/Helper/
  • Data.php
  • app/code/local/Magentix/Virement/Model/
  • PaymentMethod.php
  • app/design/frontend/default/default/template/payment/form/
  • virement.phtml
  • app/design/frontend/default/default/template/payment/info/
  • virement.phtml
  • app/design/adminhtml/default/default/template/payment/form/
  • virement.phtml
  • app/design/adminhtml/default/default/template/payment/info/
  • virement.phtml
  • app/etc/modules/
  • Magentix_Virement.xml

Extension

Le module se compose donc tout simplement de 2 blocks, d'un Helper et d'un Model. Les blocs seront mis en forme via les fichiers du template associés et définis dans le module (fichiers virement.phtml). Ils seront utilisés à la fois sur le frontend et dans l'administration. Pour les 2 templates (celui du frontend et celui de l'admin) les noms des fichiers et des chemins seront donc identiques (templates default dans notre exemple).

Nos 2 blocs, Magentix_Virement_Block_Form et Magentix_Virement_Block_Info hériteront de la classe Mage_Payment_Block_Form. Il suffit simplement de spécifier, depuis le constructeur, le fichier du template à utiliser :

app/code/local/Magentix/Virement/Block/Form.php

<?php

class Magentix_Virement_Block_Form extends Mage_Payment_Block_Form {
    protected function _construct() {
        $this->setTemplate('payment/form/virement.phtml');
        parent::_construct();
    }
}

app/code/local/Magentix/Virement/Block/Info.php

<?php

class Magentix_Virement_Block_Info extends Mage_Payment_Block_Info {
    protected function _construct() {
        parent::_construct();
        $this->setTemplate('payment/info/virement.phtml');
    }
}

Nous proposerons lors de la configuration de la méthode de paiement le renseignement de 2 champs : le RIB, et une information supplémentaire libre (ex : "Expédition à réception du règlement"). Le Model sera relativement simpliste. On y indique 3 variables distinctes protégées : le code de la méthode et le type des blocks précédemment créés à utiliser (form et info). 2 méthodes se chargeront de retourner respectivement le texte associé au RIB et à l'information complémentaire :

app/code/local/Magentix/Virement/Model/PaymentMethod.php

<?php

class Magentix_Virement_Model_PaymentMethod extends Mage_Payment_Model_Method_Abstract {
    protected $_code  = 'virement';
    protected $_formBlockType = 'virement/form';
    protected $_infoBlockType = 'virement/info';

    public function getInformation() {
        return $this->getConfigData('information');
    }

    public function getRib() {
        return $this->getConfigData('rib');
    }
}

On ajoute la classe Magentix_Virement_Helper_Data qui ne contiendra aucune méthode particulière :

app/code/local/Magentix/Virement/Helper/Data.php

<?php

class Magentix_Virement_Helper_Data extends Mage_Core_Helper_Abstract {

}

Indiquons ensuite l'ensemble des classes du module dans le fichier de configuration, ainsi que la déclaration de cette nouvelle méthode de paiement (noeud payment) :

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

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_Virement>
            <version>0.1.0</version>
        </Magentix_Virement>
    </modules>
    <global>
        <models>
            <virement>
                <class>Magentix_Virement_Model</class>
            </virement>
        </models>
        <blocks>
            <virement>
                <class>Magentix_Virement_Block</class>
            </virement>
        </blocks>
        <helpers>
            <virement>
                <class>Magentix_Virement_Helper</class>
            </virement>
        </helpers>
    </global>
    <default>
        <payment>
            <virement>
                <active>1</active>
                <model>virement/paymentMethod</model>
                <allowspecific>0</allowspecific>
                <title>Virement</title>
            </virement>
         </payment>
    </default>
</config>

Pour la configuration de la méthode depuis le menu Système > Configuration > Ventes > Modes de paiement, éditons le fichier system.xml en y indiquant l'ensemble des variables requises (Statut de la nouvelle commande, pays concernés, titre de la méthode...) :

app/code/local/Magentix/Virement/etc/system.xml

<?xml version="1.0"?>
<config>
  <sections>
      <payment>
        <groups>
           <virement translate="label" module="virement">
              <label>Virement</label>
              <sort_order>670</sort_order>
              <show_in_default>1</show_in_default>
              <show_in_website>1</show_in_website>
              <show_in_store>0</show_in_store>
              <fields>
                <active translate="label">
                   <label>Enabled</label>
                   <frontend_type>select</frontend_type>
                   <source_model>adminhtml/system_config_source_yesno</source_model>
                   <sort_order>1</sort_order>
                   <show_in_default>1</show_in_default>
                   <show_in_website>1</show_in_website>
                   <show_in_store>0</show_in_store>
                </active>
                <order_status translate="label">
                   <label>New order status</label>
                   <frontend_type>select</frontend_type>
                   <source_model>adminhtml/system_config_source_order_status</source_model>
                   <sort_order>2</sort_order>
                   <show_in_default>1</show_in_default>
                   <show_in_website>1</show_in_website>
                   <show_in_store>0</show_in_store>
                </order_status>
                 <allowspecific translate="label">
                   <label>Payment from applicable countries</label>
                   <frontend_type>allowspecific</frontend_type>
                   <sort_order>3</sort_order>
                   <source_model>adminhtml/system_config_source_payment_allspecificcountries</source_model>
                   <show_in_default>1</show_in_default>
                   <show_in_website>1</show_in_website>
                   <show_in_store>1</show_in_store>
                </allowspecific>
                <specificcountry translate="label">
                   <label>Payment from Specific countries</label>
                   <frontend_type>multiselect</frontend_type>
                   <sort_order>4</sort_order>
                   <source_model>adminhtml/system_config_source_country</source_model>
                   <show_in_default>1</show_in_default>
                   <show_in_website>1</show_in_website>
                   <show_in_store>1</show_in_store>
                </specificcountry>                
                <title translate="label">
                   <label>Title</label>
                   <frontend_type>text</frontend_type>
                   <sort_order>5</sort_order>
                   <show_in_default>1</show_in_default>
                   <show_in_website>1</show_in_website>
                   <show_in_store>0</show_in_store>
                </title>
                <rib translate="label">
                   <label>RIB</label>
                   <frontend_type>textarea</frontend_type>
                   <sort_order>6</sort_order>
                   <show_in_default>1</show_in_default>
                   <show_in_website>1</show_in_website>
                   <show_in_store>0</show_in_store>
                </rib>
                <information translate="label">
                   <label>Information</label>
                   <frontend_type>textarea</frontend_type>
                   <sort_order>7</sort_order>
                   <show_in_default>1</show_in_default>
                   <show_in_website>1</show_in_website>
                   <show_in_store>0</show_in_store>
                </information>
                 <sort_order translate="label">
                   <label>Sort order</label>
                   <frontend_type>text</frontend_type>
                   <sort_order>8</sort_order>
                   <show_in_default>1</show_in_default>
                   <show_in_website>1</show_in_website>
                   <show_in_store>0</show_in_store>
                </sort_order>
              </fields>
           </virement>
        </groups>
      </payment>
   </sections>
</config>
Configuration du mode de paiement

Il ne reste plus qu'à éditer les fichiers du template admin et du template frontend. Ils doivent permettre l'affichage des informations relatives au paiement sélectionné sur le site (ici virement). Dans cet exemple nous appliquerons le même code pour l'admin et le frontend, libre à vous par la suite de le personnaliser. Nous utilisons dans ces templates les fonctions getInformation et getRib de notre Model pour la récupération des informations à afficher au client.

app/design/frontend/default/default/template/payment/form/virement.phtml
app/design/adminhtml/default/default/template/payment/form/virement.phtml

<?php if ($this->getMethod()->getRib() || $this->getMethod()->getInformation()): ?>
        <ul class="form-list" id="payment_form_<?php echo $this->getMethodCode() ?>" style="display:none;">
            <li>
                <div class="input-box">
                    <?php if ($this->getMethod()->getInformation()): ?>
                        <label style="color:#c00"><?php echo $this->getMethod()->getInformation(); ?></label>
                    <?php endif; ?>
                    <?php if ($this->getMethod()->getRib()): ?>
                        <div class="rib">
                            <?php echo nl2br($this->getMethod()->getRib()) ?>
                        </div>
                    <?php endif; ?>
                </div>
            </li>
        </ul>
<?php endif; ?>
Template payment form

app/design/frontend/default/default/template/payment/info/virement.phtml
app/design/adminhtml/default/default/template/payment/info/virement.phtml

<p>
<?php echo $this->getMethod()->getTitle(); ?>
<?php if ($this->getMethod()->getRib()): ?>
                <br /><?php echo nl2br($this->getMethod()->getRib()) ?>
<?php endif; ?>
</p>
Template payment info

Il ne reste plus qu'à activer l'extension :

app/etc/modules/Magentix_Virement.xml

<?xml version="1.0"?>
<config>
    <modules>
         <Magentix_Virement>
             <active>true</active>
             <codePool>local</codePool>
             <depends>
                 <Mage_Payment />
             </depends>
             <version>0.1.0</version>
        </Magentix_Virement>
    </modules>
</config>
commentaires

Commentez cet article : Ajouter une nouvelle méthode de paiement