Magento 2 Obter cotação do carrinho Total em minicart.phtml


10

Estou tentando obter o total da cotação do carrinho em minicart.phtml, mas não estou tendo sorte. Estou injetando Magento \ Checkout \ Model \ Cart.

Aqui está o meu código:

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

Depois de executar esse código, o minicart quebra e desaparece totalmente do frontend.

Obrigado!


Você pode compartilhar mais informações?
— Sohel Rana

Ele eu. Parece não funcionar após a atualização para 2.1, ele só retorna dados quando na página de carrinho / check-out, outras páginas estão retornando 0 valores.
— Frii Zuurikas

Respostas:


17

Você precisa apenas manter a linha abaixo do arquivo minicart.phtml para obter o subtotal atualizado,

Esta linha Abaixo é útil para todos os casos, se o cache permitir que funcione corretamente,

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

Para obter valor de grandtotal, taxa de envio,

Você pode obter GrandTotal, subtotal e taxa de remessa para cotação atual usando o código abaixo no arquivo minicart.phtml. Porém, quando o cache estiver ativado naquele momento, não atualize o preço ao adicionar novo produto usando o método abaixo.

<?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);
?>

Funcionou perfeitamente no meu localhost xamp no ubuntu, mas $ quote = $ block-> getTotalsCache (); não funciona no Linux Fedora servidor de teste
— Kumar A.

Já está trabalhando no servidor linux, acho que você tem algum conflito ou algum outro erro.
— Rakesh Jesadiya

Eu me envolvi mais e encontrei $ block-> getTotalsCache (); funciona apenas quando o cache está desativado. Você verificou isso com o cache ativado? O meu é o Magento2.1.0
— Kumar A.

11
Como obter um valor de desconto como este?
— Deeban Babu

@KumarAbhinav, mantenha <span data-bind = "html: getCartParam ('subtotal')"> </span> para obter um preço dinâmico após a ativação do cache.
— Rakesh Jesadiya

8

Tivemos uma pergunta semelhante de um cliente. onde ele queria mostrar "[quantidade] item [subtotal]" em um bloco de carrinho com estilo, em vez do ícone de carrinho padrão no minicart.

Encontramos essa pergunta aqui, mas não gostamos da resposta em que precisávamos estender a \Magento\Checkout\CustomerData\Cartclasse apenas para renderizar alguns html corretamente

este é o código como o corrigimos no modelo:

<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>

Parece que você também pode usar a ligação de dados knockout.js padrão e não precisa usar o método de comentários nocaute do magento 2. isso resolveu o problema ao renderizar o getCartParam('subtotal')método html, onde normalmente imprimia o subtotal incorretamente devido à <span ="price"></span>tag


5

Este código acima funcionará no carregamento da página, mas não funcionará com o magento2 ajax add ao carrinho, pois ele usa o Knockout JS agora.

Para isso você deve usar -

  1. Substitua a classe magento " \ Magento \ Checkout \ CustomerData \ Cart " no seu módulo e estenda o método " getSectionData "
    função pública getSectionData ()
    {
        $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); // Instância do gerenciador de objetos
        $ priceHelper = $ objectManager-> create ('Magento \ Framework \ Pricing \ Helper \ Data'); // Instância do Auxiliar de Precificação

        $ totals = $ this-> getQuote () -> getTotals ();
        Retorna [
            'summary_count' => $ this-> getSummaryCount (),
            'subtotal' => isset ($ totals ['subtotal'])
                ? $ this-> checkoutHelper-> formatPrice ($ totals ['subtotal'] -> getValue ())
                : 0,
            'subtotal_value' => isset ($ totals ['subtotal'])
                ? $ priceHelper-> currency ($ totals ['subtotal'] -> getValue (), verdadeiro, falso)
                : '',
            'possible_onepage_checkout' => $ this-> isPossibleOnepageCheckout (),
            'items' => $ this-> getRecentItems (),
            'extra_actions' => $ this-> layout-> createBlock ('Magento \ Catalog \ Block \ ShortcutButtons') -> toHtml (),
            'isGuestCheckoutAllowed' => $ this-> isGuestCheckoutAllowed (),
        ];
    }

Aqui eu adicionei um novo parâmetro de carrinho " subtotal_value ", pois o " subtotal " retornará o período do contêiner de preço e será exibido como TEXT usando KO. Aqui você deve usar " Instância do gerenciador de objetos " diretamente, pois não será possível injetar dependências no " __construct ".

OBSERVAÇÃO, existem poucas exceções nas quais podemos precisar usar " Instância do gerenciador de objetos " diretamente. No nosso caso, é a compatibilidade com versões anteriores do construtor.
Exceção do ObjectManager

  1. Em seguida, copie o tema padrão do magento " /cart/minicart.phtml " para o seu tema e adicione os códigos KO.

    ko texto: getCartParam ('subtotal_value')


0

Defina um bloco no seu layout em que classe marcada como "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"/>

Em .phtml você pode ter o código abaixo

<?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>

Saída esperada

insira a descrição da imagem aqui

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.