Jika saya memuat ulang checkout/onepage/success
halaman, saya diarahkan ke troli.
Jadi, ketika debugging atau menata halaman keberhasilan pesanan, saya selalu harus membuat pesanan baru.
Bagaimana saya bisa melakukan ini dengan lebih efisien?
Jika saya memuat ulang checkout/onepage/success
halaman, saya diarahkan ke troli.
Jadi, ketika debugging atau menata halaman keberhasilan pesanan, saya selalu harus membuat pesanan baru.
Bagaimana saya bisa melakukan ini dengan lebih efisien?
Jawaban:
Anda dapat sementara hack inti saat Anda sedang mengembangkan:
Di /app/code/core/Mage/Checkout/controllers/OnepageController.php
edit successAction()
.
Berikan komentar $session->clear();
. Sekarang Anda dapat membuat satu pesanan dan menyegarkan halaman sesering yang Anda suka.
Jika Anda bahkan tidak ingin melakukan pemesanan di setiap browser, misalnya saat melakukan pengujian lintas-browser, Anda juga dapat langsung menginisialisasi sesi setiap kali.
Pilih id pesanan dan id penawaran dari tabel sales_flat_order
(bidang: entity_id
dan quote_id
). Misalnya via:
SELECT entity_id as order_id, quote_id
FROM sales_flat_order ORDER BY entity_id DESC LIMIT 1;
Kemudian ubah fungsi awal sebagai berikut:
$session = $this->getOnepage()->getCheckout();
$session->setLastSuccessQuoteId(INSERT_QUOTE_ID);
$session->setLastQuoteId(INSERT_QUOTE_ID);
$session->setLastOrderId(INSERT_ORDER_ID);
dan ganti INSERT_....
dengan ID.
Sekarang Anda selalu dapat menelepon checkout/onepage/success
Saat Anda melakukannya, Anda mungkin ingin menguji failureAction()
juga, dalam
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Tindakan yang dimodifikasi akan terlihat seperti ini
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();
}
Sekarang Anda selalu dapat menelepon checkout/onepage/failure
\vendor\magento\module-checkout\Controller\Onepage\Success.php
Anda perlu memodifikasi successAction () di
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Tindakan yang dimodifikasi akan menyukai ini
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
tidak didefinisikan yang akan bocor ke pemberitahuan dan dapat menyebabkan efek samping dalam template.
Semoga saya tidak terlalu mempromosikan diri sendiri, tetapi saya membuat ekstensi gratis yang dapat dengan cepat dipasang di Magento, dan memungkinkan Anda melihat pratinjau halaman keberhasilan pesanan untuk pesanan apa pun - cukup dengan mengakses URL: http: // www. yireo.com/software/magento-extensions/checkout-tester
Saya pikir lebih baik komentar saja $ session-> clear (); dan menambahkan produk secara manual, yang bekerja untuk saya tetapi mengomentari seluruh tindakan memberi saya kesalahan sintaks.
Untuk Magento 2:
Jika Anda ingin gaya atau menyesuaikan di halaman sukses setelah halaman kesuksesan pesanan dialihkan ke halaman keranjang.
Sekarang solusinya ada di sini:
Pergi Untuk vendor/magento/module-checkout/Controller/Onepage
membuka Success.php
File.
Dalam file ini, Anda melihat Kode Di Bawah Ini
if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) {
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
Cukup komentari kode ini dan masalah Anda terpecahkan. Setelah berkomentar ini, Anda tidak mengarahkan ke halaman keranjang.
Alih-alih mengirim email dari salinan lokal / pengembangan Anda dapat membuang konten email ke file dan kemudian hanya melihat secara lokal, yang menurut saya akan sangat berguna. Begini caranya. Pertama, semua email dikirim dari
Mage_Core_Model_Email_Template::send($email, $name = null, array $variables = array())
Temukan itu, dan tambahkan baris berikut.
$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());
Setelah ini setelah Anda membuat pesanan apa pun, email.html akan dibuat di root dokumen Magento dan Anda dapat membukanya di browser untuk melihat hasilnya.
Selanjutnya, untuk mengirim / mengirim ulang email pesanan apa saja, Anda cukup masuk admin dan untuk setiap pesanan ada tombol Kirim Email yang akan memicu skrip ini dan Anda dapat melihat templat yang baru saja diubah ditulis dalam file yang sama. Saya pikir ini adalah salah satu cara terbaik untuk melihat pesanan atau email lainnya.
Harap dicatat untuk menghapus kode yang ditambahkan ketika Anda selesai.
Anda harus memperbarui kode:
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Perbarui fungsi:
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();
}
Komentar saja:
//$session->clear();
Sebagai jawaban lain yang dicatat, Anda dapat mengomentari pengalihan Magento\Checkout\Controller\Onepage\Success::execute
dan memaksa halaman keberhasilan checkout dimuat. Tetapi ketika blok,, Magento\Checkout\Block\Onepage\Success
memuat tidak ada data pesanan akan hadir karena Magento\Checkout\Model\Session::getLastRealOrder
tidak akan mengembalikan pesanan. Opsi yang lebih baik adalah pencegat setelah pada metode eksekusi kelas controller, di mana Anda dapat menetapkan nilai lastRealOrderId
dalam sesi checkout.
Pendekatan ini juga memberikan kesempatan untuk mengirimkan checkout_onepage_controller_success_action
acara dengan pesanan yang Anda inginkan. Acara ini akan memicu pengamat Magento\GoogleAdwords\Observer\SetConversionValueObserver
dan Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObserver
dengan data uji Anda.
Berikut ini adalah modul yang cukup mendasar untuk membuat interseptor yang dijelaskan di atas dan memungkinkan pengaturan pesanan dengan menambahkan order
parameter kueri dengan id kenaikan yang diinginkan ke url halaman sukses. Saat ini tidak akan berhasil dengan rute kesuksesan multishipping. Itu dapat diunduh di github: https://github.com/pmclain/magento2-successtest
app / code / 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>
app / code / Pmclain / SuccessTest / Plugin / 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 Di bawah ini menambahkan opsi panel admin untuk mengaktifkan / menonaktifkan interseptor.
<?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 / 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 / code / 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 / code / Pmclain / SuccessTest / resgistration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Pmclain_SuccessTest',
__DIR__
);