Magento 2 Получить корзину цитата Всего в minicart.phtml


10

Я пытаюсь получить общую сумму заказа в minicart.phtml, но мне не везет. Я делаю инъекцию Magento \ Checkout \ Model \ Cart.

Вот мой код:

$this->cart = $cart;
$cartQuote= $this->cart->getQuote()->getData();
echo $cartQuote['base_grand_total'];

После запуска этого кода миникарта ломается и полностью исчезает с внешнего интерфейса.

Спасибо!


Можете ли вы поделиться дополнительной информацией?
Сохель Рана

Hei. Кажется, не работает после обновления до 2.1, он возвращает данные только на странице корзины / оформления заказа, другие страницы возвращают 0 значений.
Фри Зуурикас

Ответы:


17

Вы должны просто держать строку ниже в вашем файле minicart.phtml, чтобы получить обновленную промежуточную сумму,

Эта строка ниже работает для всех случаев, если кеш позволяет работать нормально,

<span data-bind="html: getCartParam('subtotal')"></span> 

Для получения стоимости Grandtotal, стоимость доставки,

Вы можете получить GrandTotal, промежуточный итог и стоимость доставки для текущей цитаты, используя приведенный ниже код в файле minicart.phtml, но если кеш включен в это время, не обновляйте цену, когда вы добавляете новый продукт, используя метод ниже.

<?php
    $quote = $block->getTotalsCache();
    $getSubTotal = $quote['subtotal']->getData('value');
    $getGrandTotal = $quote['grand_total']->getData('value');
    $getShippingRate = $quote['shipping']->getData('value');

        $finalSubTotal = $this->helper('Magento\Framework\Pricing\Helper\Data')->currency(number_format($getSubTotal,2),true,false);
        $finalShippingTotal = $this->helper('Magento\Framework\Pricing\Helper\Data')->currency(number_format($getShippingRate,2),true,false);
        $finalGrandTotal = $this->helper('Magento\Framework\Pricing\Helper\Data')->currency(number_format($getGrandTotal,2),true,false);
?>

Он отлично работал на моем локальном xamp в Ubuntu, но $ quote = $ block-> getTotalsCache (); не работает на тестовом сервере Linux Fedora
Кумар А.

Он уже работает на сервере Linux, я думаю, у вас есть конфликт или какая-то другая ошибка.
Ракеш Джесадия,

Я стал более вовлеченным и нашел $ block-> getTotalsCache (); работает только когда кеш отключен. Вы проверяли это с включенным кэшем? Мой Magento2.1.0
Кумар А.

1
Как получить такую ​​скидку?
Дибан Бабу

@KumarAbhinav, сохраняйте <span data-bind = "html: getCartParam ('subtotal')"> </ span>, чтобы получить динамическую цену после включения кэша.
Ракеш Джесадия

8

У нас был похожий вопрос от клиента. где он хотел показать «[количество] пункт [промежуточный итог]» в стилизованном блоке корзины вместо значка корзины по умолчанию в мини-карте.

Мы нашли этот вопрос здесь, но нам не понравился ответ, где нам нужно было расширить \Magento\Checkout\CustomerData\Cartкласс, просто чтобы правильно отобразить HTML

это код, как мы исправили это в шаблоне:

<span class="counter-label">
    <!-- ko if: getCartParam('summary_count') == 1 -->
        <!-- ko text: getCartParam('summary_count') --><!-- /ko -->
        <!-- ko i18n: 'item' --><!-- /ko -->
        <span data-bind="html: getCartParam('subtotal')"></span>
    <!-- /ko -->
    <!-- ko if: getCartParam('summary_count') != 1 -->
        <!-- ko text: getCartParam('summary_count') --><!-- /ko -->
        <!-- ko i18n: 'items' --><!-- /ko -->
        <span data-bind="html: getCartParam('subtotal')"></span>
    <!-- /ko -->
</span>

Похоже, что вы также можете использовать стандартную привязку данных knockout.js, и вам не нужно использовать сумасшедший метод комментариев magento 2 knockout. это решило проблему, когда рендеринг getCartParam('subtotal')с методом html, где он обычно печатает промежуточный итог неправильно из-за <span ="price"></span>тега


5

Приведенный выше код будет работать при загрузке страницы, но не будет работать с magento2 ajax add в корзину, поскольку теперь он использует Knockout JS.

Для этого вы должны использовать -

  1. Переопределите magento класс " \ Magento \ Checkout \ CustomerData \ Cart " в вашем модуле и расширьте метод " getSectionData "
    публичная функция getSectionData ()
    {
        $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); // Экземпляр диспетчера объектов
        $ priceHelper = $ objectManager-> create ('Magento \ Framework \ Pricing \ Helper \ Data'); // Экземпляр помощника ценообразования

        $ totals = $ this-> getQuote () -> getTotals ();
        возвращение [
            'summary_count' => $ this-> getSummaryCount (),
            'subtotal' => isset ($ totalals ['subtotal'])
                ? $ This-> checkoutHelper-> formatPrice ($ итоги [ 'субтотальная'] -> GetValue ())
                : 0,
            'subtotal_value' => isset ($ totalals ['subtotal'])
                ? $ PriceHelper-> валюты ($ итоги [ 'субтотальная'] -> GetValue (), правда, ложь)
                : '',
            'возможная_onepage_checkout' => $ this-> isPossibleOnepageCheckout (),
            'items' => $ this-> getRecentItems (),
            'extra_actions' => $ this-> layout-> createBlock ('Magento \ Catalogue \ Block \ ShortcutButtons') -> toHtml (),
            'isGuestCheckoutAllowed' => $ this-> isGuestCheckoutAllowed (),
        ];
    }

Здесь я добавил новый параметр корзины " subtotal_value ", так как " subtotal " вернет диапазон ценового контейнера и будет отображаться как TEXT с использованием KO. Здесь вы должны использовать « Экземпляр диспетчера объектов » напрямую, поскольку вы не сможете внедрить зависимости в « __construct ».

ПРИМЕЧАНИЕ, есть несколько исключений, когда нам может понадобиться использовать « Экземпляр диспетчера объектов » напрямую. В нашем случае это обратная совместимость конструктора.
Исключение ObjectManager

  1. Затем скопируйте тему magento по умолчанию " /cart/minicart.phtml " в свою тему и добавьте KO-коды.

    текст: getCartParam ('subtotal_value')


0

Определите блок в макете, в котором класс помечен как «Magento \ Checkout \ Block \ Cart \ Totals»

<block class="Magento\Checkout\Block\Cart\Totals" name="quote.print.totals" as="quote.print.totals" after="checkout.cart" 
            template="MyNamespace_PrintCart::totals.phtml"/>

Тогда в .phtml вы можете иметь ниже код

<?php 
$totals = $block->getTotals() ;
?>
<table class="data table totals">
    <tbody>
        <?php foreach($totals as $key => $total) :?>
            <?php if(!empty($total->getValue())) :?>
                <tr>
                    <td><?= $total->getTitle()->getText() ?></th>
                    <td>
                        <span class="price"><?= $this->helper('Magento\Framework\Pricing\Helper\Data')->currency(number_format($total->getValue(),2),true,false) ?></span>                    
                    </td>
                </tr>
            <?php endif ?>
        <?php endforeach ?>
    </tbody>
    </table>

Ожидаемый результат

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.