我试图在magento 2的成功页面上获得订单总数,我添加了此代码
<?php
$order = Mage::getModel('sales/order')->loadByIncrementId($this->getOrderId());
$totall = $order->getGrandTotal();
?>
但是下订单后到达成功页面时出现错误,我猜代码适用于magento 1,但不适用于2。我如何在magento 2上也能使用?
我试图在magento 2的成功页面上获得订单总数,我添加了此代码
<?php
$order = Mage::getModel('sales/order')->loadByIncrementId($this->getOrderId());
$totall = $order->getGrandTotal();
?>
但是下订单后到达成功页面时出现错误,我猜代码适用于magento 1,但不适用于2。我如何在magento 2上也能使用?
Answers:
现在下面提到的块 Magento\Checkout\Block\Onepage\Success
您可以在此页面上本地检索的唯一内容是使用中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();
echo get_class($block);
检查覆盖是否有效,但如果根本不渲染块,则可能无法正常工作
刚开 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());
在上面的代码中,您将在成功页面中获得所有订单数据。
谢谢
据我所知,有一个事件- 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