यदि मैं 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
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');
}
बस इस कोड पर टिप्पणी करें और आपकी समस्या हल हो गई है। इस टिप्पणी के बाद आप कार्ट पेज पर रीडायरेक्ट नहीं करते हैं।
मुझे लगता है कि $ सत्र पर टिप्पणी करना बेहतर है-> स्पष्ट (); और उत्पादों को मैन्युअल रूप से जोड़ें, जो मेरे लिए काम करते हैं लेकिन पूरी कार्रवाई की टिप्पणी करने से मुझे सिंटैक्स त्रुटियां हुईं।
स्थानीय / विकास प्रति से ईमेल भेजने के बजाय आप ईमेल की सामग्री को एक फ़ाइल में डंप कर सकते हैं और फिर बस स्थानीय रूप से देख सकते हैं, जो मेरी राय में वास्तव में आसान होगा। यहां बताया गया है कि किस तरह से दर्द को कम किया जा सकता है। सबसे पहले सभी ईमेल से भेजे जाते हैं
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());
इसके बाद जब आप कोई आदेश बनाते हैं तो एक ईमेल। Html को मैगेंटो दस्तावेज़ रूट में बनाया जाएगा और आप उस ब्राउज़र को आउटपुट देखने के लिए खोल सकते हैं।
अगला, किसी भी ऑर्डर ईमेल को भेजने / फिर से भेजने के लिए आप बस व्यवस्थापक में लॉग इन कर सकते हैं और प्रत्येक आदेश के लिए Send Email बटन है जो इस स्क्रिप्ट को ट्रिगर करेगा और आप उसी फ़ाइल में लिखे गए नए परिवर्तित टेम्पलेट को देख सकते हैं। मुझे लगता है कि यह आदेश या किसी अन्य ईमेल को देखने का सबसे अच्छा तरीका है।
जब आप पूरा कर लें तो जोड़ा गया कोड निकालने के लिए कृपया ध्यान दें।
आपको कोड अपडेट करना होगा:
/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
आपके परीक्षण डेटा के साथ।
निम्नलिखित ऊपर वर्णित इंटरसेप्टर बनाने वाला एक काफी बुनियादी मॉड्यूल है और order
सफलता पृष्ठ url के लिए वांछित वेतन वृद्धि आईडी के साथ एक क्वेरी पैरामीटर जोड़कर आदेश सेट करने की अनुमति देता है । यह वर्तमान में मल्टीशिपिंग सक्सेस रूट पर काम नहीं करेगा। इसे github: https://github.com/pmclain/magento2-successtest पर डाउनलोड किया जा सकता है
एप्लिकेशन / कोड / 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>
एप्लिकेशन / कोड / 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;
}
}
एप्लिकेशन / कोड / 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>
एप्लिकेशन / कोड / 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>
एप्लिकेशन / कोड / 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__
);