2

How can we disable Quantity Box for specific product from checkout cart and minicart?

I have already search for the solution but it will disable quantity for all products reference URL

Your help will be greatly appreciated, Thanks.

2 Answers 2

3

In your custom module, do following steps.

Vendor/ModuleName/view/frontend/requirejs-config.js

var config = {
    map: {
        "*": {
            'Magento_Checkout/template/minicart/item/default.html': '[Vendor]_[Module]/template/minicart/item/default.html'
        }
    }
};

Vendor/ModuleName/view/frontend/web/template/minicart/item/default.html

<!--
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<li class="item product product-item" data-role="product-item">
    <div class="product">
        <!-- ko if: product_has_url -->
        <a data-bind="attr: {href: product_url, title: product_name}" tabindex="-1" class="product-item-photo">
            <!-- ko foreach: $parent.getRegion('itemImage') -->
                <!-- ko template: {name: getTemplate(), data: item.product_image} --><!-- /ko -->
            <!-- /ko -->
        </a>
        <!-- /ko -->
        <!-- ko ifnot: product_has_url -->
        <span class="product-item-photo">
            <!-- ko foreach: $parent.getRegion('itemImage') -->
                <!-- ko template: {name: getTemplate(), data: item.product_image} --><!-- /ko -->
            <!-- /ko -->
        </span>
        <!-- /ko -->

        <div class="product-item-details">
            <strong class="product-item-name">
                <!-- ko if: product_has_url -->
                <a data-bind="attr: {href: product_url}, html: product_name"></a>
                <!-- /ko -->
                <!-- ko ifnot: product_has_url -->
                    <!-- ko text: product_name --><!-- /ko -->
                <!-- /ko -->
            </strong>

            <!-- ko if: options.length -->
            <div class="product options" data-mage-init='{"collapsible":{"openedState": "active", "saveState": false}}'>
                <span data-role="title" class="toggle"><!-- ko i18n: 'See Details' --><!-- /ko --></span>

                <div data-role="content" class="content">
                    <strong class="subtitle"><!-- ko i18n: 'Options Details' --><!-- /ko --></strong>
                    <dl class="product options list">
                        <!-- ko foreach: { data: options, as: 'option' } -->
                        <dt class="label"><!-- ko text: option.label --><!-- /ko --></dt>
                        <dd class="values">
                            <!-- ko if: Array.isArray(option.value) -->
                                <span data-bind="html: option.value.join('<br>')"></span>
                            <!-- /ko -->
                            <!-- ko ifnot: Array.isArray(option.value) -->
                                <span data-bind="html: option.value"></span>
                            <!-- /ko -->
                        </dd>
                        <!-- /ko -->
                    </dl>
                </div>
            </div>
            <!-- /ko -->

            <div class="product-item-pricing">
                <!-- ko if: canApplyMsrp -->

                <div class="details-map">
                    <span class="label" data-bind="i18n: 'Price'"></span>
                    <span class="value" data-bind="i18n: 'See price before order confirmation.'"></span>
                </div>
                <!-- /ko -->
                <!-- ko ifnot: canApplyMsrp -->
                <!-- ko foreach: $parent.getRegion('priceSidebar') -->
                    <!-- ko template: {name: getTemplate(), data: item.product_price, as: 'price'} --><!-- /ko -->
                <!-- /ko -->
                <!-- /ko -->

                <div class="details-qty qty">
                    <label class="label" data-bind="i18n: 'Qty', attr: {
                           for: 'cart-item-'+item_id+'-qty'}"></label>
                    <input data-bind="attr: {
                           id: 'cart-item-'+item_id+'-qty',
                           'data-cart-item': item_id,
                           'data-item-qty': qty,
                           'data-cart-item-id': product_sku
                           }, value: qty, enable: isCustomizedEnabledQtyBox"
                           type="number"
                           size="4"
                           class="item-qty cart-item-qty">
                    <button data-bind="attr: {
                           id: 'update-cart-item-'+item_id,
                           'data-cart-item': item_id,
                           title: $t('Update')
                           }"
                            class="update-cart-item"
                            style="display: none">
                        <span data-bind="i18n: 'Update'"></span>
                    </button>
                </div>
            </div>

            <div class="product actions">
                <!-- ko if: is_visible_in_site_visibility -->
                <div class="primary">
                    <a data-bind="attr: {href: configure_url, title: $t('Edit item')}" class="action edit">
                        <span data-bind="i18n: 'Edit'"></span>
                    </a>
                </div>
                <!-- /ko -->
                <div class="secondary">
                    <a href="#" data-bind="attr: {'data-cart-item': item_id, title: $t('Remove item')}"
                       class="action delete">
                        <span data-bind="i18n: 'Remove'"></span>
                    </a>
                </div>
            </div>
        </div>
    </div>
