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命令获取数据。只需在磁铁2的成功页面中放入以下代码即可获取定单数据。$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance(); $ orderData = $ objectManager-> create('Magento \ Sales \ Model \ Order')-> loadByIncrementId($ block-> getOrderId()); echo“ <pre>”; print_r($ orderData-> getData());
Nikul

Answers:


25

Magento 2.1

现在下面提到的块 Magento\Checkout\Block\Onepage\Success

Magento 2.0

您可以在此页面上本地检索的唯一内容是使用中getRealOrderId()定义的方法的订单IDMagento\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();

嗨,拉普尔,我只是从您的答复中引用。
Rakesh Jesadiya '16

2
@Rakesh我没有问题可以参考我的答案,我们在这里学习和教导,仅复制/粘贴已投票的答案是不公平的,因为您被投票了。原始海报接受了您的原始答案,这意味着您的答案是正确的,并且对他有用。但是,正如我在回答中所说以及David Manners在评论中所说,不建议这样做,应尽可能避免使用它。
拉斐尔(Raphael)在

@Rakesh好吧,我不负责投票和降票。复制/粘贴其他人的答案不会帮助您获得成功。同样,您的答案对每个用户都是正确的,它将在任何地方都有效,但是不建议直接使用ObjectManager。我们在这里学习,我相信您会在以后的回答中避免使用ObjectManager的
麻烦

1
嗨,拉斐尔,如果您的示例不起作用并且app / code / Vendor / Module / Block / Checkout / Success.php根本不呈现(即使我插入了die()或非法的php语法),这是否意味着它被其他地方覆盖?我运行编译..
克劳迪乌Creanga

@ClaudiuCreanga可能是。上次我测试的是早期的Magento 2.0时,我还没有尝试过最新2.1版本的代码。您可以echo get_class($block);检查覆盖是否有效,但如果根本不渲染块,则可能无法正常工作
Digital Pianism的Raphael,2016年

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 /模块结帐/控制器/一页/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(请参阅我的答案)。
拉斐尔(Raphael)在
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.