Se eu recarregar a checkout/onepage/success
página, sou direcionado ao carrinho.
Portanto, ao depurar ou estilizar a página de sucesso do pedido, sempre tenho que fazer um novo pedido.
Como posso fazer isso de forma mais eficiente?
Se eu recarregar a checkout/onepage/success
página, sou direcionado ao carrinho.
Portanto, ao depurar ou estilizar a página de sucesso do pedido, sempre tenho que fazer um novo pedido.
Como posso fazer isso de forma mais eficiente?
Respostas:
Você pode cortar temporariamente o núcleo enquanto estiver desenvolvendo:
Em /app/code/core/Mage/Checkout/controllers/OnepageController.php
edição successAction()
.
Comente a linha $session->clear();
. Agora você pode fazer um pedido e atualizar a página quantas vezes quiser.
Se você nem deseja fazer um pedido em cada navegador, por exemplo, ao fazer testes em vários navegadores, também é possível inicializar a sessão todas as vezes.
Escolha um ID do pedido e um ID da cotação na tabela sales_flat_order
(campos: entity_id
e quote_id
). Por exemplo, via:
SELECT entity_id as order_id, quote_id
FROM sales_flat_order ORDER BY entity_id DESC LIMIT 1;
Altere o início da função da seguinte maneira:
$session = $this->getOnepage()->getCheckout();
$session->setLastSuccessQuoteId(INSERT_QUOTE_ID);
$session->setLastQuoteId(INSERT_QUOTE_ID);
$session->setLastOrderId(INSERT_ORDER_ID);
e substitua INSERT_....
pelos IDs.
Agora você sempre pode ligar checkout/onepage/success
Enquanto você está nisso, você pode querer testar o failureAction()
também, em
/app/code/core/Mage/Checkout/controllers/OnepageController.php
A ação modificada ficaria assim
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();
}
Agora você sempre pode ligar checkout/onepage/failure
\vendor\magento\module-checkout\Controller\Onepage\Success.php
Você precisa modificar o successAction () em
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Ação modificada gostaria desta
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
não está definido o que levaria a um aviso e poderia levar a efeitos colaterais no modelo.
Espero não ser muito autopromocional, mas criei uma extensão gratuita que pode ser instalada rapidamente no Magento e permite que você visualize a página de sucesso de pedidos de qualquer pedido - simplesmente acessando um URL: http: // www. yireo.com/software/magento-extensions/checkout-tester
Acho melhor comentar apenas $ session-> clear (); e adicione produtos manualmente, que funcionaram para mim, mas comentar toda a ação me deu erros de sintaxe.
Para Magento 2:
Se você deseja estilizar ou personalizar na página de sucesso, a página de sucesso do pedido é redirecionada para a página do carrinho.
Agora a solução está aqui:
Vá para vendor/magento/module-checkout/Controller/Onepage
abrir Success.php
arquivo.
Neste arquivo, você vê o código abaixo
if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) {
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
Basta comentar sobre este código e seu problema está resolvido. Após comentar isso, você não redireciona para a página do carrinho.
Em vez de enviar emails da cópia local / de desenvolvimento, você pode despejar o conteúdo do email em um arquivo e apenas ver localmente, o que, na minha opinião, será realmente útil. Aqui está como isso pode ser alcançado. Primeiro, todos os emails são enviados de
Mage_Core_Model_Email_Template::send($email, $name = null, array $variables = array())
Encontre isso e adicione as seguintes linhas.
$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());
Depois disso, depois de criar qualquer pedido, um email.html será criado na raiz do documento Magento e você poderá abri-lo no navegador para ver a saída.
Em seguida, para enviar / reenviar todos os emails de pedidos, basta fazer login no admin e, para cada pedido, há o botão Enviar Email, que acionará esse script e você poderá ver o modelo recém-alterado gravado no mesmo arquivo. Acho que essa é uma das melhores maneiras de ver pedidos ou outros emails.
Observe para remover o código adicionado quando terminar.
Você precisa atualizar o código:
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Função de atualização:
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();
}
Apenas comente:
//$session->clear();
Como outra resposta, você pode comentar o redirecionamento Magento\Checkout\Controller\Onepage\Success::execute
e forçar o carregamento da página de sucesso do checkout. Mas quando o bloco, Magento\Checkout\Block\Onepage\Success
carrega, nenhum dado do pedido estará presente porque Magento\Checkout\Model\Session::getLastRealOrder
não retornará um pedido. Uma opção melhor seria um interceptador posterior no método de execução da classe do controlador, no qual você pode definir um valor lastRealOrderId
na sessão de checkout.
Essa abordagem também oferece a oportunidade de despachar o checkout_onepage_controller_success_action
evento com o pedido desejado. O evento acionará os observadores Magento\GoogleAdwords\Observer\SetConversionValueObserver
e Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObserver
com seus dados de teste.
A seguir, um módulo bastante básico que cria o interceptador descrito acima e permite definir a ordem anexando um order
parâmetro de consulta com o ID de incremento desejado ao URL da página de sucesso. Atualmente, ele não funciona na rota de sucesso multishipping. Pode ser baixado no 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 Abaixo, adiciona opções do painel de administração para ativar / desativar o interceptador.
<?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__
);