Ajouter une nouvelle méthode de paiement
- Par Magentix le 06/01/2010
- Difficulté : 4/4
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>
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; ?>
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>
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>
''/app/code/core/Mage/Payment/Helper/Data.php on line 72''
Comment je peu solutionner ceci?
Merci
http://www.magentocommerce.com/magento-connect/Phoenix+Medien+-+DE/extension/304/bank-prepayment-vorkasse-
@+
je n'arrive pas à installer le module dans magento 1.4.0.1 !
Pouvez-vous m'aider ?
Bonne journée
Damien
Je poste dès que j'ai la réponse ;)
Avez-vous quelques news sur l'utilisation du module sous la 1.4 ?
Avez-vous pu regarder la comptabilité ?
Call to a member function setMethod() on a non-object
bout de code concerné :
public function getMethodFormBlock(Mage_Payment_Model_Method_Abstract $method)
{
$block = false;
$blockType = $method->getFormBlockType();
if ($this->getLayout()) {
$block = $this->getLayout()->createBlock($blockType);
$block->setMethod($method); // la fameuse ligne 133...
}
return $block;
}
-----------------------------------------------------
une idée ? ...je cherche
protected $_formBlockType = 'payment/form';
protected $_infoBlockType = 'payment/info';
au lieu de :
protected $_formBlockType = 'virement/form';
protected $_infoBlockType = 'virement/info';
ça marche...cependant lorsque je modifie les infos dans la config en mettant un rib etc cela ne se sauvegarde pas ! (version 1324)
Comment modifier le texte du mode de paiement "Purchase Order"? Par défaut est écrit "Numéro de bon de commande".
Merci d'avance.
j'ai réussi à créer cette nouvelle method de payement, j'ai pensé que tout va bien alors que je ne peux pas voir les détails de la commande qui est réalisée avec cette method, que dois je faire pour résoudre le problème??!!
Merci d'avance.
j'ai réussi à créer cette nouvelle method de payement, Je vouderai maintenant récupérer l'ID du commande, y a t'il quelqu'un qui peut m'aider.
Meci d'avance