Magento 2 Get Cart Quote Total in minicart.phtml

10

J'essaie d'obtenir le total du devis du panier dans minicart.phtml, mais je n'ai pas de chance. J'injecte Magento \ Checkout \ Model \ Cart.

Voici mon code:

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

Après avoir exécuté ce code, le minicart se casse et disparaît totalement du frontend.

Merci!

Paul
la source
Pouvez-vous partager plus d'informations?
Sohel Rana
Il je. Semble ne pas fonctionner après la mise à jour 2.1, il ne renvoie des données que dans la page panier / caisse, les autres pages retournent 0 valeur.
Frii Zuurikas

Réponses:

17

Vous devez simplement garder la ligne ci-dessous dans votre fichier minicart.phtml pour obtenir un sous-total mis à jour,

Cette ligne ci-dessous fonctionne pour tous les cas si le cache est activé, il fonctionne correctement,

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

Pour obtenir la valeur du grand total, le taux d'expédition,

Vous pouvez obtenir le GrandTotal, le sous-total et le taux d'expédition pour le devis actuel en utilisant le code ci-dessous dans le fichier minicart.phtml, mais lorsque le cache est activé à ce moment-là, ne mettez pas à jour le prix lorsque vous ajoutez un nouveau produit en utilisant la méthode ci-dessous.

<?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
la source
Cela fonctionnait parfaitement sur mon xamp localhost sur ubuntu, mais $ quote = $ block-> getTotalsCache (); ne fonctionne pas sur le serveur de test linux fedora
Kumar A.
Son fonctionne déjà sur le serveur Linux, je pense que vous avez un conflit ou une autre erreur.
Rakesh Jesadiya
Je me suis impliqué davantage et j'ai trouvé $ block-> getTotalsCache (); ne fonctionne que lorsque le cache est désactivé. Avez-vous vérifié cela avec le cache activé? Le mien est Magento2.1.0
Kumar A.
1
Comment obtenir un montant de remise comme celui-ci?
Deeban Babu
@KumarAbhinav, veuillez conserver <span data-bind = "html: getCartParam ('subtotal')"> </span> pour obtenir un prix dynamique après l'activation du cache.
Rakesh Jesadiya
8

Nous avions une question similaire d'un client. où il voulait afficher "[quantité] article [sous-total]" dans un bloc de chariot de style au lieu de l'icône de panier par défaut dans le mini-chariot.

Nous avons trouvé cette question ici mais n'avons pas aimé la réponse où nous devions étendre la \Magento\Checkout\CustomerData\Cartclasse juste pour afficher correctement du HTML

c'est le code comme nous l'avons corrigé dans le modèle:

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

Il semble que vous pouvez également utiliser la liaison de données knockout.js standard et ne pas avoir besoin d'utiliser la méthode de commentaire knockout fou magento 2. cela a résolu le problème de rendu de la getCartParam('subtotal')avec la méthode html où il afficherait normalement le sous-total de manière incorrecte en raison de la <span ="price"></span>balise

Pascal Wientjes
la source
5

Ce code ci-dessus fonctionnera lors du chargement de la page, mais ne fonctionnera pas avec magento2 ajax add to cart car il utilise Knockout JS maintenant.

Pour cela, vous devez utiliser -

  1. Remplacez la classe magento " \ Magento \ Checkout \ CustomerData \ Cart " dans votre module et étendez la méthode " getSectionData "
    fonction publique getSectionData ()
    {
        $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); // Instance du gestionnaire d'objets
        $ priceHelper = $ objectManager-> create ('Magento \ Framework \ Pricing \ Helper \ Data'); // Instance d'aide à la tarification

        $ totals = $ this-> getQuote () -> getTotals ();
        revenir [
            '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 (), true, false)
                : '',
            'possible_onepage_checkout' => $ this-> isPossibleOnepageCheckout (),
            'items' => $ this-> getRecentItems (),
            'extra_actions' => $ this-> layout-> createBlock ('Magento \ Catalog \ Block \ ShortcutButtons') -> toHtml (),
            'isGuestCheckoutAllowed' => $ this-> isGuestCheckoutAllowed (),
        ];
    }

Ici, j'ai ajouté un nouveau paramètre de panier " subtotal_value " car le " sous-total " renverra la durée du conteneur de prix et il s'affichera sous forme de TEXTE en utilisant KO. Ici, vous devez utiliser directement " Object Manager Instance ", car vous ne pourrez pas injecter de dépendances dans " __construct ".

REMARQUE, il existe quelques exceptions où nous pourrions avoir besoin d'utiliser directement " Instance du gestionnaire d'objets ". Dans notre cas, c'est la compatibilité descendante du constructeur.
Exception ObjectManager

  1. Ensuite, copiez le thème par défaut de magento " /cart/minicart.phtml " dans votre thème et ajoutez les codes KO.

    ko text: getCartParam ('subtotal_value')

Sandipan S
la source
0

Définissez un bloc dans votre mise en page dans lequel la classe marquée "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"/>

Ensuite, en .phtml, vous pouvez avoir ci-dessous le code

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

Production attendue

entrez la description de l'image ici

Suman-PHP4U
la source