Nếu tôi tải lại checkout/onepage/success
trang, 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?
Nếu tôi tải lại checkout/onepage/success
trang, 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?
Câu trả lời:
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.php
chỉ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_id
và quote_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
\vendor\magento\module-checkout\Controller\Onepage\Success.php
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();
}
$lastOrderId
khô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.
Hy vọng tôi không quá tự quảng cáo, nhưng tôi đã tạo một tiện ích mở rộng miễn phí có thể được cài đặt nhanh chóng trong Magento và cho phép bạn xem trước trang thành công của đơn hàng cho bất kỳ đơn hàng nào - chỉ cần truy cập URL: http: // www. yireo.com/software/magento-extensions/checkout-tester
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.
Đố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.php
tậ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.
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.
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();
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::execute
và buộc trang thành công thanh toán tải. Nhưng khi chặn, Magento\Checkout\Block\Onepage\Success
tải sẽ không có dữ liệu đơn hàng vì Magento\Checkout\Model\Session::getLastRealOrder
sẽ 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 lastRealOrderId
trong 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_action
sự 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\SetConversionValueObserver
và Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObserver
vớ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 order
tham 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__
);