Magento 2 সাফল্যের পৃষ্ঠায় মোট অর্ডার পান?


13

আমি ম্যাজেন্টো 2 তে সাফল্যের পৃষ্ঠায় অর্ডারটি মোট পাওয়ার চেষ্টা করছি, আমি এই কোডটি যুক্ত করেছি

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

আমি অর্ডার দেওয়ার পরে আমি যখন সাফল্যের পৃষ্ঠায় পৌঁছাচ্ছি তখন আমি একটি ত্রুটি পেয়েছি, আমি অনুমান করি কোডটি ম্যাজেন্টো 1 এর জন্য কাজ করে তবে 2 নয় ma আমি ম্যাজেন্টো 2 তেও এই কাজটি কীভাবে পেতে পারি?


হাই @alexcr আপনি ডেটা পেতে ম্যাজেন্টো 1 কমান্ড ব্যবহার করেন। ম্যাগনেটো ২. সাফল্যের পৃষ্ঠায় অর্ডার ডেটা পেতে কোডের নীচে রাখুন $ অবজেক্টম্যানেজার = \ ম্যাজেন্টো \ ফ্রেমওয়ার্ক \ অ্যাপ \ অবজেক্টম্যানেজার :: getInstance (); $ অর্ডারডাটা = $ অবজেক্ট ম্যানেজার-> তৈরি করুন ('ম্যাজেন্টো \ বিক্রয় \ মডেল \ অর্ডার') -> লোডবাইক্রেনমেন্টআইডি ($ ব্লক-> getOrderId ()); প্রতিধ্বনি "<pre>"; মুদ্রণ_আর ($ অর্ডারডাটা-> getData ());
নিকুল

উত্তর:


25

ম্যাজেন্টো 2.1

নীচে উল্লিখিত ব্লকটি এখন Magento\Checkout\Block\Onepage\Success

ম্যাজেন্টো ২.০

আপনি কেবলমাত্র এই পৃষ্ঠায় স্থানীয়ভাবে পুনরুদ্ধার করতে পারবেন সেটি হ'ল 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
@ রাকেশ আপনার আমার উত্তর উল্লেখ করতে আমার কোন সমস্যা নেই, আমরা এখানে শিখতে এবং শেখাতে এসেছি, আপনি উত্সাহিত হওয়ার কারণে কেবলমাত্র উর্ধ্বতন উত্তর অনুলিপি / পেস্ট করা ঠিক হবে না। আসল পোস্টারটি আপনার মূল উত্তরটি গ্রহণ করেছে, যার অর্থ আপনার উত্তরটি সঠিক এবং তার জন্য কাজ করেছে। যাইহোক, আমি আমার উত্তরে এবং ডেভিড ম্যানার্স মন্তব্যে যেমন বলেছি, এটি প্রস্তাবিত নয় এবং যখনই সম্ভব এটি এড়ানো উচিত।
রাফেল ডিজিটাল পিয়ানোজমে

@ রাকেশ ভাল, আমি উর্ধ্বগামী এবং ডাউনভোটগুলির জন্য দায়বদ্ধ নই। এবং অন্যের উত্তরগুলি অনুলিপি / আটকানো আপনাকে উত্সাহিত করতে সহায়তা করবে না। আবার আপনার উত্তর প্রতিটি ব্যবহারকারীর জন্য সঠিক, এটি সর্বত্র কাজ করবে তবে অবজেক্টম্যানেজারটি সরাসরি ব্যবহার করতে নিরুৎসাহিত করা হবে। আমরা এখানে শিখতে এসেছি এবং আমি নিশ্চিত যে আপনি নিজের ভবিষ্যতের উত্তরগুলিতে সরাসরি অবজেক্টম্যানেজারটি এড়িয়ে চলার চেষ্টা করবেন
ডিজিটাল পিয়ানিজমে রাফেল

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
অফিসিয়াল ডকুমেন্টেশনের উদ্ধৃতি দিয়ে: "ম্যাজেন্টো আপনার কোডে অবজেক্টম্যানেজারের সরাসরি ব্যবহার নিষিদ্ধ করেছে কারণ এটি কোনও শ্রেণীর আসল নির্ভরতা লুকিয়ে রাখে। ব্যবহারের বিধিগুলি দেখুন।" devdocs.magento.com/guides/v2.1/Existance-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);
    }
}

আরও তথ্যের জন্য গুগল মডিউলগুলি একবার দেখুন:
বিক্রেতা / ম্যাজেন্টো / মডিউল-গুগল-
অ্যাডওয়ার্ডস বিক্রেতা / ম্যাজেন্টো / মডিউল-গুগল-অ্যানালিটিকস


আমি একটি পর্যবেক্ষক ব্যবহার করার ধারণাটি পছন্দ করি, তবে আপনি যেভাবে এটি করছেন তা এক ধরণের অকেজো কারণ ব্লকের অর্ডার আইডি পুনরুদ্ধার করার জন্য ইতিমধ্যে একটি পদ্ধতি রয়েছে (আমার উত্তর দেখুন)।
রাফেল ডিজিটাল পিয়ানোজমে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.