Magento 2成功ページで注文合計を取得しますか?


13

magento 2の成功ページで注文合計を取得しようとしていますが、このコードを追加しました

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

しかし、注文後に成功ページに到達するとエラーが発生します。コードはmagento 1で機能しますが、2では機能しないと思います。これをmagento 2でも機能させるにはどうすればよいですか?


こんにちは@alexcr magento 1コマンドを使用してデータを取得します。Magnet 2の成功ページで注文データを取得するためのコードを以下に配置してください。$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance(); $ orderData = $ objectManager-> create( 'Magento \ Sales \ Model \ Order')-> loadByIncrementId($ block-> getOrderId()); echo "<pre>"; print_r($ orderData-> getData());
ニクル

このリンクをチェックcodextblog.com/code-snippet/...
Saravanan DS

回答:


24

Magento 2.1

下記のブロックは現在 Magento\Checkout\Block\Onepage\Success

Magento 2.0

このページでネイティブに取得できる唯一のものは、でgetRealOrderId()定義されたメソッドを使用した注文ID ですMagento\Checkout\Block\Success

したがって、注文IDを取得するには、テンプレートで次を呼び出すことができます。

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

こんにちはRaphel、私はあなたの答えから参照を取りました。
ラケシュジェサディヤ16年

2
@Rakesh私はあなたが私の答えを参照することに問題はありません、私たちは学び、教えるためにここにいます。元のポスターはあなたの元の答えを受け入れました。つまり、あなたの答えは正しく、彼のために働いたということです。しかし、私が答えで言ったように、またデビッド・マナーズがコメントで言ったように、それは推奨されておらず、可能な限り避けるべきです。
デジタルピアニズムのラファエル

@Rakeshまあ、私はアップ投票とダウン投票について責任を負いません。また、他の人の回答をコピー/貼り付けても、支持を得られません。繰り返しますが、あなたの答えはすべてのユーザーにとって正しいものであり、どこでも機能しますが、ObjectManagerを直接使用することは推奨されません。あなたがあなたの将来の答えを直接のObjectManagerを使用しないようにしようと私たちは学ぶためにここにいると私は確信している
デジタルPianismでラファエル

1
こんにちはラファエル、あなたの例が機能せず、app / code / Vendor / Module / Block / Checkout / Success.phpがまったくレンダリングされない場合(die()または違法なPHP構文を挿入しても)、それはそれを意味しますどこかに上書きされますか?私は..コンパイルを実行します
クラウディウCreanga

@ClaudiuCreangaそれは可能性があります。前回Magento 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 18
14:43に

2

私の知る限り、checkout_onepage_controller_success_actionCheckoutの1ページが正常に終了した後に発生するイベントがあります。

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

ご覧のとおり、Observerを使用して注文IDを取得できます。例えば:

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モジュールをご覧ください:
vendor / magento / module-google-adwords
vendor / magento / module-google-analytics


私はオブザーバーを使用するというアイデアが好きですが、ブロック内の注文IDを取得するメソッドが既にあるので、あなたがそれを行う方法はちょっと役に立たないです(私の答えを参照)。
デジタルピアニズムのラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.