Como testar ou estilizar a página de sucesso do pedido?

114

Se eu recarregar a checkout/onepage/successpá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?

Alex
fonte
2
Esta pergunta criou respostas variadas, todas cheias de "vitória". Quem visita aqui deve ler todas as respostas.
22414 Chris K

Respostas:

149

Você pode cortar temporariamente o núcleo enquanto estiver desenvolvendo:

Em /app/code/core/Mage/Checkout/controllers/OnepageController.phpediçã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_ide 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

Alex
fonte
Corrige este problema? Por favor, marque-o como solução.
Fabian Blechschmidt 25/03
3
Testei o Yireo Checkout Tester de Jisse Reitsma e esse método. Embora o módulo seja a maneira mais fácil, achei que ele não era 100% compatível com o nosso módulo de temas e pagamentos, resultando em um estilo diferente da página de sucesso original. Embora exigisse modificar o núcleo, esse método funcionou como um encanto. Nota: a resposta está faltando o arquivo que você precisa para editar, que é /app/code/core/Mage/Checkout/controllers/OnepageController.php
Ottonet
Para as pessoas que gostariam de fazer o mesmo em M2 você pode comentar as linhas 19 a 22, em\vendor\magento\module-checkout\Controller\Onepage\Success.php
Dynomite
24

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();
    }
blakcaps
fonte
3
Mas então $lastOrderIdnão está definido o que levaria a um aviso e poderia levar a efeitos colaterais no modelo.
19413 Alex
1
Eu tive sucesso apenas comentando o $ session-> clear (); A única coisa que perco são os avisos / mensagens adicionados, como TBT / Rewards Avisos / Mensagens adicionados via observador. Deixando o código em um módulo de substituição, que é .gitignored, para nunca ser implantado.
Barry Carlyon
4

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.

Farzan Balkani
fonte
4

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

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.

Nikul
fonte
3

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.

Subesh Pokhrel
fonte
1

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

Magento 2

Como outra resposta, você pode comentar o redirecionamento Magento\Checkout\Controller\Onepage\Success::executee forçar o carregamento da página de sucesso do checkout. Mas quando o bloco, Magento\Checkout\Block\Onepage\Successcarrega, nenhum dado do pedido estará presente porque Magento\Checkout\Model\Session::getLastRealOrdernã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 lastRealOrderIdna sessão de checkout.

Essa abordagem também oferece a oportunidade de despachar o checkout_onepage_controller_success_actionevento com o pedido desejado. O evento acionará os observadores Magento\GoogleAdwords\Observer\SetConversionValueObservere Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObservercom 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 orderparâ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__
);
Pmclain
fonte