Magento 2 Получить сумму заказа на странице успеха?

13

Я пытаюсь получить сумму заказа на странице успеха на magento 2, я добавил этот код

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

Но я получаю сообщение об ошибке, когда достигаю страницы успеха после размещения заказа. Я полагаю, что код работает для magento 1, но не для 2. Как я могу заставить это работать также на magento 2?

alexcr
источник
Привет @alexcr вы используете команду magento 1 для получения данных. Просто поместите код ниже, чтобы получить данные заказа на странице успеха в magneto 2. $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ orderData = $ objectManager-> create ('Magento \ Sales \ Model \ Order') -> loadByIncrementId ($ block-> getOrderId ()); echo "<pre>"; print_r ($ orderData-> getData ());
Nikul
Проверить эту ссылку codextblog.com/code-snippet/...
Saravanan DS

Ответы:

24

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
@Rakesh У меня нет проблем с тем, что вы ссылаетесь на мой ответ, мы здесь, чтобы учиться и учить, просто нечестно просто скопировать / вставить ответ с отрешенным голосованием, потому что вы проголосовали против. Оригинальный постер принял ваш оригинальный ответ, что означает, что ваш ответ правильный и сработал для него. Однако, как я сказал в своем ответе и как сказал Дэвид Мэннерс в комментарии, это не рекомендуется и его следует избегать, когда это возможно.
Рафаэль на цифровом пианизме
@Rakesh хорошо, я не несу ответственности за отрицательные и отрицательные голоса. И копировать / вставлять ответы других не поможет вам получить голосование. Опять же, ваш ответ верен для всех пользователей, он будет работать везде, но не рекомендуется использовать ObjectManager напрямую. Мы здесь, чтобы учиться, и я уверен, что вы постараетесь не использовать ObjectManager непосредственно в своих будущих ответах
Рафаэль на Digital Pianism
1
Привет, Рафаэль, если твой пример не работает и app / code / Vendor / Module / Block / Checkout / Success.php не отображается вообще (даже если я вставляю die () или неверный синтаксис php), значит ли это, что он перезаписано где-то еще? Я запускаю компиляцию ..
Claudiu Creanga
@ClaudiuCreanga это может быть. В прошлый раз, когда я тестировал это на ранней версии Magento 2.0, я не пробовал код в последних версиях 2.1. Вы можете использовать, echo get_class($block);чтобы проверить, работает ли переопределение, но если блок вообще не отображается, это, вероятно, не сработает
Рафаэль в Digital Pianism
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());

В приведенном выше коде вы получите все данные заказа на странице успеха.

Благодарность

Nikul
источник
1
Ссылаясь на официальную документацию: «Magento запрещает прямое использование ObjectManager в вашем коде, потому что оно скрывает реальные зависимости класса. См. Правила использования». devdocs.magento.com/guides/v2.1/extension-dev-guide/…
c.norin
2

Насколько я знаю, есть событие - checkout_onepage_controller_success_actionкоторое запускается после того, как Checkout одна страница успешно.

продавец / 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;
}

Как мы видим, мы можем получить идентификатор заказа с помощью Observer. Например:

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

Хоа ТруонгДинь
источник
Мне нравится идея использования наблюдателя, однако то, как вы это делаете, бесполезно, потому что уже есть метод для получения идентификатора заказа в блоке (см. Мой ответ).
Рафаэль на цифровом пианизме