如何测试或设置订单成功页面的样式?


114

如果我重新加载checkout/onepage/success页面,则将我定向到购物车。

因此,在调试或设置订单成功页面的样式时,我总是必须创建一个新订单。

我怎样才能更有效地做到这一点?


2
这个问题创造了各种各样的答案,这些答案都充满了“胜利”。任何来这里的人都应该仔细阅读所有答案。
克里斯K

Answers:


149

在开发过程中,您可以临时破解内核:

/app/code/core/Mage/Checkout/controllers/OnepageController.php编辑中successAction()

注释掉行$session->clear();。现在,您可以下订单并随时刷新页面。

如果您甚至不想在每个浏览器上下订单,例如在进行跨浏览器测试时,您也可以每次都初始化会话。

从表格中选择一个订单ID和一个报价ID sales_flat_order(字段:entity_idquote_id)。例如通过:

SELECT entity_id as order_id, quote_id 
  FROM sales_flat_order ORDER BY entity_id DESC LIMIT 1;

然后按如下所示更改函数的开头:

$session = $this->getOnepage()->getCheckout();

$session->setLastSuccessQuoteId(INSERT_QUOTE_ID);
$session->setLastQuoteId(INSERT_QUOTE_ID);
$session->setLastOrderId(INSERT_ORDER_ID);

并替换INSERT_....为ID。

现在您可以随时致电 checkout/onepage/success

当你在这,你可能要测试的failureAction()为好,

/app/code/core/Mage/Checkout/controllers/OnepageController.php

修改后的动作如下所示

public function failureAction()
    {
        $session = $this->getOnepage()->getCheckout();

        $session->setLastSuccessQuoteId(INSERT_QUOTE_ID);
        $session->setLastQuoteId(INSERT_QUOTE_ID);
        $session->setLastOrderId(INSERT_ORDER_ID);

        $lastQuoteId = $this->getOnepage()->getCheckout()->getLastQuoteId();
        $lastOrderId = $this->getOnepage()->getCheckout()->getLastOrderId();

        if (!$lastQuoteId || !$lastOrderId) {
            $this->_redirect('checkout/cart');
            return;
        }

        $this->loadLayout();
        $this->renderLayout();
    }

现在您可以随时致电 checkout/onepage/failure


解决这个问题?请标记为解决方案。
Fabian Blechschmidt

3
我已经测试了Jisse Reitsma的Yireo Checkout Tester和这种方法。虽然该模块是最简单的方法,但我发现它与我们的主题和付款模块不是100%兼容,因此样式与原始成功页面不同。虽然需要修改内核,但是此方法却很吸引人。注意:答案缺少您需要编辑的文件,该文件是/app/code/core/Mage/Checkout/controllers/OnepageController.php
Ottonet

对于想在M2中进行相同操作的人,您可以在\vendor\magento\module-checkout\Controller\Onepage\Success.php
Dynomite

24

您需要在中修改successAction()

/app/code/core/Mage/Checkout/controllers/OnepageController.php

修改后的动作会这样

public function successAction()
    {
        /*
        $session = $this->getOnepage()->getCheckout();
        if (!$session->getLastSuccessQuoteId()) {
            $this->_redirect('checkout/cart');
            return;
        }

        $lastQuoteId = $session->getLastQuoteId();
        $lastOrderId = $session->getLastOrderId();
        $lastRecurringProfiles = $session->getLastRecurringProfileIds();
        if (!$lastQuoteId || (!$lastOrderId && empty($lastRecurringProfiles))) {
            $this->_redirect('checkout/cart');
            return;
        }

        $session->clear();
        */
        $this->loadLayout();
        $this->_initLayoutMessages('checkout/session');
        Mage::dispatchEvent('checkout_onepage_controller_success_action', array('order_ids' => array($lastOrderId)));
        $this->renderLayout();
    }

3
但是$lastOrderId没有定义,这会引起注意,并可能导致模板中的副作用。
亚历克斯

1
仅通过注释$ session-> clear()即可获得成功。我唯一丢失的是添加的任何通知/消息,例如通过观察者添加的TBT /奖励通知/消息。将代码留在覆盖模块中,该模块被.gitignored覆盖,因此从不部署。
巴里·卡里昂


