Magento 2 Dapatkan total pesanan di halaman sukses?

13

Saya mencoba mendapatkan total pesanan pada halaman sukses di magento 2, saya telah menambahkan kode ini

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

Tapi saya mendapatkan kesalahan ketika saya mencapai halaman sukses setelah saya melakukan pemesanan, saya kira kodenya berfungsi untuk magento 1 tetapi tidak 2. Bagaimana saya bisa membuatnya berfungsi juga di magento 2?

alexcr
sumber
Hai @ alexcr Anda menggunakan perintah Magento 1 untuk mendapatkan data. Masukkan saja kode di bawah ini untuk mendapatkan data pesanan di halaman sukses di 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
Periksa tautan ini codextblog.com/code-snippet/…
Saravanan DS

Jawaban:

24

Magento 2.1

Blok yang disebutkan di bawah sekarang Magento\Checkout\Block\Onepage\Success

Magento 2.0

Satu-satunya hal yang dapat Anda ambil secara asli di halaman ini adalah id pesanan menggunakan getRealOrderId()metode yang ditentukan dalamMagento\Checkout\Block\Success

Dengan demikian, untuk mendapatkan id pesanan Anda dapat memanggil yang berikut ini di templat Anda:

$block->getRealOrderId();

Namun, saya mengerti bukan itu yang Anda butuhkan.

Dalam hal ini, meskipun Anda bisa menggunakan manajer objek secara langsung, itu tidak dianjurkan. Anda harus menggunakan modul khusus untuk menentukan preferensi untuk blok ini .

Dalam app/code/Vendor/Module/etc/frontend/di.xmlAnda memerlukan kode berikut:

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

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

Jangan lupakan yang biasa 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>

Serta app/code/Vendor/Module/registration.php

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

Setelah selesai dan Anda telah menjalankan perintah berikut:

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

Anda harus dapat memanggil yang berikut ini di templat Anda:

$block->getGrandTotal();

Menambahkan lebih banyak metode

Anda dapat menambahkan berikut ini yang dapat berguna saat melacak ke kelas blok:

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

Maka Anda akan dapat memanggil yang berikut dari templat Anda:

$block->getSubtotal();
$block->getDiscountAmount();
Raphael di Digital Pianism
sumber
hai Raphel, saya baru saja mengambil referensi dari jawaban Anda.
Rakesh Jesadiya
2
@Rakesh Saya tidak punya masalah dengan Anda mereferensikan jawaban saya, kami di sini untuk belajar dan mengajar, tidak adil hanya menyalin / menempelkan jawaban yang dipilih karena Anda downvoted. Poster asli menerima jawaban asli Anda, yang berarti jawaban Anda benar dan berfungsi untuknya. Namun, seperti yang saya katakan dalam jawaban saya dan seperti yang dikatakan David Manners dalam komentar, itu tidak direkomendasikan dan harus dihindari kapan pun memungkinkan.
Raphael di Digital Pianism
@Rakesh, saya tidak bertanggung jawab atas upvotes dan downvotes. Dan salin / tempel jawaban orang lain tidak akan membantu Anda mendapatkan upvoted. Sekali lagi jawaban Anda benar untuk setiap pengguna, itu akan berfungsi di mana-mana tetapi tidak disarankan untuk menggunakan ObjectManager secara langsung. Kami di sini untuk belajar dan saya yakin Anda akan mencoba untuk menghindari menggunakan ObjectManager langsung di jawaban masa depan Anda
Raphael di Digital Pianism
1
Hai Raphael, jika contoh Anda tidak berfungsi dan app / code / Vendor / Module / Block / Checkout / Success.php tidak diberikan sama sekali (bahkan jika saya memasukkan mati () atau sintaks php ilegal), apakah itu berarti bahwa itu ditimpa di tempat lain? Saya menjalankan kompilasi ..
Claudiu Creanga
@ClaudiuCreanga bisa jadi. Terakhir kali saya menguji itu pada awal Magento 2.0 saya belum mencoba kode pada rilis 2.1 terbaru. Anda dapat menggunakan echo get_class($block);untuk memeriksa apakah override berfungsi tetapi jika blok tidak diberikan sama sekali itu mungkin tidak akan berhasil
Raphael di Digital Pianism
4

Buka saja Magento_Checkout/frontend/templates/success.phtml

Dan letakkan kode di bawah ini di File

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

Dalam kode di atas Anda akan mendapatkan semua data pesanan di halaman sukses.

Terima kasih

Nikul
sumber
1
Mengutip dokumentasi resmi: "Magento melarang penggunaan langsung ObjectManager dalam kode Anda karena itu menyembunyikan dependensi nyata suatu kelas. Lihat aturan penggunaan." devdocs.magento.com/guides/v2.1/extension-dev-guide/…
c.norin
2

Sejauh yang saya tahu, ada acara - checkout_onepage_controller_success_actionyang dipecat setelah Checkout satu halaman berhasil.

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

Seperti yang bisa kita lihat, kita bisa mendapatkan id pesanan dengan menggunakan Observer. Sebagai contoh:

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

Lihatlah modul google untuk lebih jelasnya:
vendor / magento / module-google-adwords
vendor / magento / module-google-analytics

Khoa TruongDinh
sumber
Saya suka ide menggunakan pengamat, namun cara Anda melakukannya agak tidak berguna karena sudah ada metode untuk mengambil id pesanan di blok (lihat jawaban saya).
Raphael di Digital Pianism