Якщо я перезавантажую 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 (); і додавати продукти вручну, які працювали на мене, але, коментуючи всю дію, привели до помилок синтаксису.
Для 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());
Після цього після створення будь-якого замовлення буде створено email.html у корені документа Magento, і ви можете відкрити його в браузері, щоб побачити вихід.
Далі, для надсилання / повторного надсилання будь-яких електронних листів із замовленням ви можете просто увійти в систему адміністратора, і для кожного замовлення є кнопка "Надіслати електронну пошту", яка запустить цей сценарій, і ви зможете побачити нещодавно змінений шаблон, написаний у тому самому файлі. Я думаю, що це один з найкращих способів перегляду порядку чи будь-яких інших електронних листів.
Будь ласка, зверніть увагу, щоб видалити доданий код, коли ви закінчите.
Ви повинні оновити код:
/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
app / code / Pmclain / SuccessTest / тощо / 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 / Плагін / 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 / тощо / 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 / тощо / 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 / тощо / 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 / code / Pmclain / SuccessTest / resgistration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Pmclain_SuccessTest',
__DIR__
);