5

对于Magento 2:

如果要在定单后在成功页面中设置样式或自定义,则成功页面将重定向到购物车页面。

现在解决方案在这里:

转到vendor/magento/module-checkout/Controller/Onepage 打开Success.php文件。

在此文件中,您将看到以下代码

 if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) {
     return $this->resultRedirectFactory->create()->setPath('checkout/cart');
 }

只需对此代码发表评论,即可解决您的问题。评论后,您不会重定向到购物车页面。



3

您可以将电子邮件的内容转储到文件中,然后仅在本地查看,而不是从本地/开发副本发送电子邮件,在我看来这将非常方便。这是可以实现的方式。首先,所有电子邮件都是从

Mage_Core_Model_Email_Template::send($email, $name = null, array $variables = array())

找到那个,然后添加以下几行。

    $this->setUseAbsoluteLinks(true);
    $text = $this->getProcessedTemplate($variables, true);

    if($this->isPlain()) {
        $mail->setBodyText($text);
    } else {
        $mail->setBodyHTML($text);
    }
    // Added Code //
    $filePath = Mage::getBaseDir() .  DS . 'email.html';
    Mage::log($filePath);
    file_put_contents($filePath, $text);
    // Added Code Ends //

    $mail->setSubject('=?utf-8?B?' . base64_encode($this->getProcessedTemplateSubject($variables)) . '?=');
    $mail->setFrom($this->getSenderEmail(), $this->getSenderName());

创建完任何订单后,将在Magento文档根目录中创建一个email.html,您可以在浏览器中打开它以查看输出。

接下来,要发送/重新发送任何订单电子邮件,您只需登录admin,对于每个订单,都有“发送电子邮件”按钮,它将触发此脚本,您可以看到新更改的模板写在同一文件中。我认为这是查看订单或任何其他电子邮件的最佳方式之一。

完成后,请注意删除添加的代码。


1

您必须更新代码:

/app/code/core/Mage/Checkout/controllers/OnepageController.php

更新功能:

public function successAction()
{
    $session = $this->getOnepage()->getCheckout();
    if (!$session->getLastSuccessQuoteId()) {
        $this->_redirect('checkout/cart');
        return;
    }

    $lastQuoteId = $session->getLastQuoteId();
    $lastOrderId = $session->getLastOrderId();
    $lastRecurringProfiles = $session->getLastRecurringProfileIds();
    if (!$lastQuoteId || (!$lastOrderId && empty($lastRecurringProfiles))) {
        $this->_redirect('checkout/cart');
        return;
    }

    //$session->clear();

    $this->loadLayout();
    $this->_initLayoutMessages('checkout/session');
    Mage::dispatchEvent('checkout_onepage_controller_success_action', array('order_ids' => array($lastOrderId)));
    $this->renderLayout();
}

只需评论:

//$session->clear();

1

Magento 2

作为另一个答案,您可以注释掉重定向Magento\Checkout\Controller\Onepage\Success::execute并强制加载“结帐成功”页面。但是,当块Magento\Checkout\Block\Onepage\Success加载时,将不会出现订单数据,因为Magento\Checkout\Model\Session::getLastRealOrder不会返回订单。更好的选择是在控制器类的execute方法上使用after拦截器,您可以lastRealOrderId在其中为checkout会话设置一个值。

这种方法还提供了以checkout_onepage_controller_success_action所需顺序调度事件的机会。该事件将触发观察者Magento\GoogleAdwords\Observer\SetConversionValueObserver以及Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObserver您的测试数据。

以下是一个相当基本的模块,用于创建上述拦截器,并允许通过将具有order所需增量id 的查询参数附加到成功页面url来设置顺序。目前,它无法使用多船运输成功路线。可以在github上下载它:https : //github.com/pmclain/magento2-successtest

应用程序/代码/Pmclain/SuccessTest/etc/frontend/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
  <type name="Magento\Checkout\Controller\Onepage\Success">
    <plugin name="pmclain_successtest_checkout_controller_onepage_success"
            type="Pmclain\SuccessTest\Plugin\Success"
            sortOrder="10" />
  </type>
