Magento 2 Uzyskaj sumę zamówienia na stronie sukcesu?

13

Próbuję uzyskać sumę zamówienia na stronie sukcesu na Magento 2, dodałem ten kod

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

Ale pojawia się błąd, gdy po złożeniu zamówienia docieram do strony sukcesu, myślę, że kod działa dla Magento 1, ale nie 2. W jaki sposób mogę uzyskać to działające również w Magento 2?

alexcr
źródło
Cześć @alexcr, używasz polecenia magento 1, aby uzyskać dane. Wystarczy umieścić poniższy kod, aby uzyskać dane zamówienia na stronie sukcesu w magneto 2. $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ orderData = $ objectManager-> create ('Magento \ Sales \ Model \ Order') -> loadByIncrementId ($ block-> getOrderId ()); echo "<pre>"; print_r ($ orderData-> getData ());
Nikul
Sprawdź ten link codextblog.com/code-snippet/…
Saravanan DS

Odpowiedzi:

25

Magento 2.1

Blok wymieniony poniżej jest teraz Magento\Checkout\Block\Onepage\Success

Magento 2.0

Jedyną rzeczą, którą możesz pobrać natywnie na tej stronie, jest identyfikator zamówienia przy użyciu getRealOrderId()metody zdefiniowanej wMagento\Checkout\Block\Success

Tak więc, aby uzyskać identyfikator zamówienia, możesz wywołać następujące elementy w swoim szablonie:

$block->getRealOrderId();

Rozumiem jednak, że nie jest to dokładnie to, czego potrzebujesz.

W takim przypadku, nawet jeśli można bezpośrednio użyć menedżera obiektów, nie jest to zalecane. Należy użyć niestandardowego modułu do zdefiniowania preferencji dla tego bloku .

W app/code/Vendor/Module/etc/frontend/di.xmlpotrzebujesz następujący kod:

<?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>

Następnie w 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();
    }
}

Nie zapomnij o zwykłym 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>

Tak dobrze jak app/code/Vendor/Module/registration.php

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

Po zakończeniu i uruchomieniu następujących poleceń:

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

W szablonie powinno być możliwe wywoływanie następujących elementów:

$block->getGrandTotal();

Dodając więcej metod

Możesz dodać następujące elementy, które mogą być przydatne podczas śledzenia do klasy bloku:

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

Następnie będziesz mógł wywoływać następujące elementy ze swojego szablonu:

$block->getSubtotal();
$block->getDiscountAmount();
Raphael at Digital Pianism
źródło
cześć Raphel, mam tylko odniesienie od twojej odpowiedzi.
Rakesh Jesadiya
2
@Rakesh Nie mam problemu z odesłaniem do mojej odpowiedzi, jesteśmy tutaj, aby się uczyć i uczyć, po prostu nie jest sprawiedliwe, aby po prostu skopiować / wkleić odpowiedź, ponieważ jest się ocenionym. Oryginalny plakat zaakceptował twoją oryginalną odpowiedź, co oznacza, że ​​twoja odpowiedź jest poprawna i działał dla niego. Jednak, jak powiedziałem w mojej odpowiedzi i jak powiedział David Manners w komentarzu, nie jest to zalecane i należy go unikać, gdy tylko jest to możliwe.
Raphael w Digital Pianism
@ Rakesh cóż, nie jestem odpowiedzialny za przegłosowania i przegłosowanie. A kopiowanie / wklejanie odpowiedzi innych nie pomoże ci uzyskać pozytywnej opinii. Ponownie twoja odpowiedź jest poprawna dla każdego użytkownika, będzie działać wszędzie, ale odradza się bezpośrednie korzystanie z ObjectManager. Jesteśmy tutaj, aby się uczyć i jestem pewien, że spróbujesz uniknąć używania ObjectManagera bezpośrednio w swoich przyszłych odpowiedziach
Raphael w Digital Pianism
1
Cześć Raphael, jeśli twój przykład nie działa i aplikacja / kod / Dostawca / Moduł / Blok / Kasa / Sukces.php nie jest w ogóle renderowany (nawet jeśli wstawię die () lub nielegalną składnię php), czy to znaczy, że jest nadpisany gdzieś indziej? Uruchamiam kompilację ..
Claudiu Creanga
@ClaudiuCreanga może być. Ostatnim razem, gdy testowałem to na wczesnym Magento 2.0, nie wypróbowałem kodu w najnowszych wydaniach 2.1. Możesz użyć, echo get_class($block);aby sprawdzić, czy zastąpienie działa, ale jeśli blok nie jest w ogóle renderowany, to prawdopodobnie nie zadziała
Raphael z Digital Pianism
4

Po prostu otwórz Magento_Checkout/frontend/templates/success.phtml

I umieść poniżej kodu w pliku

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

W powyższym kodzie otrzymasz wszystkie dane zamówienia na stronie sukcesu.

Dzięki

Nikul
źródło
1
Powołując się na oficjalną dokumentację: „Magento zabrania bezpośredniego używania ObjectManager w twoim kodzie, ponieważ ukrywa prawdziwe zależności klasy. Zobacz zasady użytkowania”. devdocs.magento.com/guides/v2.1/extension-dev-guide/…
c.norin
2

O ile mi wiadomo, istnieje zdarzenie - checkout_onepage_controller_success_actionktóre jest uruchamiane po pomyślnym zakończeniu transakcji przez jedną stronę.

vendor / magento / module-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;
}

Jak widzimy, możemy uzyskać identyfikator zamówienia za pomocą Observera. Na przykład:

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

Więcej informacji na temat modułów Google:
vendor / magento / module-google-adwords
vendor / magento / module-google-analytics

Khoa TruongDinh
źródło
Podoba mi się pomysł użycia obserwatora, jednak sposób, w jaki to robisz, jest dość bezużyteczny, ponieważ istnieje już metoda odzyskania identyfikatora zamówienia w bloku (patrz moja odpowiedź).
Raphael w Digital Pianism