您的位置:首页 > 其它

37. customer payment(1)

2016-07-02 16:05 330 查看
1.创建 system.xml 文件

<?xml version="1.0"?>

<config>
<sections>
<payment>
<groups>
<pay translate="label" module="pay">
<label>Www Payment Module</label>
<sort_order>666</sort_order>
<frontend_type>text</frontend_type>
<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>Enable</label>
<sort_order>1</sort_order>
<frontend_type>select</frontend_type>
<source_model>adminhtml/system_config_source_yesno</source_model>
<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>
<sort_order>2</sort_order>
<frontend_type>select</frontend_type>
<source_model>adminhtml/system_config_source_order_status_processing</source_model>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>0</show_in_store>
</order_status>
<title translate="label">
<label>Title</label>
<sort_order>3</sort_order>
<frontend_type>text</frontend_type>
<show_in_default>1</show_in_default>
<show_in_website>1</show_in_website>
<show_in_store>0</show_in_store>
</title>
</fields>
</pay>
</groups>
</payment>
</sections>
</config>




2.在 config.xml 为 system.xml 所创建的内容填写默认值

<default>
<payment>
<pay>
<active>1</active>
<model>pay/pay</model>
<order_status>processing</order_status>
<title>Www Payment Method</title>
</pay>
</payment>
</default>

这里值得一提的就是 <model> 标签, 它指明了支付方式 model 类文件的路径


3. Model 类

接下来就是为我们的支付方式添加 model 类文件, 刚已经在 < model> 标签里声明了, Www_Pay_Model_Pay

class Www_Pay_Model_Pay extends Mage_Payment_Model_Method_Abstract
{
protected $_code = 'pay';
}




4.添加表单

class Www_Pay_Model_Pay extends Mage_Payment_Model_Method_Abstract
{
protected $_code = 'pay';

protected $_formBlockType = 'pay/form_pay';

}


该变量申明了一个 block 文件的路径,其包含了表单内容, 代码如下:

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


这里很简单, 就是设置了表单(Form)模板文件的路径 ‘pay/form/pay.phtml’, 在 pay.phtml 文件中写入:


<?php $_code = $this->getMethodCode() ?>
<ul class="form-list" id="payment_form_<?php echo $_code ?>" style="display:none;">
<li>
<label for="<?php echo $_code ?>_check_no" class="required"><em>*</em><?php echo $this->__('Check No#') ?></label>
<span class="input-box">
<input type="text" title="<?php echo $this->__('Check No#') ?>" class="input-text required-entry" id="<?php echo $_code ?>_check_no" name="payment[check_no]" value="<?php echo $this->htmlEscape($this->getInfoData('check_no')) ?>" />
</span>
</li>
<li>
<label for="<?php echo $_code ?>_check_date" class="required"><em>*</em><?php echo $this->__('Check Date:') ?></label>
<span class="input-box">
<input type="text" title="<?php echo $this->__('Check Date:') ?>" class="input-text required-entry" id="<?php echo $_code ?>_check_date" name="payment[check_date]" value="<?php echo $this->htmlEscape($this->getInfoData('check_date')) ?>" />
</span>
</li>
</ul>
<div>
<?php echo $this->getMethod()->getConfigData('message'); ?>
</div>


<ul>标签内的 id “payment_form_<?php echo $_code ?>” 非常重要, 这里我们已经把它默认设为 display:none, 当到达 payment 这步的时候它是隐藏的, 只有当我们点击 ‘Pay by Check’ 选项的时候, <ul>标签就会变为 display:block, 到这里就是让表单块显示所需的条件
还有个需要记住的就是: protected $_formBlockType = ‘pay/form_pay’; 这个是用来显示表单的, 不可缺少


当我们创建表单后, 必须保证客户输入的值会成功保存到数据库, 并且可以在 Admin -> Sales -> Orders 中看到, 所以这一步我们就来看下如何将数据保存到数据库, 同时也对数据进行验证, 在我们的 model 类文件 Www_Pay_Model_Pay 中添加两个方法:


public function assignData($data)
{
if (!($data instanceof Varien_Object)) {
$data = new Varien_Object($data);
}
$info = $this->getInfoInstance();
$info->setCheckNo($data->getCheckNo())
->setCheckDate($data->getCheckDate());
return $this;
}