</li>

Vendor/ModuleName/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Checkout\CustomerData\DefaultItem" type="[Vendor]\[Module]\Plugin\Magento\Checkout\CustomerData\DefaultItem" />
</config>

Vendor/ModuleName/Plugin/Magento/Checkout/CustomerData/DefaultItem.php

<?php

namespace [Vendor]\[Module]\Plugin\Magento\Checkout\CustomerData;

class DefaultItem extends \Magento\Checkout\CustomerData\DefaultItem
{
    protected function doGetItemData()
    {
        $result = parent::doGetItemData();
        $result['isCustomizedEnabledQtyBox'] = $this->isQtyBoxEnabled($this->item->getProduct()->getSku());
        return $result;
    }

    protected function isQtyBoxEnabled($sku)
    {
        $disabled = ['24-MB02'];
        if(!in_array($sku, $disabled))
            return 1;
        else
            return 0;
    }
}

After this,

 rm -rf generated/ var/view_preprocessed/ pub/static/frontend/ 
 php bin/magento setup:static-content-deploy -f 
 php bin/magento c:f

Clear all your browser cache and check. This should work.

0

@yash Shah : thanks for your solution, it's great ! However, how to inject an helper in file

Vendor/ModuleName/Plugin/Magento/Checkout/CustomerData/DefaultItem.php To get the sku list ? I tried to add it in __construct like usual injections but everytime my helper is null. Thanks

<?php

namespace [Vendor]\[Module]\Plugin\Magento\Checkout\CustomerData;

class DefaultItem extends \Magento\Checkout\CustomerData\DefaultItem
{
    protected $myHelper;

    public function __construct(
        \Magento\Catalog\Helper\Image $imageHelper,
        \Magento\Msrp\Helper\Data $msrpHelper,
        \Magento\Framework\UrlInterface $urlBuilder,
        \Magento\Catalog\Helper\Product\ConfigurationPool $configurationPool,
        \Magento\Checkout\Helper\Data $checkoutHelper,
        \Magento\Framework\Escaper $escaper = null,
        \Magento\Catalog\Model\Product\Configuration\Item\ItemResolverInterface $itemResolver = null,
        \[Vendor]\[Module]\Helper\Data $myHelper = null
) {
    $this->myHelper = $myHelper;
    parent::__construct($imageHelper, $msrpHelper, $urlBuilder, $configurationPool, $checkoutHelper, $escaper, $itemResolver);
}
    protected function doGetItemData()
    {
        $result = parent::doGetItemData();
        $result['isCustomizedEnabledQtyBox'] = $this->isQtyBoxEnabled($this->item->getProduct()->getSku());
        return $result;
    }

    protected function isQtyBoxEnabled($sku)
    {
        $disabled = explode([' , ',' ,',', ',','],$this->myHelper->getDisabledSkus());
        if(!in_array($sku, $disabled))
            return 1;
        else
            return 0;
    }
}

$this->myHelper is always null on line $disabled = ...

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.