Magento 2 सफलता पृष्ठ पर कुल आदेश प्राप्त करें?


13

मैं Magento 2 पर सफलता पृष्ठ पर कुल आदेश प्राप्त करने की कोशिश कर रहा हूं, मैंने यह कोड जोड़ा है

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

लेकिन मुझे एक त्रुटि हो रही है जब मैं एक आदेश देने के बाद सफलता के पृष्ठ पर पहुंचता हूं, मुझे लगता है कि कोड मैगेंटो 1 के लिए काम करता है, लेकिन 2. नहीं। मैं कैसे इस काम को मैगेंटो 2 पर भी प्राप्त कर सकता हूं?


हाय @alexcr आप डेटा प्राप्त करने के लिए magento 1 कमांड का उपयोग करते हैं। नीचे दिए गए कोड को मैग्नेटो में सफलता पृष्ठ में ऑर्डर डेटा प्राप्त करने के लिए नीचे रखा गया है। $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ ऑर्डरडेटा = $ ऑब्जेक्ट मैनजर-> क्रिएट ('मैगेंटो \ सेल्स \ मॉडल \ ऑर्डर') -> लोडबाइक इन्क्रिमेंटआईडी ($ ब्लॉक-> getOrderId ()); इको "<प्री>"; प्रिंट_आर ($ ऑर्डरडैट-> गेटडाटा ());
निकुल

इस लिंक की जाँच करें 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();

हालाँकि, मैं समझता हूँ कि वास्तव में आपको इसकी आवश्यकता नहीं है।

उस स्थिति में, भले ही आप ऑब्जेक्ट प्रबंधक को सीधे उपयोग कर सकते हों, यह अनुशंसित नहीं है। इस ब्लॉक के लिए पूर्वनिर्धारण को परिभाषित करने के लिए आपको एक कस्टम मॉड्यूल का उपयोग करना चाहिए

में 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();

हाय राफेल, मैंने तुम्हारे उत्तर से सिर्फ संदर्भ लिया है।
राकेश जेसादिया

2
@ राकेश मुझे आपको मेरे उत्तर का संदर्भ देने में कोई समस्या नहीं है, हम यहाँ सीखने और सिखाने के लिए हैं, यह केवल उचित उत्तर को कॉपी / पेस्ट करने के लिए उचित नहीं है क्योंकि आप अस्वीकृत हैं। मूल पोस्टर ने आपके मूल उत्तर को स्वीकार कर लिया, जिसका अर्थ है कि आपका उत्तर सही है और उसके लिए काम किया है। हालांकि, जैसा कि मैंने अपने जवाब में कहा था और जैसा कि डेविड मैनर्स ने टिप्पणी में कहा है, यह अनुशंसित नहीं है और जब भी संभव हो इसे टाला जाना चाहिए।
राफेल डिजिटल पियानोवाद

@ राकेश अच्छी तरह से मैं upvotes और downvotes के लिए जिम्मेदार नहीं हूँ। और दूसरे के उत्तरों को कॉपी / पेस्ट करना आपके उत्थान में मदद नहीं करेगा। फिर से आपका जवाब हर उपयोगकर्ता के लिए सही है, यह हर जगह काम करेगा लेकिन यह सीधे ObjectManager का उपयोग करने के लिए हतोत्साहित है। हम यहां सीख रहे हैं और मुझे यकीन है कि आप अपने भविष्य के जवाबों में सीधे
ObjectManager

1
हाय राफेल, अगर आपका उदाहरण काम नहीं करता है और ऐप / कोड / वेंडर / मॉड्यूल / ब्लॉक / चेकआउट / सफ़लता। एफपी बिल्कुल भी प्रदान नहीं किया जाता है (भले ही मैं मरता हूं () या अवैध php वाक्यविन्यास सम्मिलित करता हूं), क्या इसका मतलब यह है कि यह कहीं और लिखित है? मैं संकलन चलाता हूं ..
क्लॉडिउ क्रेगना

@ कलौड़ीउरंगना यह हो सकता है। पिछली बार जब मैंने परीक्षण किया था कि मैगेंटो 2.0 जल्दी था। मैंने नवीनतम 2.1 रिलीज पर कोड की कोशिश नहीं की है। आप यह echo get_class($block);जांचने के लिए उपयोग कर सकते हैं कि क्या ओवरराइड काम करता है, लेकिन अगर ब्लॉक बिल्कुल भी प्रदान नहीं किया गया है तो शायद वह काम नहीं करेगा
राफेल डिजिटल पियानिज़्म में

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
आधिकारिक दस्तावेज का हवाला देते हुए: "Magento आपके कोड में ObjectManager के प्रत्यक्ष उपयोग को प्रतिबंधित करता है क्योंकि यह एक वर्ग की वास्तविक निर्भरता को छुपाता है। उपयोग के नियम देखें।" devdocs.magento.com/guides/v2.1/extension-dev-guide/…
c.norin

2

जहां तक ​​मुझे पता है, एक घटना है - checkout_onepage_controller_success_actionजिसे चेकआउट के बाद निकाल दिया जाता है, एक पृष्ठ सफलतापूर्वक है।

विक्रेता / Magento / मॉड्यूल-चेकआउट / नियंत्रक / 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;
}

जैसा कि हम देख सकते हैं, हम ऑब्जर्वर का उपयोग करके ऑर्डर आईडी प्राप्त कर सकते हैं। उदाहरण के लिए:

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 / मॉड्यूल-गूगल-ऐडवर्ड्स
विक्रेता / magento / मॉड्यूल-गूगल-भौतिकी


मुझे एक पर्यवेक्षक का उपयोग करने का विचार पसंद है, हालांकि जिस तरह से आप इसे कर रहे हैं वह बेकार है क्योंकि ब्लॉक में ऑर्डर आईडी प्राप्त करने के लिए पहले से ही एक विधि है (मेरा उत्तर देखें)।
राफेल डिजिटल पियानोवाद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.