Magento2: Show grand_total in Minicart
3. August 2018
One of our customers needed the minicart to show the grand_total because of the huge quantity discounts they give. The Minicarts view file is Magento_Checkout/templates/cart/minicart.phtml. For the grand_total to work with Javascript you need to add it as data-bind attribute with getCartParam – there is only one problem: grand_total ist not part of the data the Minicart collects. To get it in there you need to overwrite the getSectionData method of \Magento\Checkout\CustomerData\Cart. Here are the two files — if you have questions, just ask them in the comments – I do not explain further cause i hate to read long explanations myself – the code must do the talking.
<div data-block="minicart" class="minicart-wrapper">
    <a class="action showcart" href="<?php /* @escapeNotVerified */ echo $block->getShoppingCartUrl(); ?>"
       data-bind="scope: 'minicart_content'">
	   <span class="cart-icon icons">
			<span class="text"><i class="fa fa-shopping-bag"></i></span>
			<span class="text-cart">
				<span class="text-mycart"><?php /* @escapeNotVerified */ echo __('My Cart'); ?></span>
				<!-- ko if: getCartParam('summary_count') -->
				<span class="total-price subtotal" data-bind="html: getCartParam('subtotal')"></span>
				<span class="total-price grand-total" data-bind="html: getCartParam('grand_total')"></span>
				<!-- /ko -->
			</span>
			<span class="counter qty empty"
				  data-bind="css: { empty: !!getCartParam('summary_count') == false }, blockLoader: isLoading">
				<span class="counter-number"><!-- ko text: getCartParam('summary_count') --><!-- /ko --></span>
				<span class="counter-label">
				<!-- ko if: getCartParam('summary_count') -->
					<!-- ko text: getCartParam('summary_count') --><!-- /ko -->
					<!-- ko i18n: 'items' --><!-- /ko -->
				<!-- /ko -->
				</span>
			</span>
        </span><?php
	namespace Vendor\ModuleName\CustomerData;
	class Cart extends \Magento\Checkout\CustomerData\Cart
	{
		public function getSectionData()
		{
		    $totals = $this->getQuote()->getTotals();
		    $grand_total = $totals['grand_total']->getValue();
		    return [
		        'summary_count' => $this->getSummaryCount(),
		        'subtotal' => isset($totals['subtotal']) ? $this->checkoutHelper->formatPrice($totals['subtotal']->getValue()) : 0,
		        'grand_total' => $grand_total ? $this->checkoutHelper->formatPrice($grand_total) : '',
		        'possible_onepage_checkout' => $this->isPossibleOnepageCheckout(),
		        'items' => $this->getRecentItems(),
		        'extra_actions' => $this->layout->createBlock('Magento\Catalog\Block\ShortcutButtons')->toHtml(),
		        'isGuestCheckoutAllowed' => $this->isGuestCheckoutAllowed(),
		    ];
		}
	}
Hey, thanks a lot for this code sample, it put me on the right track to achieve a similar thing!
After some research based on your method I think the “proper”/Magento way of doing what you’re doing is to use a Plugin on the `\Magento\Checkout\CustomerData\Cart` and implement `afterGetSectionData`:
di.xml
——–
Module/Plugin/Checkout/CustomerData/CartTotals.php
—————————————————————————
class CartTotals
{
/* … */
public function __construct(\Magento\Checkout\Model\Session $checkoutSession) {
$this->checkoutSession = $checkoutSession;
}
public function afterGetSectionData(\Magento\Checkout\CustomerData\Cart $subject, $result)
{
$totals = $this->checkoutSession->getQuote()->getTotals();
if(isset($totals[‘grand_total’])) {
$result[‘grand_total’] = $totals[‘grand_total’]->getValueInclTax() ?: $totals[‘grand_total’]->getValue();
}
return $result;
}
}
Thanks a lot for your help in coming to this solution 🙂
Woops the code got mangled/removed….
Here’s a gist with the full code: https://gist.github.com/olance/7173f31a1e9426959453e04a130142e3