Magento 2 Gesamte Bestellung auf Erfolgsseite erhalten?

13

Ich versuche, die Gesamtsumme der Bestellung auf der Erfolgsseite von Magento 2 zu ermitteln. Ich habe diesen Code hinzugefügt

<?php
$order = Mage::getModel('sales/order')->loadByIncrementId($this->getOrderId());
$totall = $order->getGrandTotal();
?>

Aber ich erhalte eine Fehlermeldung, wenn ich nach der Bestellung die Erfolgsseite erreiche. Ich denke, der Code funktioniert für Magento 1, aber nicht für 2. Wie kann ich das auch für Magento 2 zum Laufen bringen?

alexcr
quelle
Hallo @alexcr, Sie verwenden den Befehl magento 1, um Daten abzurufen. Geben Sie einfach den folgenden Code ein, um die Bestelldaten auf der Erfolgsseite in magneto 2 abzurufen. $ ObjectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ orderData = $ objectManager-> create ('Magento \ Sales \ Model \ Order') -> loadByIncrementId ($ block-> getOrderId ()); echo "<pre>"; print_r ($ orderData-> getData ());
Nikul
Überprüfen Sie diesen Link codextblog.com/code-snippet/…
Saravanan DS

Antworten:

24

Magento 2.1

Der unten erwähnte Block ist jetzt Magento\Checkout\Block\Onepage\Success

Magento 2.0

Das einzige, was Sie auf dieser Seite nativ abrufen können, ist die Bestell-ID mit der in getRealOrderId()definierten MethodeMagento\Checkout\Block\Success

Um die Bestellnummer zu erhalten, können Sie in Ihrer Vorlage Folgendes aufrufen:

$block->getRealOrderId();

Ich verstehe jedoch, dass das nicht genau das ist, was Sie brauchen.

In diesem Fall allerdings wird davon abgeraten, den Objektmanager direkt zu verwenden. Sie sollten ein benutzerdefiniertes Modul verwenden, um Einstellungen für diesen Block zu definieren .

Im app/code/Vendor/Module/etc/frontend/di.xml benötigen Sie den folgenden Code:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Checkout\Block\Success"
                type="Vendor\Module\Block\Checkout\Success"/>
</config>

Dann in app/code/Vendor/Module/Block/Checkout/Success.php :

<?php
namespace Vendor\Module\Block\Checkout;

class Success extends \Magento\Checkout\Block\Success
{
    /**
     * @return int
     */
    public function getGrandTotal()
    {
        /** @var \Magento\Sales\Model\Order $order */
        $order = $this->_orderFactory->create()->load($this->getLastOrderId());
        return $order->getGrandTotal();
    }
}

Vergiss das Übliche nicht app/code/Vendor/Module/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="Vendor_Module" setup_version="0.0.1" />
</config>

Ebenso wie app/code/Vendor/Module/registration.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Vendor_Module',
    __DIR__
);

Sobald Sie fertig sind und die folgenden Befehle ausgeführt haben:

php bin/magento module:enable Vendor_Module
php bin/magento setup:upgrade

In Ihrer Vorlage sollten Sie Folgendes aufrufen können:

$block->getGrandTotal();

Weitere Methoden hinzufügen

Sie können Folgendes hinzufügen, das beim Verfolgen der Blockklasse hilfreich sein kann:

public function getSubtotal()
{
    /** @var \Magento\Sales\Model\Order $order */
    $order = $this->_orderFactory->create()->load($this->getLastOrderId());
    return $order->getSubtotal();
}

public function getDiscountAmount()
{
    /** @var \Magento\Sales\Model\Order $order */
    $order = $this->_orderFactory->create()->load($this->getLastOrderId());
    return $order->getDiscountAmount();
}

Dann können Sie aus Ihrer Vorlage Folgendes aufrufen:

