หากฉันโหลดcheckout/onepage/success
หน้าซ้ำฉันจะถูกนำไปที่รถเข็น
ดังนั้นเมื่อทำการดีบั๊กหรือใส่สไตล์หน้าคำสั่งซื้อฉันจะต้องทำคำสั่งซื้อใหม่เสมอ
ฉันจะทำสิ่งนี้ได้อย่างมีประสิทธิภาพมากขึ้นได้อย่างไร
หากฉันโหลดcheckout/onepage/success
หน้าซ้ำฉันจะถูกนำไปที่รถเข็น
ดังนั้นเมื่อทำการดีบั๊กหรือใส่สไตล์หน้าคำสั่งซื้อฉันจะต้องทำคำสั่งซื้อใหม่เสมอ
ฉันจะทำสิ่งนี้ได้อย่างมีประสิทธิภาพมากขึ้นได้อย่างไร
คำตอบ:
คุณสามารถแฮ็คแกนชั่วคราวในขณะที่คุณกำลังพัฒนา:
ในการแก้ไข/app/code/core/Mage/Checkout/controllers/OnepageController.php
successAction()
$session->clear();
แสดงความคิดเห็นออกบรรทัด ตอนนี้คุณสามารถสั่งซื้อและรีเฟรชหน้าเว็บได้บ่อยเท่าที่คุณต้องการ
หากคุณไม่ต้องการสั่งซื้อในแต่ละเบราว์เซอร์เช่นเมื่อทำการทดสอบข้ามเบราว์เซอร์คุณก็สามารถเริ่มต้นเซสชันได้ทุกครั้ง
เลือกรหัสคำสั่งซื้อและรหัสคำพูดจากตารางsales_flat_order
(ฟิลด์: entity_id
และquote_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_....
ด้วยรหัส
ตอนนี้คุณสามารถโทรหา 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
\vendor\magento\module-checkout\Controller\Onepage\Success.php
คุณต้องแก้ไข 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();
}
$lastOrderId
ไม่ได้กำหนดไว้ซึ่งจะเป็นการแจ้งให้ทราบล่วงหน้าและอาจนำไปสู่ผลข้างเคียงในเทมเพลต
หวังว่าฉันจะไม่ส่งเสริมตัวเองมากเกินไป แต่ฉันสร้างส่วนขยายฟรีที่สามารถติดตั้งได้อย่างรวดเร็วใน Magento และช่วยให้คุณสามารถดูตัวอย่างหน้าสั่งซื้อที่ประสบความสำเร็จสำหรับการสั่งซื้อใด ๆ - เพียงแค่เข้าไปที่ URL: http: // www yireo.com/software/magento-extensions/checkout-tester
ฉันคิดว่ามันจะดีกว่าที่จะแสดงความคิดเห็น $ session-> clear (); และเพิ่มผลิตภัณฑ์ด้วยตนเองที่ใช้งานได้สำหรับฉัน แต่การแสดงความคิดเห็นการกระทำทั้งหมดทำให้ฉันมีข้อผิดพลาดทางไวยากรณ์
สำหรับวีโอไอพี 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');
}
เพียงแสดงความคิดเห็นในรหัสนี้และปัญหาของคุณจะได้รับการแก้ไข หลังจากแสดงความคิดเห็นคุณจะไม่เปลี่ยนเส้นทางไปยังหน้ารถเข็น
แทนที่จะส่งอีเมลจากสำเนาโลคัล / การพัฒนาคุณสามารถดัมพ์เนื้อหาของอีเมลไปยังไฟล์จากนั้นดูเฉพาะที่ซึ่งในความเห็นของฉันจะมีประโยชน์จริงๆ นี่คือวิธีการที่สามารถประสบความสำเร็จได้ ก่อนอื่นอีเมลทั้งหมดจะถูกส่งจาก
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());
หลังจากนี้หลังจากที่คุณสร้างคำสั่งซื้อใด ๆ email.html จะถูกสร้างขึ้นในรากของเอกสารวีโอไอพีและคุณสามารถเปิดในเบราว์เซอร์เพื่อดูผลลัพธ์
ถัดไปเพื่อส่ง / ส่งอีเมลคำสั่งซื้อใด ๆ คุณเพียงแค่เข้าสู่ระบบผู้ดูแลระบบและสำหรับการสั่งซื้อแต่ละครั้งมีปุ่มส่งอีเมลซึ่งจะเรียกสคริปต์นี้และคุณสามารถเห็นแม่แบบการเปลี่ยนแปลงใหม่ที่เขียนในไฟล์เดียวกัน ฉันคิดว่านี่เป็นวิธีที่ดีที่สุดในการดูคำสั่งซื้อหรืออีเมลอื่น ๆ
โปรดทราบว่าจะลบรหัสเพิ่มเมื่อคุณทำเสร็จแล้ว
คุณต้องอัปเดตรหัส:
/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();
ในฐานะที่เป็นคำตอบอื่น ๆ คุณสามารถแสดงความคิดเห็นการเปลี่ยนเส้นทางMagento\Checkout\Controller\Onepage\Success::execute
และบังคับให้หน้าเช็คเอาต์สำเร็จในการโหลด แต่เมื่อบล็อกจะMagento\Checkout\Block\Onepage\Success
ไม่มีการโหลดข้อมูลการสั่งซื้อเพราะMagento\Checkout\Model\Session::getLastRealOrder
จะไม่ส่งคืนคำสั่งซื้อ ตัวเลือกที่ดีกว่าจะเป็นตัวดักหลังจากบนวิธีการดำเนินการของคลาสคอนโทรลเลอร์ซึ่งคุณสามารถตั้งค่าสำหรับlastRealOrderId
ในช่วงเช็คเอาต์
วิธีการนี้ยังให้โอกาสในการจัดส่งcheckout_onepage_controller_success_action
กิจกรรมด้วยคำสั่งซื้อที่คุณต้องการ เหตุการณ์จะทำให้ผู้สังเกตการณ์Magento\GoogleAdwords\Observer\SetConversionValueObserver
และMagento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObserver
ข้อมูลการทดสอบของคุณ
ต่อไปนี้เป็นโมดูลพื้นฐานที่ค่อนข้างสร้าง interceptor ที่อธิบายไว้ข้างต้นและอนุญาตให้ตั้งค่าคำสั่งโดยผนวกorder
พารามิเตอร์การสืบค้นที่มีรหัสการเพิ่มที่ต้องการไปยัง URL หน้าความสำเร็จ ขณะนี้ยังไม่สามารถใช้เส้นทางความสำเร็จหลายขั้นตอนได้ สามารถดาวน์โหลดได้ที่ github: https://github.com/pmclain/magento2-successtest
app / รหัส / Pmclain / SuccessTest / etc / ส่วนหน้า / 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>
app / รหัส / Pmclain / SuccessTest / ปลั๊กอิน / 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 ด้านล่างเพิ่มตัวเลือกแผงควบคุมสำหรับผู้ดูแลระบบเพื่อเปิด / ปิดการใช้งาน interceptor
<?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 / รหัส / 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 / รหัส / 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>
app / รหัส / Pmclain / SuccessTest / resgistration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Pmclain_SuccessTest',
__DIR__
);