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 для отримання даних. Просто поставте нижче код, щоб отримати дані замовлення на сторінці успіху в magneto 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/…
Сараванан DS

Відповіді:


25

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
Привіт Рафаеле, якщо ваш приклад не працює, а додаток / код / ​​постачальник / модуль / блок / замовлення / успіх.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());

У наведеному вище коді ви отримаєте всі дані замовлення на сторінці успіху.

Дякую


1
Посилаючись на офіційну документацію: "Magento забороняє безпосередньо використовувати ObjectManager у вашому коді, оскільки він приховує реальні залежності класу. Див. Правила використання." devdocs.magento.com/guides/v2.1/extension-dev-guide/…
c.norin

2

Наскільки я знаю, є подія - checkout_onepage_controller_success_actionяка запускається після успішної перевірки однієї сторінки.

постачальник / магент / замовлення модулів / контролер / одна сторінка / успіх.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


Мені подобається ідея використання спостерігача, проте спосіб, яким ви це робите, є марним, тому що вже існує метод отримання ідентифікатора замовлення в блоці (див. Мою відповідь).
Рафаель у цифровому піанізмі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.