Wie teste oder gestalte ich die Seite mit dem Auftragserfolg?

114

Wenn ich die checkout/onepage/successSeite 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?

Alex
quelle
2
Diese Frage hat vielfältige Antworten hervorgebracht, die alle voller "Gewinne" sind. Wer hierher kommt, sollte alle Antworten lesen.
Chris K

Antworten:

149

Sie können den Core vorübergehend hacken, während Sie sich entwickeln:

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

Alex
quelle
Behebt das dein Problem? Bitte markieren Sie es als Lösung.
Fabian Blechschmidt
3
Ich habe sowohl den Yireo Checkout-Tester von Jisse Reitsma als auch diese Methode getestet. Obwohl das Modul der einfachste Weg ist, habe ich festgestellt, dass es nicht zu 100% mit unserem Design- und Zahlungsmodul kompatibel ist, was zu einem anderen Design als die ursprüngliche Erfolgsseite führt. Diese Methode musste zwar den Kern modifizieren, funktionierte aber wie ein Zauber. Hinweis: In der Antwort fehlt die zu bearbeitende Datei /app/code/core/Mage/Checkout/controllers/OnepageController.php
Ottonet
Für Leute, die dasselbe in M2 machen möchten, können Sie die Zeilen 19 bis 22 in\vendor\magento\module-checkout\Controller\Onepage\Success.php
Dynomite
24

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();
    }
blakcaps
quelle
3
Aber dann $lastOrderIdist nicht definiert, was zu einer Kündigung führen würde und zu Nebenwirkungen in der Vorlage führen könnte.
Alex
1
Ich hatte Erfolg, nur indem ich $ session-> clear () auskommentierte; Das Einzige, was ich verliere, sind über den Beobachter hinzugefügte Benachrichtigungen / Nachrichten wie TBT / Belohnungsbenachrichtigungen / Nachrichten. Lassen Sie den Code in einem Überschreibungsmodul, das .gitignored ist, also nie bereitgestellt.
Barry Carlyon
19

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

Jisse Reitsma
quelle
4

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.

Farzan Balkani
quelle
4

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.

Nikul
quelle
3

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.

Subesh Pokhrel
quelle
1

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

Magento 2

Als weitere Antwortnotizen können Sie die Weiterleitung auskommentieren Magento\Checkout\Controller\Onepage\Success::executeund das Laden der Checkout-Erfolgsseite erzwingen. Wenn der Block jedoch Magento\Checkout\Block\Onepage\Successlädt, sind keine Bestelldaten vorhanden, da Magento\Checkout\Model\Session::getLastRealOrderkeine Bestellung zurückgegeben wird. Eine bessere Option wäre ein After Interceptor für die Execute-Methode der Controller-Klasse, für die Sie lastRealOrderIdin der Checkout-Sitzung einen Wert festlegen können .

Dieser Ansatz bietet auch die Möglichkeit, die checkout_onepage_controller_success_actionVeranstaltung mit Ihrer gewünschten Bestellung zu versenden . Das Ereignis wird die Beobachter Magento\GoogleAdwords\Observer\SetConversionValueObserverund Magento\GoogleAnalytics\Observer\SetGoogleAnalyticsOnOrderSuccessPageViewObservermit 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 orderAbfrageparameters 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__
);
Pmclain
quelle