$block->getSubtotal();
$block->getDiscountAmount();
Raphael bei Digital Pianism
quelle
Hallo Raphel, ich habe nur einen Hinweis auf deine Antwort genommen.
Rakesh Jesadiya
2
@Rakesh Ich habe kein Problem damit, dass Sie auf meine Antwort verweisen. Wir sind hier, um zu lernen und zu lehren. Es ist einfach nicht fair, die hochgeladene Antwort einfach zu kopieren / einzufügen, weil Sie heruntergestuft sind. Das Originalplakat hat Ihre ursprüngliche Antwort akzeptiert. Dies bedeutet, dass Ihre Antwort korrekt ist und für ihn funktioniert hat. Wie ich in meiner Antwort und in dem Kommentar von David Manners sagte, wird es jedoch nicht empfohlen und sollte nach Möglichkeit vermieden werden.
Raphael bei Digital Pianism
@Rakesh naja ich bin nicht verantwortlich für upvotes und downvotes. Und das Kopieren / Einfügen der Antworten anderer hilft Ihnen nicht, sich zu erheben. Auch hier ist Ihre Antwort für alle Benutzer korrekt. Sie funktioniert überall, es wird jedoch davon abgeraten, den ObjectManager direkt zu verwenden. Wir sind hier, um zu lernen, und ich bin sicher, dass Sie versuchen werden, den ObjectManager in Ihren zukünftigen Antworten nicht direkt zu verwenden
Raphael bei Digital Pianism
1
Hallo Raphael, wenn dein Beispiel nicht funktioniert und app / code / Vendor / Module / Block / Checkout / Success.php überhaupt nicht gerendert wird (auch wenn ich die () oder illegale PHP-Syntax einfüge), heißt das, dass es so ist wird woanders überschrieben? Ich führe die Kompilierung aus.
Claudiu Creanga
@ClaudiuCreanga könnte es sein. Als ich das letzte Mal getestet habe, dass es sich um Magento 2.0 handelt, habe ich den Code in den letzten 2.1-Versionen nicht ausprobiert. Sie können echo get_class($block);überprüfen, ob die Überschreibung funktioniert, aber wenn der Block überhaupt nicht gerendert wird, wird das wahrscheinlich nicht funktionieren
Raphael beim Digitalen Pianismus
4

Einfach offen Magento_Checkout/frontend/templates/success.phtml

Und fügen Sie den folgenden Code in die Datei ein

    $objectManager =  \Magento\Framework\App\ObjectManager::getInstance();
              $orderData = $objectManager->create('Magento\Sales\Model\Order')->loadByIncrementId($block->getOrderId());
echo "<pre>";print_r($orderData->getData());

Im obigen Code erhalten Sie alle Bestelldaten auf der Erfolgsseite.

Vielen Dank

Nikul
quelle
1
Zitieren der offiziellen Dokumentation: "Magento verbietet die direkte Verwendung des ObjectManager in Ihrem Code, da die tatsächlichen Abhängigkeiten einer Klasse ausgeblendet werden. Siehe Verwendungsregeln." devdocs.magento.com/guides/v2.1/extension-dev-guide/…
c.norin
2

Soweit ich weiß, gibt es ein Ereignis - checkout_onepage_controller_success_actiondas nach dem Checkout ausgelöst wird, ist eine Seite erfolgreich.

Anbieter / Magento / Modul-Checkout / Controller / Onepage / Success.php

public function execute()
{
    $session = $this->getOnepage()->getCheckout();
    if (!$this->_objectManager->get('Magento\Checkout\Model\Session\SuccessValidator')->isValid()) {
        return $this->resultRedirectFactory->create()->setPath('checkout/cart');
    }
    $session->clearQuote();
    //@todo: Refactor it to match CQRS
    $resultPage = $this->resultPageFactory->create();
    $this->_eventManager->dispatch(
        'checkout_onepage_controller_success_action',
        ['order_ids' => [$session->getLastOrderId()]]
    );
    return $resultPage;
}

Wie wir sehen können, können wir die Bestellnummer mit Observer ermitteln. Beispielsweise:

public function execute(\Magento\Framework\Event\Observer $observer)
{

    $orderIds = $observer->getEvent()->getOrderIds();
    if (empty($orderIds) || !is_array($orderIds)) {
        return $this;
    }

    //.......

    $block = $this->_layout->getBlock('your_block_here');
    if ($block) {
        $block->setOrderIds($orderIds);
    }
}

Weitere Informationen finden Sie in den Google-Modulen:
Anbieter / Magento / Modul-Google-AdWords
Anbieter / Magento / Modul-Google-Analytics

Khoa TruongDinh
quelle
Ich mag die Idee, einen Beobachter zu verwenden, aber die Art und Weise, wie Sie es tun, ist irgendwie nutzlos, weil es bereits eine Methode gibt, um die Bestell-ID im Block abzurufen (siehe meine Antwort).
Raphael bei Digital Pianism