Si vuelvo a cargar la checkout/onepage/success
página, me dirigen al carrito.
Entonces, al depurar o diseñar la página de éxito del pedido, siempre tengo que hacer un nuevo pedido.
¿Cómo puedo hacer esto de manera más eficiente?
Si vuelvo a cargar la checkout/onepage/success
página, me dirigen al carrito.
Entonces, al depurar o diseñar la página de éxito del pedido, siempre tengo que hacer un nuevo pedido.
¿Cómo puedo hacer esto de manera más eficiente?
Respuestas:
Puede hackear temporalmente el núcleo mientras desarrolla:
En /app/code/core/Mage/Checkout/controllers/OnepageController.php
edición successAction()
.
Comenta la línea $session->clear();
. Ahora puede hacer un pedido y actualizar la página con la frecuencia que desee.
Si ni siquiera desea hacer un pedido en cada navegador, por ejemplo, cuando realiza pruebas entre navegadores, también puede inicializar la sesión cada vez.
Elija un ID de pedido y un ID de presupuesto de la tabla sales_flat_order
(campos: entity_id
y quote_id
). Por ejemplo a través de:
SELECT entity_id as order_id, quote_id
FROM sales_flat_order ORDER BY entity_id DESC LIMIT 1;
Luego cambie el comienzo de la función de la siguiente manera:
$session = $this->getOnepage()->getCheckout();
$session->setLastSuccessQuoteId(INSERT_QUOTE_ID);
$session->setLastQuoteId(INSERT_QUOTE_ID);
$session->setLastOrderId(INSERT_ORDER_ID);
y reemplazar INSERT_....
con las identificaciones.
Ahora siempre puedes llamar checkout/onepage/success
Mientras lo hace, es posible que también desee probar el failureAction()
, en
/app/code/core/Mage/Checkout/controllers/OnepageController.php
La acción modificada se vería así
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();
}
Ahora siempre puedes llamar checkout/onepage/failure
\vendor\magento\module-checkout\Controller\Onepage\Success.php
Necesita modificar el successAction () en
/app/code/core/Mage/Checkout/controllers/OnepageController.php
A la acción modificada le gustaría esto
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
no está definido qué pasaría a un aviso y podría provocar efectos secundarios en la plantilla.
Espero no promocionarme demasiado, pero creé una extensión gratuita que se puede instalar rápidamente en Magento y le permite obtener una vista previa de la página de éxito del pedido para cualquier pedido, simplemente accediendo a una URL: http: // www. yireo.com/software/magento-extensions/checkout-tester
Creo que es mejor comentar $ session-> clear (); y agregar productos manualmente, eso funcionó para mí, pero comentar toda la acción me dio errores de sintaxis.
Para Magento 2:
Si desea diseñar o personalizar en la página de éxito después de la página de éxito del pedido, se redirige a la página del carrito.
Ahora la solución está aquí:
Ir a vendor/magento/module-checkout/Controller/Onepage
abrir Success.php
archivo.
En este archivo, verá el siguiente código
if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) {
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
Simplemente comente sobre este código y su problema está resuelto. Después de comentar esto, no lo redirige a la página del carrito.
En lugar de enviar correos electrónicos desde una copia local / de desarrollo, puede volcar el contenido del correo electrónico en un archivo y luego verlo localmente, lo que en mi opinión será realmente útil. Así es como se puede lograr. Primero todos los correos electrónicos se envían desde
Mage_Core_Model_Email_Template::send($email, $name = null, array $variables = array())
Encuentra eso y agrega las siguientes líneas.
$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());
Después de esto, después de crear cualquier pedido, se creará un email.html en la raíz del documento de Magento y puede abrirlo en el navegador para ver el resultado.
A continuación, para enviar / volver a enviar correos electrónicos de pedidos, puede iniciar sesión en el administrador y para cada pedido hay un botón Enviar correo electrónico que activará este script y podrá ver la plantilla recién modificada escrita en el mismo archivo. Creo que esta es una de las mejores formas de ver el pedido o cualquier otro correo electrónico.
Tenga en cuenta que debe eliminar el código agregado cuando haya terminado.
Tienes que actualizar el código:
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Función de actualización:
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();
}
Solo comenta:
//$session->clear();
Como señala otra respuesta, puede comentar la redirección Magento\Checkout\Controller\Onepage\Success::execute
y forzar la carga de la página de pago exitoso. Pero cuando el bloque Magento\Checkout\Block\Onepage\Success
no carga, no habrá datos de pedido porque Magento\Checkout\Model\Session::getLastRealOrder
no devolverá un pedido. Una mejor opción sería un interceptor posterior en el método de ejecución de la clase de controlador, donde puede establecer un valor lastRealOrderId
en la sesión de pago.
Este enfoque también brinda la oportunidad de enviar el checkout_onepage_controller_success_action
evento con el pedido deseado. El evento activará a los observadores Magento\GoogleAdwords\Observer\SetConversionValueObserver
y Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObserver
con sus datos de prueba.
El siguiente es un módulo bastante básico que crea el interceptor descrito anteriormente y permite establecer el orden agregando un order
parámetro de consulta con el ID de incremento deseado a la URL de la página de éxito. Actualmente no funcionará en la ruta del éxito de multipunto. Se puede descargar en 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>
aplicación / código / 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 A continuación se agregan opciones del panel de administración para habilitar / deshabilitar el 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>
aplicación / código / Pmclain / SuccessTest / resgistration.php
<?php
\Magento\Framework\Component\ComponentRegistrar::register(
\Magento\Framework\Component\ComponentRegistrar::MODULE,
'Pmclain_SuccessTest',
__DIR__
);