Magento 2 รับผลรวมการสั่งซื้อในหน้าสำเร็จหรือไม่


13

ฉันพยายามที่จะรับผลรวมการสั่งซื้อในหน้าความสำเร็จใน magento 2 ฉันได้เพิ่มรหัสนี้

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

แต่ฉันได้รับข้อผิดพลาดเมื่อฉันไปถึงหน้าความสำเร็จหลังจากที่ฉันสั่งซื้อฉันเดาว่ารหัสนี้ใช้ได้กับวีโอไอพี 1 แต่ไม่ใช่ 2 ฉันจะทำงานนี้ในวีโอไอพี 2 ได้อย่างไร


สวัสดี @alexcr คุณใช้คำสั่ง magento 1 เพื่อรับข้อมูล เพียงแค่ใส่รหัสด้านล่างเพื่อรับข้อมูลการสั่งซื้อในหน้าความสำเร็จใน 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

ตรวจสอบลิงค์นี้codextblog.com/code-snippet/ …
Saravanan DS

คำตอบ:


25

Magento 2.1

บล็อกที่กล่าวถึงด้านล่างคือตอนนี้ Magento\Checkout\Block\Onepage\Success

Magento 2.0

สิ่งเดียวที่คุณสามารถเรียกคืนได้ในหน้านี้คือรหัสคำสั่งซื้อโดยใช้getRealOrderId()วิธีที่กำหนดไว้Magento\Checkout\Block\Success

ดังนั้นในการรับรหัสคำสั่งซื้อคุณสามารถเรียกสิ่งต่อไปนี้ในแม่แบบของคุณ:

$block->getRealOrderId();

อย่างไรก็ตามฉันเข้าใจว่านั่นไม่ใช่สิ่งที่คุณต้องการ

ในกรณีนี้แม้ว่าคุณจะสามารถใช้ตัวจัดการวัตถุโดยตรงได้ แต่ก็ไม่แนะนำ คุณควรใช้โมดูลที่กำหนดเองเพื่อกำหนด prefences สำหรับบล็อกนี้

ในapp/code/Vendor/Module/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">
    <preference for="Magento\Checkout\Block\Success"
                type="Vendor\Module\Block\Checkout\Success"/>
</config>

จากนั้นใน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();
    }
}

อย่าลืมเรื่องปกติ 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>

เช่นเดียวกับ app/code/Vendor/Module/registration.php

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

เมื่อเสร็จแล้วและคุณได้รันคำสั่งต่อไปนี้:

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

คุณควรจะสามารถเรียกสิ่งต่อไปนี้ในแม่แบบของคุณ:

$block->getGrandTotal();

การเพิ่มวิธีการเพิ่มเติม

คุณสามารถเพิ่มสิ่งต่อไปนี้ซึ่งมีประโยชน์เมื่อติดตามไปยังคลาสบล็อก:

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

จากนั้นคุณจะสามารถเรียกสิ่งต่อไปนี้จากเทมเพลตของคุณ:

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

สวัสดี Raphel ฉันแค่อ้างอิงจากคำตอบของคุณ
Rakesh Jesadiya

2
@Rakesh ฉันไม่มีปัญหากับการอ้างอิงคำตอบของฉันเราอยู่ที่นี่เพื่อเรียนรู้และสอนมันไม่ยุติธรรมเลยที่จะคัดลอก / วางคำตอบ upvoted เพราะคุณเป็นผู้ลงคะแนน โปสเตอร์ต้นฉบับยอมรับคำตอบดั้งเดิมของคุณซึ่งหมายความว่าคำตอบของคุณถูกต้องและใช้ได้กับเขา อย่างไรก็ตามอย่างที่ฉันพูดในคำตอบของฉันและอย่างที่ David Manners กล่าวไว้ในความคิดเห็นไม่แนะนำให้ทำและควรหลีกเลี่ยงเมื่อเป็นไปได้
ราฟาเอลที่ Pianism ดิจิตอล

@Rakesh ดีฉันจะไม่รับผิดชอบ upvotes และ downvote และคัดลอก / วางคำตอบของผู้อื่นจะไม่ช่วยให้คุณ upvoted อีกครั้งคำตอบของคุณถูกต้องสำหรับผู้ใช้ทุกคนมันจะทำงานได้ทุกที่ แต่ไม่แนะนำให้ใช้ ObjectManager โดยตรง เรามาที่นี่เพื่อเรียนรู้และฉันแน่ใจว่าคุณจะพยายามหลีกเลี่ยงการใช้ ObjectManager โดยตรงกับคำตอบในอนาคตของคุณ
Raphael at Digital Pianism

1
สวัสดีราฟาเอลถ้าตัวอย่างของคุณใช้งานไม่ได้และแอพ / รหัส / ผู้ขาย / โมดูล / บล็อก / ชำระเงิน / Success.php ไม่ได้แสดงผลเลย (แม้ว่าฉันจะแทรก die () หรือไวยากรณ์ php ผิดกฎหมาย) หมายความว่ามัน ถูกเขียนทับที่อื่นไหม ฉันใช้งานคอมไพล์ ..
Claudiu Creanga

@ClaudiuCreanga มันอาจจะเป็น ครั้งล่าสุดที่ฉันทดสอบที่อยู่ในช่วงต้น Magento 2.0 ฉันไม่ได้ลองใช้รหัสในเวอร์ชัน 2.1 ล่าสุด คุณสามารถใช้echo get_class($block);เพื่อตรวจสอบว่าการแทนที่ใช้งานได้หรือไม่ แต่ถ้าบล็อกนั้นไม่แสดงผลซึ่งอาจไม่ได้ผล
Raphael ที่ Digital Pianism

4

เพียงแค่เปิด Magento_Checkout/frontend/templates/success.phtml

และใส่รหัสด้านล่างในไฟล์

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

ในโค้ดด้านบนคุณจะได้รับข้อมูลการสั่งซื้อทั้งหมดในหน้าความสำเร็จ

ขอบคุณ


1
อ้างถึงเอกสารอย่างเป็นทางการ: "วีโอไอพีห้ามใช้ ObjectManager โดยตรงในรหัสของคุณเพราะมันซ่อนการอ้างอิงที่แท้จริงของคลาสดูกฎการใช้งาน" devdocs.magento.com/guides/v2.1/extension-dev-guide/ ......
c.norin

2

เท่าที่ฉันรู้มีเหตุการณ์ - checkout_onepage_controller_success_actionซึ่งถูกไล่ออกหลังจากชำระเงินหนึ่งหน้าสำเร็จ

ผู้ขาย / วีโอไอพี / โมดูลเช็คเอาต์ / ควบคุม / 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;
}

อย่างที่เราเห็นเราสามารถรับรหัสการสั่งซื้อโดยใช้ Observer ตัวอย่างเช่น:

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

ดูรายละเอียดเพิ่มเติมที่โมดูล google:
ผู้ขาย / magento / module-google-adwords
ผู้จำหน่าย / magento / module-google-analytics


ฉันชอบความคิดในการใช้ผู้สังเกตการณ์ แต่วิธีการที่คุณกำลังทำนั้นเป็นสิ่งที่ไร้ประโยชน์เพราะมีวิธีการรับรหัสคำสั่งซื้อในบล็อกอยู่แล้ว (ดูคำตอบของฉัน)
ราฟาเอลที่ Pianism ดิจิตอล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.