Làm thế nào để kiểm tra hoặc định kiểu trang thành công?


114

Nếu tôi tải lại checkout/onepage/successtrang, tôi sẽ được chuyển đến giỏ hàng.

Vì vậy, khi gỡ lỗi hoặc tạo kiểu trang thành công cho đơn hàng, tôi luôn phải tạo một đơn hàng mới.

Làm thế nào tôi có thể làm điều này hiệu quả hơn?


2
Câu hỏi này tạo ra các câu trả lời khác nhau, tất cả đều đầy đủ "chiến thắng". Bất cứ ai ghé thăm ở đây nên xem qua tất cả các câu trả lời.
Chris K

Câu trả lời:


149

Bạn có thể tạm thời hack lõi trong khi bạn đang phát triển:

Trong /app/code/core/Mage/Checkout/controllers/OnepageController.phpchỉnh sửa successAction().

Nhận xét ra dòng $session->clear();. Bây giờ bạn có thể thực hiện một đơn hàng và làm mới trang bao nhiêu lần tùy thích.

Nếu bạn thậm chí không muốn đặt hàng trên mỗi trình duyệt, ví dụ như khi thực hiện kiểm tra trình duyệt chéo, bạn cũng chỉ có thể khởi tạo phiên mỗi lần.

Chọn một id đơn hàng và một id trích dẫn từ bảng sales_flat_order(các trường: entity_idquote_id). Ví dụ qua:

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

Sau đó thay đổi phần đầu của hàm như sau:

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

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

và thay thế INSERT_....bằng ID.

Bây giờ bạn luôn có thể gọi checkout/onepage/success

Trong khi bạn đang ở đó, bạn có thể muốn kiểm tra failureAction()là tốt, trong

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

Hành động sửa đổi sẽ trông như thế này

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();
    }

Bây giờ bạn luôn có thể gọi checkout/onepage/failure


Khắc phục sự cố này? Hãy đánh dấu nó là giải pháp.
Fabian Blechschmidt

3
Tôi đã thử nghiệm cả Yireo Checkout Tester của Jisse Reitsma và phương pháp này. Mặc dù mô-đun là cách dễ nhất, tôi thấy nó không tương thích 100% với chủ đề và mô-đun thanh toán của chúng tôi, dẫn đến kiểu dáng khác với trang thành công ban đầu. Mặc dù yêu cầu sửa đổi lõi, phương pháp này tuy nhiên hoạt động như một bùa mê. Lưu ý: câu trả lời thiếu tệp bạn cần chỉnh sửa, đó là /app/code/core/Mage/Checkout/controllers/OnepageContoder.php
Ottonet

Đối với những người muốn làm điều tương tự trong M2, bạn có thể nhận xét các dòng 19 đến 22 in\vendor\magento\module-checkout\Controller\Onepage\Success.php
Dynomite

24

Bạn cần sửa đổi thành côngAction () trong

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

Hành động sửa đổi sẽ như thế này

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
Nhưng sau đó $lastOrderIdkhông được xác định sẽ đưa ra thông báo và có thể dẫn đến các tác dụng phụ trong mẫu.
Alex

1
Tôi đã thành công chỉ bằng cách nhận xét $ session-> clear (); Điều duy nhất tôi mất là bất kỳ thông báo / tin nhắn nào được thêm vào như TBT / Thông báo phần thưởng / Tin nhắn được thêm thông qua người quan sát. Để lại mã trong một mô-đun ghi đè, được .gitignored nên không bao giờ được triển khai.
Barry Carlyon


4

Tôi nghĩ tốt hơn là chỉ bình luận $ session-> clear (); và thêm các sản phẩm theo cách thủ công, điều đó làm việc cho tôi nhưng nhận xét toàn bộ hành động đã cho tôi lỗi cú pháp.


4

Đối với Magento 2:

Nếu bạn muốn tạo kiểu hoặc tùy chỉnh trong trang thành công sau khi đặt hàng thành công, trang sẽ chuyển hướng đến trang giỏ hàng.

Bây giờ giải pháp là đây:

Đi để vendor/magento/module-checkout/Controller/Onepage mở Success.phptập tin.

Trong tệp này, bạn thấy Mã bên dưới

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

Chỉ cần nhận xét về mã này và vấn đề của bạn được giải quyết. Sau khi nhận xét, bạn không chuyển hướng đến trang giỏ hàng.


3

Thay vì gửi email từ bản sao cục bộ / phát triển, bạn có thể chuyển nội dung của email vào một tệp và sau đó chỉ xem cục bộ, theo ý kiến ​​của tôi sẽ thực sự tiện dụng. Đây là cách có thể đạt được. Đầu tiên tất cả các email được gửi từ

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

Tìm nó, và thêm các dòng sau.

    $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());

Sau này, sau khi bạn tạo bất kỳ thứ tự nào, một email.html sẽ được tạo trong thư mục gốc của tài liệu Magento và bạn có thể mở nó trong trình duyệt để xem đầu ra.

Tiếp theo, để gửi / gửi lại bất kỳ email đặt hàng nào, bạn chỉ cần đăng nhập vào quản trị viên và với mỗi đơn hàng có nút Gửi Email sẽ kích hoạt tập lệnh này và bạn có thể thấy mẫu mới được thay đổi được viết trong cùng một tệp. Tôi nghĩ rằng đây là một trong những cách tốt nhất để xem đơn hàng hoặc bất kỳ email nào khác.

Xin lưu ý để loại bỏ mã được thêm vào khi bạn hoàn thành.


1

Bạn phải cập nhật mã:

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

Cập nhật chức năng:

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();
}

Chỉ cần bình luận:

//$session->clear();

1

Magento 2

Như một ghi chú trả lời khác, bạn có thể nhận xét chuyển hướng trong Magento\Checkout\Controller\Onepage\Success::executevà buộc trang thành công thanh toán tải. Nhưng khi chặn, Magento\Checkout\Block\Onepage\Successtải sẽ không có dữ liệu đơn hàng vì Magento\Checkout\Model\Session::getLastRealOrdersẽ không trả lại đơn hàng. Một tùy chọn tốt hơn sẽ là một bộ chặn sau trên phương thức thực thi của lớp điều khiển, nơi bạn có thể đặt giá trị cho lastRealOrderIdtrong phiên thanh toán.

Cách tiếp cận này cũng cung cấp một cơ hội để gửi checkout_onepage_controller_success_actionsự kiện với đơn đặt hàng mong muốn của bạn. Sự kiện này sẽ kích hoạt người quan sát Magento\GoogleAdwords\Observer\SetConversionValueObserverMagento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObservervới dữ liệu thử nghiệm của bạn.

Dưới đây là một mô-đun khá cơ bản tạo ra bộ chặn được mô tả ở trên và cho phép đặt thứ tự bằng cách nối thêm một ordertham số truy vấn với id gia tăng mong muốn vào url của trang thành công. Hiện tại nó sẽ không hoạt động theo con đường thành công nhiều lần. Nó có thể được tải xuống trên github: https://github.com/pmclain/magento2-successtest

ứng dụng / mã / 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>

ứng dụng / mã / Pmclain / SuccessTest / Plugin / Thành công.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 Dưới đây thêm các tùy chọn bảng quản trị để bật / tắt bộ chặn.

<?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>

ứng dụng / mã / 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>

ứng dụng / mã / 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>

ứng dụng / mã / Pmclain / SuccessTest / resgistration.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
  \Magento\Framework\Component\ComponentRegistrar::MODULE,
  'Pmclain_SuccessTest',
  __DIR__
);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.