Comment tester ou styliser la page de réussite d'une commande?


114

Si je recharge la checkout/onepage/successpage, je suis dirigé vers le panier.

Ainsi, lors du débogage ou du style de la page de réussite de la commande, je dois toujours effectuer une nouvelle commande.

Comment puis-je faire cela plus efficacement?


2
Cette question a créé des réponses variées qui sont toutes remplies de "victoire". Toute personne visitant ici devrait parcourir toutes les réponses.
Chris K

Réponses:


149

Vous pouvez pirater temporairement le noyau pendant que vous développez:

En /app/code/core/Mage/Checkout/controllers/OnepageController.phpédition successAction().

Commentez la ligne $session->clear();. Vous pouvez maintenant passer une commande et actualiser la page aussi souvent que vous le souhaitez.

Si vous ne souhaitez même pas passer commande sur chaque navigateur, par exemple lorsque vous effectuez des tests entre navigateurs, vous pouvez également initialiser la session à chaque fois.

Choisissez un identifiant de commande et un identifiant de devis dans la table sales_flat_order(champs: entity_idet quote_id). Par exemple via:

SELECT entity_id as order_id, quote_id 
  FROM sales_flat_order ORDER BY entity_id DESC LIMIT 1;

Puis changez le début de la fonction comme suit:

$session = $this->getOnepage()->getCheckout();

$session->setLastSuccessQuoteId(INSERT_QUOTE_ID);
$session->setLastQuoteId(INSERT_QUOTE_ID);
$session->setLastOrderId(INSERT_ORDER_ID);

et remplacer INSERT_....par les identifiants.

Maintenant, vous pouvez toujours appeler checkout/onepage/success

Pendant que vous y êtes, vous voudrez peut-être aussi tester failureAction(), en

/app/code/core/Mage/Checkout/controllers/OnepageController.php

L'action modifiée ressemblerait à ceci

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

Maintenant, vous pouvez toujours appeler checkout/onepage/failure


Résout ce problème? Veuillez le marquer comme solution.
Fabian Blechschmidt

3
J'ai testé à la fois le testeur Yireo Checkout de Jisse Reitsma et cette méthode. Bien que le module soit le moyen le plus simple, j’ai trouvé qu’il n’était pas compatible à 100% avec notre module de thème et de paiement, ce qui donnait un style différent de celui de la page à succès originale. Tout en nécessitant de modifier le noyau, cette méthode fonctionnait cependant comme un charme. Remarque: la réponse manque le fichier que vous devez modifier, à savoir /app/code/core/Mage/Checkout/controllers/OnepageController.php
Ottonet le

Pour les personnes souhaitant faire de même en M2, vous pouvez commenter les lignes 19 à 22\vendor\magento\module-checkout\Controller\Onepage\Success.php
Dynomite

24

Vous devez modifier successAction () dans

/app/code/core/Mage/Checkout/controllers/OnepageController.php

Une action modifiée aimerait ceci

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
Mais alors, $lastOrderIdon ne définit pas ce qui lierait à un avis et pourrait entraîner des effets secondaires dans le modèle.
Alex

1
J'ai eu du succès simplement en commentant la $ session-> clear (); La seule chose que je perds, ce sont les avis / messages ajoutés tels que les avis / messages OTC / Récompenses ajoutés via observateur. Laisser le code dans un module de substitution, qui est .gitignored, donc jamais déployé.
Barry Carlyon


4

Je pense qu'il vaut mieux commenter $ session-> clear (); et ajouter des produits manuellement, cela a fonctionné pour moi, mais commenter l'ensemble de l'action m'a généré des erreurs de syntaxe.


4

Pour Magento 2:

Si vous souhaitez styler ou personnaliser la page de succès après la commande, la page de redirection est redirigée vers la page de panier.

Maintenant la solution est là:

Aller à vendor/magento/module-checkout/Controller/Onepage ouvrir le Success.phpfichier.

Dans ce fichier, vous voyez ci-dessous Code

 if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) {
     return $this->resultRedirectFactory->create()->setPath('checkout/cart');
 }

Il suffit de commenter ce code et votre problème est résolu. Après un commentaire, vous ne redirigez pas vers la page panier.


3

Au lieu d'envoyer des courriels à partir d'une copie locale / de développement, vous pouvez vider le contenu du courriel dans un fichier, puis voir juste localement, ce qui, à mon avis, sera vraiment pratique. Voici comment cela peut être réalisé. D'abord tous les emails sont envoyés de

Mage_Core_Model_Email_Template::send($email, $name = null, array $variables = array())

Trouvez cela et ajoutez les lignes suivantes.

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

Après cela, après avoir créé une commande, un email.html sera créé dans la racine du document Magento et vous pourrez l'ouvrir dans le navigateur pour voir le résultat.

Ensuite, pour envoyer / ré-envoyer tous les courriels de commande, vous pouvez simplement vous connecter en tant qu'administrateur. Pour chaque commande, le bouton Envoyer un courriel déclenchera ce script et vous pourrez voir le modèle nouvellement modifié écrit dans le même fichier. Je pense que c'est l'un des meilleurs moyens de voir l'ordre ou tout autre courrier électronique.

S'il vous plaît noter pour supprimer le code ajouté lorsque vous avez terminé.


1

Vous devez mettre à jour le code:

/app/code/core/Mage/Checkout/controllers/OnepageController.php

Fonction de mise à jour:

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

Juste un commentaire:

//$session->clear();

1

Magento 2

Dans une autre réponse, vous pouvez commenter la redirection Magento\Checkout\Controller\Onepage\Success::executeet forcer le chargement de la page de succès de la validation du paiement. Mais lors du blocage, Magento\Checkout\Block\Onepage\Successaucune donnée de commande ne sera présente car Magento\Checkout\Model\Session::getLastRealOrderelle ne renverra pas de commande. Une meilleure option serait un intercepteur après sur la méthode execute de la classe de contrôleur, où vous pouvez définir une valeur pour lastRealOrderIddans la session de paiement.

Cette approche fournit également une opportunité d’envoyer l’ checkout_onepage_controller_success_actionévénement avec votre commande souhaitée. L'événement déclenchera les observateurs Magento\GoogleAdwords\Observer\SetConversionValueObserveret Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObservervos données de test.

Ce qui suit est un module assez basique créant l'intercepteur décrit ci-dessus et permet de définir l'ordre en ajoutant un orderparamètre de requête avec l'ID d'incrément souhaité à l'URL de la page de réussite. Cela ne fonctionnera pas actuellement avec la voie de la réussite multi-puces. Il peut être téléchargé sur 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 Vous trouverez ci-dessous les options du panneau d'administration pour activer / désactiver l'intercepteur.

<?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__
);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.