Magento 2 Minicart – Display Line Item Subtotal Instead of Unit Price

knockoutjsmagento2mini-cartprice

In the Magento 2 mini cart I would like to display the line item subtotal rather than unit price.

So in the example below the price in the minicart should be $90 because I've added two watches to the cart.

enter image description here

I see this Magento displays this price from a KnockoutJS template

app/code/Magento/Checkout/view/frontend/web/template/minicart/item/default.html

with this piece of code:

<!-- ko foreach: $parent.getRegion('priceSidebar') -->
    <!-- ko template: {name: getTemplate(), data: item.product_price, as: 'price'} --><!-- /ko -->
<!-- /ko -->

The item object contains item data like below:

canApplyMsrp:false
is_visible_in_site_visibility:true
item_id:"155"
product_has_url:true
product_id:"2"
product_image:Object
product_name:"Test Product"
product_price:"↵↵    <span class="price-excluding-tax" data-label="Excl. Tax">↵            <span class="minicart-price">↵            <span class="price">$45.00</span>        </span>↵↵        </span>↵"
product_price_value:30
product_sku:"01002"
product_type:"simple"
product_url:"http://dev.example.com/test-product.html"
qty:2

In my theme, how can I override the current price value used, product_price, to display the line item sub-total price instead? Properly formatted with the correct currency symbol.

So far I've tried the below:

<!-- ko template: {name: getTemplate(), data: item.product_price * item.qty, as: 'price'} --><!-- /ko -->  // returns a NaN

<!-- ko template: {name: getTemplate(), data: item.product_price_value * item.qty, as: 'price'} --><!-- /ko -->  // returns the correct price but without the currency symbol

Best Answer

You can set line item subtotal using below way, You dont need to use of knockout js anyway you can just setup your goal using below way,

You can get item qty using $qty = $item->getQty(); Now just you have to set $block->getUnitDisplayPriceInclTax()*$qty to get lineItem subtotal for each item.

You just need to override template file into your theme or module.
I have just setup using override template into theme,

Final Solution,

app/design/frontend/{Packagename}/{themename}/Magento_Weee/templates/checkout/cart/item/price/sidebar.phtml

<?php
/** @var $block \Magento\Weee\Block\Item\Price\Renderer */
$item = $block->getItem();

$originalZone = $block->getZone();
$block->setZone(\Magento\Framework\Pricing\Render::ZONE_CART);
/* custom logic*/
$qty = $item->getQty();
?>
<?php if ($block->displayPriceInclTax() || $block->displayBothPrices()): ?>
    <span class="price-including-tax" data-label="<?php echo $block->escapeHtml(__('Incl. Tax')); ?>">
    <?php if ($block->displayPriceWithWeeeDetails()): ?>
        <span class="minicart-tax-total">
    <?php else: ?>
        <span class="minicart-price">
    <?php endif; ?>
        <!-- custom logic -->
        <?php /* @escapeNotVerified */ echo $block->formatPrice($block->getUnitDisplayPriceInclTax()*$qty); ?>
        </span>

    <?php if ($block->displayPriceWithWeeeDetails()): ?>
        <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($item)): ?>
            <span class="minicart-tax-info">
            <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($item) as $tax): ?>
                <span class="weee" data-label="<?php /* @escapeNotVerified */ echo $tax['title']; ?>">
                    <?php /* @escapeNotVerified */ echo $block->formatPrice($tax['amount_incl_tax'], true, true); ?>
                </span>
            <?php endforeach; ?>
            </span>

            <?php if ($block->displayFinalPrice()): ?>
                <span class="minicart-tax-total">
                    <span class="weee" data-label="<?php echo $block->escapeHtml(__('Total Incl. Tax')); ?>">
                        <!-- custom logic -->
                        <?php /* @escapeNotVerified */ echo $block->formatPrice($block->getFinalUnitDisplayPriceInclTax()*$qty); ?>
                    </span>
                </span>
            <?php endif; ?>
        <?php endif; ?>
    <?php endif; ?>
    </span>
<?php endif; ?>

<?php if ($block->displayPriceExclTax() || $block->displayBothPrices()): ?>
    <span class="price-excluding-tax" data-label="<?php echo $block->escapeHtml(__('Excl. Tax')); ?>">
    <?php if ($block->displayPriceWithWeeeDetails()): ?>
        <span class="minicart-tax-total">
    <?php else: ?>
        <span class="minicart-price">
    <?php endif; ?>
        <!-- custom logic -->
        <?php /* @escapeNotVerified */ echo $block->formatPrice($block->getUnitDisplayPriceExclTax()*$qty); ?>
        </span>

    <?php if ($block->displayPriceWithWeeeDetails()): ?>
        <?php if ($this->helper('Magento\Weee\Helper\Data')->getApplied($item)): ?>
            <span class="minicart-tax-info">
            <?php foreach ($this->helper('Magento\Weee\Helper\Data')->getApplied($item) as $tax): ?>
                <span class="weee" data-label="<?php /* @escapeNotVerified */ echo $tax['title']; ?>">
                    <?php /* @escapeNotVerified */ echo $block->formatPrice($tax['amount'], true, true); ?>
                </span>
            <?php endforeach; ?>
            </span>

            <?php if ($block->displayFinalPrice()): ?>
                <span class="minicart-tax-total">
                    <span class="weee" data-label="<?php echo $block->escapeHtml(__('Total')); ?>">
                        <!-- custom logic -->
                        <?php /* @escapeNotVerified */ echo $block->formatPrice($block->getFinalUnitDisplayPriceExclTax()*$qty); ?>
                    </span>
                </span>
            <?php endif; ?>
        <?php endif; ?>
    <?php endif; ?>
    </span>
<?php endif; ?>
<?php $block->setZone($originalZone); ?>

In above file i have just comment as custom logic at which place i have added price multiply $qty to get lineitem subtotal.

Clear cache and check it again.

Related Topic