Se ricarico la checkout/onepage/success
pagina, sono indirizzato al carrello.
Quindi, durante il debug o lo styling della pagina di successo dell'ordine, devo sempre effettuare un nuovo ordine.
Come posso farlo in modo più efficiente?
Se ricarico la checkout/onepage/success
pagina, sono indirizzato al carrello.
Quindi, durante il debug o lo styling della pagina di successo dell'ordine, devo sempre effettuare un nuovo ordine.
Come posso farlo in modo più efficiente?
Risposte:
Puoi temporaneamente hackerare il core mentre stai sviluppando:
In /app/code/core/Mage/Checkout/controllers/OnepageController.php
modifica successAction()
.
Commenta la riga $session->clear();
. Ora puoi effettuare un ordine e aggiornare la pagina tutte le volte che vuoi.
Se non si desidera nemmeno effettuare un ordine su ciascun browser, ad esempio quando si eseguono test tra browser, è anche possibile inizializzare la sessione ogni volta.
Scegli un ID ordine e un ID preventivo dalla tabella sales_flat_order
(campi: entity_id
e quote_id
). Ad esempio tramite:
SELECT entity_id as order_id, quote_id
FROM sales_flat_order ORDER BY entity_id DESC LIMIT 1;
Quindi modificare l'inizio della funzione come segue:
$session = $this->getOnepage()->getCheckout();
$session->setLastSuccessQuoteId(INSERT_QUOTE_ID);
$session->setLastQuoteId(INSERT_QUOTE_ID);
$session->setLastOrderId(INSERT_ORDER_ID);
e sostituisci INSERT_....
con gli ID.
Adesso puoi sempre chiamare checkout/onepage/success
Mentre si è in esso, si potrebbe desiderare di provare il failureAction()
pure, in
/app/code/core/Mage/Checkout/controllers/OnepageController.php
L'azione modificata sarebbe simile a questa
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();
}
Adesso puoi sempre chiamare checkout/onepage/failure
\vendor\magento\module-checkout\Controller\Onepage\Success.php
È necessario modificare successAction () in
/app/code/core/Mage/Checkout/controllers/OnepageController.php
L'azione modificata vorrebbe questo
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
non è definito quale sarebbe un avviso e potrebbe portare a effetti collaterali nel modello.
Spero di non essere troppo autopromozione, ma ho creato un'estensione gratuita che può essere installata rapidamente in Magento e ti consente di visualizzare in anteprima la pagina di successo dell'ordine per qualsiasi ordine, semplicemente accedendo a un URL: http: // www. yireo.com/software/magento-extensions/checkout-tester
Penso che sia meglio commentare $ session-> clear (); e aggiungere prodotti manualmente, che ha funzionato per me, ma commentare l'intera azione mi ha dato errori di sintassi.
Per Magento 2:
Se si desidera personalizzare o personalizzare la pagina di successo dopo che la pagina di successo dell'ordine reindirizza alla pagina del carrello.
Ora la soluzione è qui:
Vai a vendor/magento/module-checkout/Controller/Onepage
Apri Success.php
file.
In questo file, vedi sotto il codice
if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) {
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
Commenta questo codice e il tuo problema è risolto. Dopo aver commentato questo non reindirizzare alla pagina del carrello.
Invece di inviare e-mail dalla copia locale / di sviluppo, è possibile scaricare il contenuto dell'e-mail in un file e quindi vedere solo localmente, che a mio avviso sarà davvero utile. Ecco come può essere raggiunto. Innanzitutto tutte le e-mail vengono inviate
Mage_Core_Model_Email_Template::send($email, $name = null, array $variables = array())
Trova quello e aggiungi le seguenti righe.
$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());
Dopo questo dopo aver creato un ordine, verrà creato un email.html nella radice del documento Magento e potrai aprirlo nel browser per vedere l'output.
Successivamente, per inviare / inviare nuovamente qualsiasi e-mail di ordine, è sufficiente accedere a admin e per ogni ordine è disponibile il pulsante Invia e-mail che attiverà questo script e sarà possibile vedere il modello appena modificato scritto nello stesso file. Penso che questo sia uno dei modi migliori per vedere l'ordine o qualsiasi altra e-mail.
Si prega di notare per rimuovere il codice aggiunto al termine.
Devi aggiornare il codice:
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Funzione di aggiornamento:
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();
}
Basta commentare:
//$session->clear();
Come nota un'altra risposta, puoi commentare il reindirizzamento Magento\Checkout\Controller\Onepage\Success::execute
e forzare il caricamento della pagina di successo del checkout. Ma quando il blocco Magento\Checkout\Block\Onepage\Success
non carica i dati dell'ordine non sarà presente perché Magento\Checkout\Model\Session::getLastRealOrder
non restituirà un ordine. Un'opzione migliore sarebbe un intercettore post sul metodo di esecuzione della classe controller, in cui è possibile impostare un valore per lastRealOrderId
nella sessione di checkout.
Questo approccio offre anche l'opportunità di inviare l' checkout_onepage_controller_success_action
evento con l'ordine desiderato. L'evento attiverà gli osservatori Magento\GoogleAdwords\Observer\SetConversionValueObserver
e Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObserver
con i tuoi dati di test.
Il seguente è un modulo abbastanza semplice che crea l'intercettore sopra descritto e consente di impostare l'ordine aggiungendo un order
parametro di query con l'id di incremento desiderato all'URL della pagina di successo. Al momento non funzionerà la via del successo multishipping. Può essere scaricato su 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 seguito vengono aggiunte le opzioni del pannello di amministrazione per abilitare / disabilitare l'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 / 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__
);