</config>

应用程序/代码/Pmclain/SuccessTest/Plugin/Success.php

<?php
namespace Pmclain\SuccessTest\Plugin;

use Magento\Framework\Event\ManagerInterface;
use Magento\Framework\View\Result\PageFactory;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Store\Model\ScopeInterface;
use Magento\Checkout\Model\Session;
use Magento\Sales\Model\OrderFactory;
use Magento\Sales\Model\Order;

class Success
{
  /** @var ManagerInterface */
  protected $_eventManager;

  /** @var PageFactory */
  protected $_resultPageFactory;

  /** @var ScopeConfigInterface */
  protected $_scopeConfig;

  /** @var OrderFactory */
  protected $_orderFactory;

  /** @var Order */
  protected $_order;

  /** @var Session */
  protected $_checkoutSession;

  /**
   * Success constructor.
   * @param ManagerInterface $eventManager
   * @param PageFactory $resultPageFactory
   * @param ScopeConfigInterface $scopeConfig
   * @param OrderFactory $orderFactory
   * @param Session $session
   */
  public function __construct(
    ManagerInterface $eventManager,
    PageFactory $resultPageFactory,
    ScopeConfigInterface $scopeConfig,
    OrderFactory $orderFactory,
    Session $session
  ) {
    $this->_eventManager = $eventManager;
    $this->_resultPageFactory = $resultPageFactory;
    $this->_scopeConfig = $scopeConfig;
    $this->_orderFactory = $orderFactory;
    $this->_checkoutSession = $session;
  }

  /**
   * @param \Magento\Checkout\Controller\Onepage\Success $subject
   * @param $result
   * @return \Magento\Framework\View\Result\Page
   */
  public function afterExecute(\Magento\Checkout\Controller\Onepage\Success $subject, $result)
  {
    if (!$this->_isEnabled()) {
      return $result;
    }

    $order = $this->_getTestOrder($subject->getRequest()->getParam('order'));

    if (!$order->getId()) {
      return $result;
    }

    $this->_checkoutSession->setLastRealOrderId($order->getIncrementId());

    $resultPage = $this->_resultPageFactory->create();

    $this->_eventManager->dispatch(
      'checkout_onepage_controller_success_action',
      ['order_ids' => [$order->getId()]]
    );

    return $resultPage;
  }

  /**
   * @return bool
   */
  protected function _isEnabled()
  {
    if ($this->_scopeConfig->getValue('dev/debug/success_test', ScopeInterface::SCOPE_STORE)) {
      return true;
    }

    return false;
  }

  /**
   * @param $incrementId string|bool
   * @return Order
   */
  protected function _getTestOrder($incrementId)
  {
    /** @var Order $order */
    $order = $this->_orderFactory->create();

    $order->loadByIncrementId($incrementId);

    return $order;
  }
}

app / code / Pmclain / SuccessTest / etc / adminhtml / system.xml下面添加了管理面板选项以启用/禁用拦截器。

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Config:etc/system_file.xsd">
  <system>
    <section id="dev">
      <group id="debug">
        <field id="success_test" translate="label" type="select" sortOrder="30" showInDefault="1" showInWebsite="1" showInStore="0">
          <label>Enable Checkout Success Page Testing</label>
          <source_model>Magento\Config\Model\Config\Source\Yesno</source_model>
        </field>
      </group>
    </section>
  </system>
</config>

app / code / Pmclain / SuccessTest / etc / config.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Store:etc/config.xsd">
  <default>
    <dev>
      <debug>
        <success_test>0</success_test>
      </debug>
    </dev>
  </default>
</config>

app / code / Pmclain / SuccessTest / etc / module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
  <module name="Pmclain_SuccessTest" setup_version="0.0.1">
    <sequence>
      <module name="Magento_Backend" />
      <module name="Magento_Checkout" />
    </sequence>
  </module>
</config>

应用程序/代码/Pmclain/SuccessTest/resgistration.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
  \Magento\Framework\Component\ComponentRegistrar::MODULE,
  'Pmclain_SuccessTest',
  __DIR__
);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.