Magento 2 Nhận tổng số đơn hàng trên trang thành công?


13

Tôi đang cố gắng để có được tổng số đơn đặt hàng trên trang thành công trên magento 2, tôi đã thêm mã này

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

Nhưng tôi gặp lỗi khi tôi truy cập trang thành công sau khi tôi đặt hàng, tôi đoán mã này hoạt động cho magento 1 nhưng không phải 2. Làm cách nào tôi có thể làm việc này trên magento 2?


Xin chào @alexcr bạn sử dụng lệnh magento 1 để lấy dữ liệu. Chỉ cần đặt mã bên dưới để nhận dữ liệu đơn hàng trong trang thành công trong Magneto 2. $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ orderData = $ objectManager-> tạo ('Magento \ Sales \ Model \ Order') -> loadByIncrementId ($ block-> getOrderId ()); tiếng vang "<pre>"; print_r ($ orderData-> getData ());
Nikul

Kiểm tra liên kết này codextblog.com/code-snippet/ Kẻ
Saravanan DS

Câu trả lời:


24

Magento 2.1

Các khối được đề cập dưới đây là bây giờ Magento\Checkout\Block\Onepage\Success

Magento 2.0

Điều duy nhất bạn có thể truy xuất tự nhiên trên trang này là id thứ tự sử dụng getRealOrderId()phương thức được xác định trongMagento\Checkout\Block\Success

Vì vậy, để có được id đơn hàng, bạn có thể gọi như sau trong mẫu của mình:

$block->getRealOrderId();

Tuy nhiên, tôi hiểu đó không chính xác là những gì bạn cần.

Trong trường hợp đó, mặc dù bạn có thể sử dụng trình quản lý đối tượng trực tiếp, nhưng điều đó không được khuyến khích. Bạn nên sử dụng một mô-đun tùy chỉnh để xác định các tiền đề cho khối này .

Trong app/code/Vendor/Module/etc/frontend/di.xmlbạn cần mã sau đây:

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

Sau đó trong 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();
    }
}

Đừng quên thông thường 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>

Cũng như app/code/Vendor/Module/registration.php

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

Khi bạn đã hoàn tất và bạn đã chạy các lệnh sau:

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

Bạn sẽ có thể gọi như sau trong mẫu của bạn:

$block->getGrandTotal();

Thêm nhiều phương thức

Bạn có thể thêm các mục sau có thể hữu ích khi theo dõi vào lớp khối:

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

Sau đó, bạn sẽ có thể gọi như sau từ mẫu của bạn:

$block->getSubtotal();
$block->getDiscountAmount();

xin chào Raprc, tôi chỉ lấy tham khảo từ câu trả lời của bạn.
Rakesh Jesadiya

2
@Rakesh Tôi không có vấn đề gì với bạn khi tham khảo câu trả lời của tôi, chúng tôi ở đây để học và dạy, thật không công bằng khi chỉ đơn giản là sao chép / dán câu trả lời bị bỏ qua vì bạn bị từ chối. Các poster ban đầu chấp nhận câu trả lời ban đầu của bạn, có nghĩa là câu trả lời của bạn là chính xác và làm việc cho anh ta. Tuy nhiên, như tôi đã nói trong câu trả lời của mình và như David Manners đã nói trong bình luận, điều đó không được khuyến khích và nên tránh bất cứ khi nào có thể.
Raphael tại Nghệ thuật piano kỹ thuật số

@Rakesh tốt Tôi không chịu trách nhiệm cho upvote và downvote. Và sao chép / dán câu trả lời của người khác sẽ không giúp bạn được nâng cao. Một lần nữa, câu trả lời của bạn là chính xác cho mọi người dùng, nó sẽ hoạt động ở mọi nơi nhưng không khuyến khích sử dụng ObjectManager trực tiếp. Chúng tôi ở đây để tìm hiểu và tôi chắc chắn rằng bạn sẽ cố gắng tránh sử dụng ObjectManager trực tiếp trong các câu trả lời trong tương lai của mình
Raphael tại Digital Pianism

1
Xin chào Raphael, nếu ví dụ của bạn không hoạt động và ứng dụng / mã / Nhà cung cấp / Mô-đun / Chặn / Checkout / Thành công.php hoàn toàn không được hiển thị (ngay cả khi tôi chèn die () hoặc cú pháp php bất hợp pháp), điều đó có nghĩa là nó được ghi đè ở một nơi khác? Tôi chạy phần biên dịch ..
Claudiu Creanga

@ClaudiuCreanga nó có thể. Lần trước tôi đã thử nghiệm trên Magento 2.0 đầu tiên, tôi đã không thử mã trên các bản phát hành 2.1 mới nhất. Bạn có thể sử dụng echo get_class($block);để kiểm tra xem ghi đè có hoạt động không nhưng nếu khối đó không được hiển thị thì có lẽ điều đó sẽ không hoạt động
Raphael tại Digital Pianism

4

Chỉ cần mở Magento_Checkout/frontend/templates/success.phtml

Và đặt mã dưới đây vào File

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

Trong mã trên, bạn sẽ nhận được tất cả dữ liệu đặt hàng trong trang thành công.

Cảm ơn


1
Trích dẫn tài liệu chính thức: "Magento cấm sử dụng trực tiếp ObjectManager trong mã của bạn vì nó ẩn các phụ thuộc thực sự của một lớp. Xem quy tắc sử dụng." devdocs.magento.com/guides/v2.1/extension-dev-guide/ tôn
c.norin

2

Theo tôi biết, có một sự kiện - checkout_onepage_controller_success_actionđược tổ chức sau khi một trang của Checkout thành công.

nhà cung cấp / magento / kiểm tra mô-đun / Trình điều khiển / Onepage / Thành công.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;
}

Như chúng ta có thể thấy, chúng ta có thể nhận được id thứ tự bằng cách sử dụng Observer. Ví dụ:

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

Hãy xem các mô-đun google để biết thêm chi tiết:
nhà cung cấp / magento / mô-đun- nhà cung cấp google-adwords
/ magento / mô-đun-google-phân tích


Tôi thích ý tưởng sử dụng một người quan sát, tuy nhiên cách bạn thực hiện nó là vô ích vì đã có một phương pháp để lấy id thứ tự trong khối (xem câu trả lời của tôi).
Raphael tại Nghệ thuật piano kỹ thuật số
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.