Magento - 步骤结帐和附加模块
Magento - steps checkout and additional module
感谢这个论坛。我经常阅读它,这是我的第一个问题。
问题涉及 Magento (1.9.1.0)。我想添加一个额外的模块,允许客户对订单发表评论。我已经能够在网上找到适合我需要的模块。它工作得很好,但有一个大问题:它加入结帐的最后一步(特别是在付款阶段之后)。因此,如果客户通过银行转账、标记或类似付款方式付款,则问题不会出现:Magento 会转到下一步(订单评论),然后完成订单。
问题出现在 Paypal 付款的情况下,因为 Magento 将客户重定向到 Paypal.com,并且在付款后,在订单结束时 returns 到商店(没有进入评论的下一步).评论表单由 19 个文件组成,一旦安装在 Magento 中,就不会修改任何现有文件。
我想在 shipping_method 步骤之后(而不是在付款步骤之后)包含此表格,因此,我认为我必须修改名为 Abstract.php (app/code/community/Brainvire/Ordercomment/Controller/Onepage/Abstract.php).
如果你能帮我编辑那个文件,我将不胜感激。
<?php
require_once 'Mage/Checkout/controllers/OnepageController.php';
class Brainvire_Ordercomment_Controller_Onepage_Abstract extends
Mage_Checkout_OnepageController {
/*
* Saving the Payment at Checkout
*/
public function savePaymentAction()
{
$this->_expireAjax();
if ($this->getRequest()->isPost()) {
$data = $this->getRequest()->getPost('payment', array());
try {
$result = $this->getOnepage()->savePayment($data);
}
catch (Mage_Payment_Exception $e) {
if ($e->getFields()) {
$result['fields'] = $e->getFields();
}
$result['error'] = $e->getMessage();
}
catch (Exception $e) {
$result['error'] = $e->getMessage();
}
$redirectUrl = $this->getOnePage()->getQuote()->getPayment()->getCheckoutRedirectUrl();
if (empty($result['error']) && !$redirectUrl) {
$this->loadLayout('checkout_onepage_ordercomment');
$result['goto_section'] = 'ordercomment';
}
if ($redirectUrl) {
$result['redirect'] = $redirectUrl;
}
$this->getResponse()->setBody(Zend_Json::encode($result));
}
}
/*
* Saving the order comment
*/
public function saveOrdercommentAction()
{
$this->_expireAjax();
if ($this->getRequest()->isPost()) {
$_brainvire_Ordercomment = $this->getRequest()->getPost('ordercomment');
Mage::getSingleton('core/session')->setBrainvireOrdercomment($_brainvire_Ordercomment);
$result = array();
$redirectUrl = $this->getOnePage()->getQuote()->getPayment()->getCheckoutRedirectUrl();
if (!$redirectUrl) {
$this->loadLayout('checkout_onepage_review');
$result['goto_section'] = 'review';
$result['update_section'] = array(
'name' => 'review',
'html' => $this->_getReviewHtml()
);
}
if ($redirectUrl) {
$result['redirect'] = $redirectUrl;
}
$this->getResponse()->setBody(Zend_Json::encode($result));
}
}
}
如何编辑此 php 代码以在 shipping_method 步骤之后和付款步骤之前插入 Ordercomment?
谢谢
GS
我能够通过编辑两个文件来移动订单评论部分:
第一个:Brainvire\Ordercomment\Block\Onepage.php
class Brainvire_Ordercomment_Block_Onepage extends Mage_Checkout_Block_Onepage
{
/**
* getting the steps of Checkout page
*/
public function getSteps()
{
...
$stepCodes = array('billing', 'shipping', 'shipping_method', 'ordercomment', 'payment', 'review'); // moved 'ordercomment' before 'payment'
...
}
}
然后是您提到的文件:Brainvire\Ordercomment\Controller\Onepage\Abstract.php
删除 savePaymentAction()
方法并替换为:
class Brainvire_Ordercomment_Controller_Onepage_Abstract extends Mage_Checkout_OnepageController {
/**
* Shipping method save action
*/
public function saveShippingMethodAction()
{
if ($this->_expireAjax()) {
return;
}
if ($this->getRequest()->isPost()) {
$data = $this->getRequest()->getPost('shipping_method', '');
$result = $this->getOnepage()->saveShippingMethod($data);
/*
$result will have erro data if shipping method is empty
*/
if(!$result) {
Mage::dispatchEvent('checkout_controller_onepage_save_shipping_method',
array('request'=>$this->getRequest(),
'quote'=>$this->getOnepage()->getQuote()));
$this->getOnepage()->getQuote()->collectTotals();
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
if (empty($result['error']) && !$redirectUrl) {
$this->loadLayout('checkout_onepage_ordercomment');
$result['goto_section'] = 'ordercomment';
}
}
$this->getOnepage()->getQuote()->collectTotals()->save();
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
}
}
/*
* Saving the order comment
*/
public function saveOrdercommentAction()
{
$this->_expireAjax();
if ($this->getRequest()->isPost()) {
$_brainvire_Ordercomment = $this->getRequest()->getPost('ordercomment');
Mage::getSingleton('core/session')->setBrainvireOrdercomment($_brainvire_Ordercomment);
$result = array();
$result['goto_section'] = 'payment';
$result['update_section'] = array(
'name' => 'payment-method',
'html' => $this->_getPaymentMethodsHtml()
);
$this->getResponse()->setBody(Zend_Json::encode($result));
}
}
}
一旦你开始工作,你应该将这些自定义移动到覆盖模块中,或者至少将修改后的文件复制到 app/code/local,这样原始代码就保持不变。
感谢这个论坛。我经常阅读它,这是我的第一个问题。 问题涉及 Magento (1.9.1.0)。我想添加一个额外的模块,允许客户对订单发表评论。我已经能够在网上找到适合我需要的模块。它工作得很好,但有一个大问题:它加入结帐的最后一步(特别是在付款阶段之后)。因此,如果客户通过银行转账、标记或类似付款方式付款,则问题不会出现:Magento 会转到下一步(订单评论),然后完成订单。 问题出现在 Paypal 付款的情况下,因为 Magento 将客户重定向到 Paypal.com,并且在付款后,在订单结束时 returns 到商店(没有进入评论的下一步).评论表单由 19 个文件组成,一旦安装在 Magento 中,就不会修改任何现有文件。 我想在 shipping_method 步骤之后(而不是在付款步骤之后)包含此表格,因此,我认为我必须修改名为 Abstract.php (app/code/community/Brainvire/Ordercomment/Controller/Onepage/Abstract.php). 如果你能帮我编辑那个文件,我将不胜感激。
<?php
require_once 'Mage/Checkout/controllers/OnepageController.php';
class Brainvire_Ordercomment_Controller_Onepage_Abstract extends
Mage_Checkout_OnepageController {
/*
* Saving the Payment at Checkout
*/
public function savePaymentAction()
{
$this->_expireAjax();
if ($this->getRequest()->isPost()) {
$data = $this->getRequest()->getPost('payment', array());
try {
$result = $this->getOnepage()->savePayment($data);
}
catch (Mage_Payment_Exception $e) {
if ($e->getFields()) {
$result['fields'] = $e->getFields();
}
$result['error'] = $e->getMessage();
}
catch (Exception $e) {
$result['error'] = $e->getMessage();
}
$redirectUrl = $this->getOnePage()->getQuote()->getPayment()->getCheckoutRedirectUrl();
if (empty($result['error']) && !$redirectUrl) {
$this->loadLayout('checkout_onepage_ordercomment');
$result['goto_section'] = 'ordercomment';
}
if ($redirectUrl) {
$result['redirect'] = $redirectUrl;
}
$this->getResponse()->setBody(Zend_Json::encode($result));
}
}
/*
* Saving the order comment
*/
public function saveOrdercommentAction()
{
$this->_expireAjax();
if ($this->getRequest()->isPost()) {
$_brainvire_Ordercomment = $this->getRequest()->getPost('ordercomment');
Mage::getSingleton('core/session')->setBrainvireOrdercomment($_brainvire_Ordercomment);
$result = array();
$redirectUrl = $this->getOnePage()->getQuote()->getPayment()->getCheckoutRedirectUrl();
if (!$redirectUrl) {
$this->loadLayout('checkout_onepage_review');
$result['goto_section'] = 'review';
$result['update_section'] = array(
'name' => 'review',
'html' => $this->_getReviewHtml()
);
}
if ($redirectUrl) {
$result['redirect'] = $redirectUrl;
}
$this->getResponse()->setBody(Zend_Json::encode($result));
}
}
}
如何编辑此 php 代码以在 shipping_method 步骤之后和付款步骤之前插入 Ordercomment? 谢谢 GS
我能够通过编辑两个文件来移动订单评论部分:
第一个:Brainvire\Ordercomment\Block\Onepage.php
class Brainvire_Ordercomment_Block_Onepage extends Mage_Checkout_Block_Onepage
{
/**
* getting the steps of Checkout page
*/
public function getSteps()
{
...
$stepCodes = array('billing', 'shipping', 'shipping_method', 'ordercomment', 'payment', 'review'); // moved 'ordercomment' before 'payment'
...
}
}
然后是您提到的文件:Brainvire\Ordercomment\Controller\Onepage\Abstract.php
删除 savePaymentAction()
方法并替换为:
class Brainvire_Ordercomment_Controller_Onepage_Abstract extends Mage_Checkout_OnepageController {
/**
* Shipping method save action
*/
public function saveShippingMethodAction()
{
if ($this->_expireAjax()) {
return;
}
if ($this->getRequest()->isPost()) {
$data = $this->getRequest()->getPost('shipping_method', '');
$result = $this->getOnepage()->saveShippingMethod($data);
/*
$result will have erro data if shipping method is empty
*/
if(!$result) {
Mage::dispatchEvent('checkout_controller_onepage_save_shipping_method',
array('request'=>$this->getRequest(),
'quote'=>$this->getOnepage()->getQuote()));
$this->getOnepage()->getQuote()->collectTotals();
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
if (empty($result['error']) && !$redirectUrl) {
$this->loadLayout('checkout_onepage_ordercomment');
$result['goto_section'] = 'ordercomment';
}
}
$this->getOnepage()->getQuote()->collectTotals()->save();
$this->getResponse()->setBody(Mage::helper('core')->jsonEncode($result));
}
}
/*
* Saving the order comment
*/
public function saveOrdercommentAction()
{
$this->_expireAjax();
if ($this->getRequest()->isPost()) {
$_brainvire_Ordercomment = $this->getRequest()->getPost('ordercomment');
Mage::getSingleton('core/session')->setBrainvireOrdercomment($_brainvire_Ordercomment);
$result = array();
$result['goto_section'] = 'payment';
$result['update_section'] = array(
'name' => 'payment-method',
'html' => $this->_getPaymentMethodsHtml()
);
$this->getResponse()->setBody(Zend_Json::encode($result));
}
}
}
一旦你开始工作,你应该将这些自定义移动到覆盖模块中,或者至少将修改后的文件复制到 app/code/local,这样原始代码就保持不变。