public function validate()
{
parent::validate();

$info = $this->getInfoInstance();

$no   = $info->getCheckNo();
$date = $info->getCheckDate();
if (empty($no) || empty($date)) {
$errorCode = 'invalid_data';
$errorMsg  = $this->_getHelper()
->__('Check No and Date are required fields');
}

if ($errorMsg) {
Mage::throwException($errorMsg);
}
return $this;
}


这里调用了 assignData($data) 这个方法, 当我们点击 ‘Continue’ 按钮进入下一步的时候, 这个 $data 变量就包含了我们文本域中的内容, 所以在 assignDData() 方法中, 我们通过 $data 变量把信息并传递给 $this->getInfoInstance(), 该方法返回的对象就是 Mage_Payment_Model_Info, 它在许多地方被使用, 因为它包含很多关于支付方式的信息

这里如果你想知道 $data 是怎么获得文本域中的信息, 你可以查阅下 importData() 方法, 或者可以从 Mage_Checkout_OnepageController 中的 savePaymentAction() 方法开始追溯

接下去就是 validate() 方法了, 顾名思义它就是用来校验文本域中的数据是否符合需求, 现在想要存储这两个文本域中的值到数据库, 我们就需要创建列(columns), 在 Magento 中支付方式被默认保存在如下两个表中:

‘sales_flat_quote_payment’ 和 ‘sales_flat_order_payment’

如果你看一下这两个表结构就会发现它们含有多个列关于信用卡信息,订单号等等, 这些都是 Magento 默认的支付方式, 现在我们在两张表同时添加2个字段 “check_no” 和 ”check_date“ , 在 mysql install 文件中写入:

<?php
$installer = $this;
$installer->startSetup();
$installer->run("

ALTER TABLE `{$installer->getTable('sales/quote_payment')}` ADD `check_no` VARCHAR( 255 ) NOT NULL ;
ALTER TABLE `{$installer->getTable('sales/quote_payment')}` ADD `check_date` VARCHAR( 255 ) NOT NULL ;

ALTER TABLE `{$installer->getTable('sales/order_payment')}` ADD `check_no` VARCHAR( 255 ) NOT NULL ;
ALTER TABLE `{$installer->getTable('sales/order_payment')}` ADD `check_date` VARCHAR( 255 ) NOT NULL ;

");
$installer->endSetup();




5.接下去我们来修改下 config.xml 文件, 在 < global> 标签里写入:

<fieldsets>
<sales_convert_quote_payment>
<check_no>
<to_order_payment>*</to_order_payment>
</check_no>
<check_data>
<to_order_payment>*</to_order_payment>
</check_data>
</sales_convert_quote_payment>
</fieldsets>


如上操作一旦完成, 这两个文本域的值就会被存储到数据库中的那两张表, 同时你也能在 Admin -> Sales -> Order 中看到

6.添加到支付详情区域

现在就剩下最后一件事了, 那就是支付详情区域, 该区域在多个地方被使用, 在订单进度区域, 订单邮件, 我的账号->我的订单, 后台订单详情页等等, 这里我也附上了截图:

为了达到该效果, 我们需要在支付 model 类文件里再添加如下变量:

protected $_infoBlockType = 'pay/info_pay';


同样的,这也声明了 block 文件路径, 把如下代码写入:

class Www_Pay_Block_Info_Pay extends Mage_Payment_Block_Info
{
protected function _prepareSpecificInformation($transport = null)
{
if (null !== $this->_paymentSpecificInformation) {
return $this->_paymentSpecificInformation;
}
$info = $this->getInfo();
$transport = new Varien_Object();
$transport = parent::_prepareSpecificInformation($transport);
$transport->addData(array(
Mage::helper('payment')->__('Check No#') => $info->getCheckNo(),
Mage::helper('payment')->__('Check Date') => $info->getCheckDate()
));
return $transport;
}
}


_prepareSpecificInformation() 方法会被 Magento 调用, 用来获取一个对象, 该对象包含我们所需要展示的信息

用来显示详细信息的默认 phtml 文件路径为: ‘app\design\frontend\base\default\template\payment\info\default.phtml’, 如果你想自定义不同的 phtml 文件, 你可以做如下操作:


protected function _construct() // 简单的说明, 并没有在当前示例中使用
{
parent::_construct();
$this->setTemplate('payment/info/purchaseorder.phtml');
}






http://www.sunzhenghua.com/magento-create-custom-payment-method
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  支付