Come testare o modellare la pagina di successo dell'ordine?


114

Se ricarico la checkout/onepage/successpagina, 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?


2
Questa domanda ha creato diverse risposte che sono tutte piene di "vittoria". Chiunque visiti qui dovrebbe esaminare tutte le risposte.
Chris K,

Risposte:


149

Puoi temporaneamente hackerare il core mentre stai sviluppando:

In /app/code/core/Mage/Checkout/controllers/OnepageController.phpmodifica 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_ide 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


Risolve questo tuo problema? Si prega di contrassegnarlo come soluzione.
Fabian Blechschmidt,

3
Ho testato sia Yireo Checkout Tester di Jisse Reitsma sia questo metodo. Mentre il modulo è il modo più semplice, ho scoperto che non è compatibile al 100% con il nostro tema e il modulo di pagamento, risultando in uno stile diverso rispetto alla pagina di successo originale. Pur richiedendo di modificare il nucleo, questo metodo ha funzionato comunque come un incantesimo. Nota: nella risposta manca il file che è necessario modificare, ovvero /app/code/core/Mage/Checkout/controllers/OnepageController.php
Ottonet

Per le persone che vorrebbero fare lo stesso in M2, puoi commentare le righe da 19 a 22 in\vendor\magento\module-checkout\Controller\Onepage\Success.php
Dynomite,

24

È 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();
    }

3
Ma allora $lastOrderIdnon è definito quale sarebbe un avviso e potrebbe portare a effetti collaterali nel modello.
Alex,

1
Ho avuto successo semplicemente commentando $ session-> clear (); L'unica cosa che perdo sono eventuali avvisi / messaggi aggiunti come TBT / Rewards Avvisi / Messaggi aggiunti tramite l'osservatore. Lasciando il codice in un modulo di override, che è .gitignored quindi mai distribuito.
Barry Carlyon,


4

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.


4

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

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.


3

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.


1

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();

1

Magento 2

Come nota un'altra risposta, puoi commentare il reindirizzamento Magento\Checkout\Controller\Onepage\Success::executee forzare il caricamento della pagina di successo del checkout. Ma quando il blocco Magento\Checkout\Block\Onepage\Successnon carica i dati dell'ordine non sarà presente perché Magento\Checkout\Model\Session::getLastRealOrdernon restituirà un ordine. Un'opzione migliore sarebbe un intercettore post sul metodo di esecuzione della classe controller, in cui è possibile impostare un valore per lastRealOrderIdnella sessione di checkout.

Questo approccio offre anche l'opportunità di inviare l' checkout_onepage_controller_success_actionevento con l'ordine desiderato. L'evento attiverà gli osservatori Magento\GoogleAdwords\Observer\SetConversionValueObservere Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObservercon 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 orderparametro 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__
);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.