Wenn ich die checkout/onepage/success
Seite neu lade , werde ich zum Warenkorb weitergeleitet.
Deshalb muss ich beim Debuggen oder Gestalten der Bestellerfolgsseite immer eine neue Bestellung aufgeben.
Wie kann ich das effizienter machen?
Wenn ich die checkout/onepage/success
Seite neu lade , werde ich zum Warenkorb weitergeleitet.
Deshalb muss ich beim Debuggen oder Gestalten der Bestellerfolgsseite immer eine neue Bestellung aufgeben.
Wie kann ich das effizienter machen?
Antworten:
Sie können den Core vorübergehend hacken, während Sie sich entwickeln:
In /app/code/core/Mage/Checkout/controllers/OnepageController.php
Bearbeitung successAction()
.
Kommentiere die Zeile aus $session->clear();
. Jetzt können Sie eine Bestellung aufgeben und die Seite so oft aktualisieren, wie Sie möchten.
Wenn Sie nicht einmal für jeden Browser eine Bestellung aufgeben möchten, z. B. beim Cross-Browser-Testen, können Sie die Sitzung auch einfach jedes Mal initialisieren.
Wählen Sie eine Bestellnummer und eine Angebotsnummer aus der Tabelle sales_flat_order
(Felder: entity_id
und quote_id
). Zum Beispiel über:
SELECT entity_id as order_id, quote_id
FROM sales_flat_order ORDER BY entity_id DESC LIMIT 1;
Ändern Sie dann den Beginn der Funktion wie folgt:
$session = $this->getOnepage()->getCheckout();
$session->setLastSuccessQuoteId(INSERT_QUOTE_ID);
$session->setLastQuoteId(INSERT_QUOTE_ID);
$session->setLastOrderId(INSERT_ORDER_ID);
und durch INSERT_....
die IDs ersetzen .
Jetzt können Sie immer anrufen checkout/onepage/success
Während Sie gerade dabei sind, möchten Sie vielleicht das testen , failureAction()
als auch, in
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Die geänderte Aktion würde so aussehen
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();
}
Jetzt können Sie immer anrufen checkout/onepage/failure
\vendor\magento\module-checkout\Controller\Onepage\Success.php
Sie müssen die successAction () in ändern
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Geänderte Aktion würde dies gefallen
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();
}
$lastOrderId
ist nicht definiert, was zu einer Kündigung führen würde und zu Nebenwirkungen in der Vorlage führen könnte.
Ich hoffe, ich bin nicht zu selbstbewusst, aber ich habe eine kostenlose Erweiterung erstellt, die schnell in Magento installiert werden kann und die es Ihnen ermöglicht, eine Vorschau der Bestellerfolgsseite für jede Bestellung anzuzeigen - einfach durch Zugriff auf eine URL: http: // www. yireo.com/software/magento-extensions/checkout-tester
Ich denke, es ist besser, nur $ session-> clear () zu kommentieren; und füge Produkte manuell hinzu, was bei mir funktionierte, aber das Kommentieren der gesamten Aktion gab mir Syntaxfehler.
Für Magento 2:
Wenn Sie die Erfolgsseite nach der Bestellung stylen oder anpassen möchten, wird die Erfolgsseite auf die Warenkorbseite umgeleitet.
Jetzt ist die Lösung da:
Gehe zu Datei vendor/magento/module-checkout/Controller/Onepage
öffnen Success.php
.
In dieser Datei sehen Sie Below Code
if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) {
return $this->resultRedirectFactory->create()->setPath('checkout/cart');
}
Kommentieren Sie einfach diesen Code und Ihr Problem ist gelöst. Nach dem Kommentar werden Sie nicht auf die Warenkorb-Seite weitergeleitet.
Anstatt E-Mails von einer lokalen / Entwicklungskopie zu versenden, können Sie den Inhalt der E-Mail in eine Datei kopieren und dann nur lokal anzeigen, was meiner Meinung nach sehr praktisch ist. So kann das erreicht werden. Zunächst werden alle E-Mails von gesendet
Mage_Core_Model_Email_Template::send($email, $name = null, array $variables = array())
Finden Sie das und fügen Sie die folgenden Zeilen hinzu.
$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());
Nachdem Sie einen Auftrag erstellt haben, wird im Magento-Dokumentenstamm eine email.html erstellt, die Sie im Browser öffnen können, um die Ausgabe zu sehen.
Als nächstes können Sie zum Senden / erneuten Senden von Bestell-E-Mails einfach den Administrator anmelden. Für jede Bestellung gibt es die Schaltfläche E-Mail senden, die dieses Skript auslöst, und Sie können die neu geänderte Vorlage in derselben Datei sehen. Ich denke, dies ist eine der besten Möglichkeiten, um Bestellungen oder andere E-Mails zu sehen.
Bitte beachten Sie, dass Sie den hinzugefügten Code entfernen müssen, wenn Sie fertig sind.
Sie müssen den Code aktualisieren:
/app/code/core/Mage/Checkout/controllers/OnepageController.php
Update-Funktion:
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();
}
Einfach kommentieren:
//$session->clear();
Als weitere Antwortnotizen können Sie die Weiterleitung auskommentieren Magento\Checkout\Controller\Onepage\Success::execute
und das Laden der Checkout-Erfolgsseite erzwingen. Wenn der Block jedoch Magento\Checkout\Block\Onepage\Success
lädt, sind keine Bestelldaten vorhanden, da Magento\Checkout\Model\Session::getLastRealOrder
keine Bestellung zurückgegeben wird. Eine bessere Option wäre ein After Interceptor für die Execute-Methode der Controller-Klasse, für die Sie lastRealOrderId
in der Checkout-Sitzung einen Wert festlegen können .
Dieser Ansatz bietet auch die Möglichkeit, die checkout_onepage_controller_success_action
Veranstaltung mit Ihrer gewünschten Bestellung zu versenden . Das Ereignis wird die Beobachter Magento\GoogleAdwords\Observer\SetConversionValueObserver
und Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObserver
mit Ihren Testdaten auslösen .
Das Folgende ist ein ziemlich einfaches Modul, das den oben beschriebenen Interceptor erstellt und das Festlegen der Reihenfolge durch Anhängen eines order
Abfrageparameters mit der gewünschten Inkrement-ID an die URL der Erfolgsseite ermöglicht. Die Multishipping-Erfolgsroute funktioniert derzeit nicht. Es kann auf github heruntergeladen werden: 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 Im Folgenden werden Optionen für den Administratorbereich zum Aktivieren / Deaktivieren des Interceptors hinzugefügt.
<?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__
);