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!

Paulo
fonte
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);
?>
Rakesh Jesadiya
fonte
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

Pascal Wientjes
fonte
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')

Sandipan S
fonte
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

Suman-PHP4U
fonte