Comment tester ou le style de la page de succès de l'ordre?
-
16-10-2019 - |
Question
Si je recharger la page checkout/onepage/success
, je suis dirigé vers le panier.
Ainsi, lors du débogage ou styling la page de succès de l'ordre, je dois toujours faire un nouvel ordre.
Comment puis-je faire plus efficacement?
La solution
Vous pouvez temporairement pirater le noyau pendant que vous développez:
Dans /app/code/core/Mage/Checkout/controllers/OnepageController.php
modifier successAction()
.
Comment la ligne $session->clear();
. Maintenant, vous pouvez faire un ordre et actualisez la page aussi souvent que vous le souhaitez.
Si vous ne voulez même pas faire une commande sur chaque navigateur, par exemple lorsque vous effectuez des tests multi-navigateur, vous pouvez aussi simplement initialiser la session à chaque fois.
Choisissez un numéro de commande et un identifiant de citation de la table sales_flat_order
(champs: entity_id
et quote_id
). Par exemple via:
SELECT entity_id as order_id, quote_id
FROM sales_flat_order ORDER BY entity_id DESC LIMIT 1;
Ensuite, 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 replaceINSERT_....
avec les ID.
Maintenant, vous pouvez toujours appeler checkout/onepage/success
Pendant que vous y êtes, vous pouvez tester le failureAction()
ainsi, dans
/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
Autres conseils
Vous devez modifier le successAction () dans
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Action modifiée souhaite que ce
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();
}
Hope Je ne suis pas trop d'auto-promotion, mais je créé une extension gratuite qui peut être installé rapidement dans Magento, et vous permet d'avoir un aperçu du succès page de commande pour toute commande - simplement en accédant à une URL: http://www.yireo.com/software/magento-extensions/checkout- testeur
Je pense qu'il est préférable de faire un commentaire session- $> clear (); et ajouter des produits manuellement, qui ont travaillé pour moi, mais toute l'action commentant les erreurs de syntaxe m'a donné.
Pour Magento 2:
Si vous voulez style ou personnaliser en page succès après la page de succès de commande redirige vers la page de panier.
solution est maintenant ici:
Aller à vendor/magento/module-checkout/Controller/Onepage
Fichier ouvert Success.php
.
Dans ce fichier, vous voyez ci-dessous le code
if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) {
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
Juste un commentaire sur ce code et votre problème est résolu. Après commentaire cela vous ne redirige pas à la page de panier.
Au lieu d'envoyer des e-mails du développement local / copie que vous pouvez vider le contenu de l'e-mail dans un fichier et puis juste voir localement, ce qui à mon avis sera vraiment pratique. Voilà comment cela peut être acheived. D'abord tous les e-mails sont envoyés à partir
Mage_Core_Model_Email_Template::send($email, $name = null, array $variables = array())
Constater que, 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éé toute commande un email.html sera créé dans le document racine Magento et vous pouvez ouvrir que dans le navigateur pour voir la sortie.
Ensuite, pour envoyer / re-envoyer des e-mails de commande, vous pouvez simplement connecter admin et pour chaque commande, il est bouton Envoyer qui déclenchera ce script et vous pouvez voir le modèle récemment changé par écrit dans le même fichier. Je pense que c'est l'un des meilleurs moyen de voir l'ordre ou tout autre e-mails.
S'il vous plaît noter pour supprimer le code ajouté lorsque vous avez terminé.
Vous devez le code de mise à jour:
/app/code/core/Mage/Checkout/controllers/OnepageController.php
fonction 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();
}
Il suffit de commentaire:
//$session->clear();
Magento 2
Comme une autre note de réponse, vous pouvez commenter la redirection dans Magento\Checkout\Controller\Onepage\Success::execute
et forcer la page de succès de la caisse à la charge. Mais quand le bloc, Magento\Checkout\Block\Onepage\Success
, charge pas de données de commande seront présents parce que Magento\Checkout\Model\Session::getLastRealOrder
ne reviendra pas un ordre. Un meilleur choix serait un après intercepteur sur la classe du contrôleur est d'exécuter la méthode, vous pouvez définir une valeur pour lastRealOrderId
lors de la session de la caisse.
Cette approche fournit aussi l'occasion de distribuer l'événement checkout_onepage_controller_success_action
avec ordre de votre choix. L'événement déclenche les observateurs Magento\GoogleAdwords\Observer\SetConversionValueObserver
et Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObserver
avec vos 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 paramètre de requête order
avec l'identifiant incrément souhaité à la page de succès URL. Actuellement, elle ne fonctionnera pas la route du succès multishipping. 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 / plug-in / 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 ci-dessous ajoute des options de 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__
);