¿Cómo probar o diseñar la página de éxito del pedido?

114

Si vuelvo a cargar la checkout/onepage/successpá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?

Alex
fuente
2
Esta pregunta creó respuestas variadas que están llenas de "ganar". Cualquiera que visite aquí debería leer todas las respuestas.
Chris K

Respuestas:

149

Puede hackear temporalmente el núcleo mientras desarrolla:

En /app/code/core/Mage/Checkout/controllers/OnepageController.phpedició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_idy 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

Alex
fuente
Soluciona este tu problema? Por favor márquelo como solución.
Fabian Blechschmidt
3
He probado tanto el comprobador de pago de Yireo de Jisse Reitsma como este método. Si bien el módulo es la forma más fácil, descubrí que no es 100% compatible con nuestro tema y módulo de pago, lo que da como resultado un estilo diferente al de la página de éxito original. Aunque requería modificar el núcleo, este método funcionó de maravilla. Nota: a la respuesta le falta el archivo que necesita editar, que es /app/code/core/Mage/Checkout/controllers/OnepageController.php
Ottonet
Para las personas que desean hacer lo mismo en M2, pueden comentar las líneas 19 a 22 en\vendor\magento\module-checkout\Controller\Onepage\Success.php
Dynomite
24

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();
    }
blakcaps
fuente
3
Pero entonces $lastOrderIdno está definido qué pasaría a un aviso y podría provocar efectos secundarios en la plantilla.
Alex
1
He tenido éxito simplemente comentando $ session-> clear (); Lo único que pierdo es cualquier aviso / mensaje agregado como TBT / Avisos de recompensa / Mensajes agregados a través del observador. Dejar el código en un módulo de anulación, que es .gitignored, por lo que nunca se implementa.
Barry Carlyon
4

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.

Farzan Balkani
fuente
4

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.phparchivo.

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.

Nikul
fuente
3

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.

Subesh Pokhrel
fuente
1

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();
Ravi Soni
fuente
1

Magento 2

Como señala otra respuesta, puede comentar la redirección Magento\Checkout\Controller\Onepage\Success::executey forzar la carga de la página de pago exitoso. Pero cuando el bloque Magento\Checkout\Block\Onepage\Successno carga, no habrá datos de pedido porque Magento\Checkout\Model\Session::getLastRealOrderno 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 lastRealOrderIden la sesión de pago.

Este enfoque también brinda la oportunidad de enviar el checkout_onepage_controller_success_actionevento con el pedido deseado. El evento activará a los observadores Magento\GoogleAdwords\Observer\SetConversionValueObservery Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObservercon 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 orderpará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__
);
Pmclain
fuente