Come testare o lo stile della pagina di successo ordine?
-
16-10-2019 - |
Domanda
Se ricarichiamo la pagina checkout/onepage/success
, io sono diretto verso il carro.
Così, quando il debug o styling pagina successo ordine, devo sempre fare un nuovo ordine.
Come posso fare questo in modo più efficiente?
Soluzione
Puoi temporaneamente hackerare il core, mentre si sta sviluppando:
In /app/code/core/Mage/Checkout/controllers/OnepageController.php
Modifica successAction()
.
come commento la riga $session->clear();
. Ora è possibile effettuare un ordine e aggiornare la pagina tutte le volte che ti piace.
Se non vuoi nemmeno fare un ordine su ogni browser, ad esempio quando si fa il test cross-browser, è anche possibile semplicemente inizializzare la sessione ogni volta.
Scegliere un ID ordine e un ID di citazione dal sales_flat_order
tavolo (campi: entity_id
e quote_id
). Ad esempio attraverso:
SELECT entity_id as order_id, quote_id
FROM sales_flat_order ORDER BY entity_id DESC LIMIT 1;
Poi cambia 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 replaceINSERT_....
con gli ID.
Ora si può sempre chiamare checkout/onepage/success
Mentre si è in esso, si potrebbe desiderare di provare la failureAction()
pure, in
/app/code/core/Mage/Checkout/controllers/OnepageController.php
L'azione modificato sarebbe simile a questa ??p>
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();
}
Ora si può sempre chiamare checkout/onepage/failure
Altri suggerimenti
È necessario modificare il successAction () in
/app/code/core/Mage/Checkout/controllers/OnepageController.php
azione Modificato 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();
}
Spero di non essere troppo auto-promozione, ma ho creato un estensione gratuita che può essere rapidamente installato in Magento, e permette di visualizzare in anteprima il successo-pagina d'ordine per ogni ordine - semplicemente accedendo a un URL: http://www.yireo.com/software/magento-extensions/checkout- tester
Credo che sia meglio solo commentare $ session-> clear (); e aggiungere manualmente i prodotti, che ha lavorato per me, ma commentando l'intera azione mi ha dato la sintassi errori.
Per Magento 2:
Se volete stile o personalizzare in pagina dopo pagina il successo successo ordine redirect alla pagina del carrello.
Ora la soluzione è qui:
Vai a vendor/magento/module-checkout/Controller/Onepage
aperto Success.php
file.
In questo file, che vedete qui sotto Codice
if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) {
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
Proprio commento su questo codice e il problema è risolto. Dopo commento questo non si reindirizzare alla pagina del carrello.
Invece di inviare messaggi di posta elettronica dallo sviluppo / local copia è possibile scaricare il contenuto della posta elettronica in un file e poi basta vedere a livello locale, che a mio parere sarà veramente utile. Ecco come che può essere acheived. In primo luogo tutte le email vengono inviate da
Mage_Core_Model_Email_Template::send($email, $name = null, array $variables = array())
Trova questo, e aggiungere 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 di un email.html verrà creato nella radice del documento Magento e si può aprire che nel browser per vedere l'uscita.
Quindi, per inviare / re-inviare alcuna email di ordine si può fare il login admin e per ogni ordine c'è il pulsante Invia e-mail che attiverà questo script e si può vedere il modello appena cambiato scritta nello stesso file. Credo che questo sia uno dei modi migliori per vedere ordine o eventuali altre email.
Si prega di nota per rimuovere il codice aggiunto quando si è fatto.
È necessario il codice di aggiornamento:
/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();
}
Proprio commento:
//$session->clear();
Magento 2
Come ulteriore nota di risposta, è possibile commentare la reindirizzamento in Magento\Checkout\Controller\Onepage\Success::execute
e forzare la pagina di successo di checkout a carico. Ma quando i blocchi, Magento\Checkout\Block\Onepage\Success
, carichi dati dell'ordine sarà presente perché Magento\Checkout\Model\Session::getLastRealOrder
non restituirà un ordine. A opzioni migliori sarebbe un dopo intercettore sulla classe controllore di metodo, in cui è possibile impostare un valore per lastRealOrderId
nella sessione di cassa eseguire.
Questo approccio fornisce anche la possibilità di inviare l'evento checkout_onepage_controller_success_action
con l'ordine desiderato. L'evento attiverà il Magento\GoogleAdwords\Observer\SetConversionValueObserver
osservatori e Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObserver
con i tuoi dati di test.
Il seguente è un modulo piuttosto semplice creare l'intercettatore sopra descritto e permette di impostare l'ordine aggiungendo un parametro di ricerca order
con l'id incremento desiderato alla pagina di successo URL. Attualmente non funziona il percorso di 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 Qui di seguito aggiunge opzioni del pannello di amministrazione per attivare / disattivare l'intercettore.
<?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__
);