Magento 2 Obtenga el total de la cotización del carrito en minicart.phtml

10

Estoy tratando de obtener el presupuesto total del carrito en minicart.phtml, pero no tengo suerte. Estoy inyectando Magento \ Checkout \ Model \ Cart.

Aquí está mi código:

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

Después de ejecutar ese código, el minicart se rompe y desaparece totalmente de la interfaz.

¡Gracias!

Pablo
fuente
¿Puedes compartir más información?
Sohel Rana
Hei Parece que no funciona después de la actualización a 2.1, solo devuelve datos cuando está en la página del carrito / pago, otras páginas devuelven valores 0.
Frii Zuurikas

Respuestas:

17

Solo tiene que mantenerse debajo de la línea en su archivo minicart.phtml para obtener el subtotal actualizado,

Esta línea a continuación funciona para todos los casos si el caché está habilitado, funciona bien,

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

Para obtener el valor del total general, la tasa de envío,

Puede obtener GrandTotal, subtotal y tarifa de envío para la cotización actual usando el código a continuación en el archivo minicart.phtml, pero cuando el caché está habilitado en ese momento, no actualice el precio cuando agrega un nuevo producto usando el método a continuación.

<?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
fuente
Funcionó perfectamente en mi localhost xamp en ubuntu, pero $ quote = $ block-> getTotalsCache (); no funciona en el servidor de prueba Linux Fedora
Kumar A.
Ya está funcionando en el servidor de Linux, creo que tiene algún conflicto u otro error.
Rakesh Jesadiya
Me involucré más y encontré $ block-> getTotalsCache (); funciona solo cuando el caché está deshabilitado. ¿Ha verificado esto con la caché habilitada? El mío es Magento2.1.0
Kumar A.
1
¿Cómo obtener una cantidad de descuento como esta?
Deeban Babu
@KumarAbhinav, mantenga <span data-bind = "html: getCartParam ('subtotal')"> </span> para obtener un precio dinámico después de habilitar la memoria caché.
Rakesh Jesadiya
8

Tuvimos una pregunta similar de un cliente. donde quería mostrar "[cantidad] artículo [subtotal]" en un bloque de carrito con estilo en lugar del icono de carrito predeterminado en el minicart.

Encontramos esta pregunta aquí, pero no nos gustó la respuesta donde necesitábamos extender la \Magento\Checkout\CustomerData\Cartclase solo para renderizar correctamente algunos HTML

Este es el código de cómo lo arreglamos en la plantilla:

<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 también puede usar el enlace de datos knockout.js estándar y no tiene que usar el método de comentario loco magento 2. esto solucionó el problema donde renderizar getCartParam('subtotal')con el método html donde normalmente imprimiría el subtotal incorrectamente debido a la <span ="price"></span>etiqueta

Pascal Wientjes
fuente
5

Este código anterior funcionará en la carga de la página, pero no funcionará con magento2 ajax add to cart ya que ahora usa Knockout JS.

Para eso deberías usar -

  1. Anule la clase de magento " \ Magento \ Checkout \ CustomerData \ Cart " en su módulo y extienda el método " getSectionData "
    función pública getSectionData ()
    {
        $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); // Instancia de Object Manager
        $ priceHelper = $ objectManager-> create ('Magento \ Framework \ Pricing \ Helper \ Data'); // Instancia de ayuda de precios

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

Aquí he agregado un nuevo parámetro de carrito " subtotal_value " ya que el " subtotal " devolverá el intervalo del contenedor de precios y se mostrará como TEXTO usando KO. Aquí debe usar " Instancia de Administrador de Objetos " directamente, ya que no podrá inyectar dependencias a la " construcción __ ".

NOTA, hay algunas excepciones en las que podríamos necesitar usar " Instancia del Administrador de Objetos " directamente. En nuestro caso, es la compatibilidad con versiones anteriores del constructor.
Excepción de ObjectManager

  1. A continuación, copie el tema predeterminado de magento " /cart/minicart.phtml " a su tema y agregue los códigos KO.

    texto ko: getCartParam ('subtotal_value')

Sandipan S
fuente
0

Defina un bloque en su diseño en la clase 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"/>

Luego, en .phtml, puede tener el siguiente código

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

Rendimiento esperado

ingrese la descripción de la imagen aquí

Suman-PHP4U
fuente