PrestaShop 1.8购物车:如何按最小数量增减商品数量?
解决PrestaShop 1.8购物车按最小数量步进增减的问题
1. 修正购物车模板的输入框属性
找到你当前主题的购物车商品模板,路径一般是themes/你的主题/templates/cart/cart-product.tpl,定位到数量输入框代码,确保min和data-step都绑定{$product.minimal_quantity},同时可套用你详情页的默认值判断逻辑:
<input type="number" id="quantity_wanted_{$product.id_product}_{$product.id_product_attribute}" class="form-control input-xs" name="quantity_{$product.id_product}_{$product.id_product_attribute}" value="{if in_array($product->id, array(xxx,xxx,xxx))}{$product.minimal_quantity}{else}{$product.quantity}{/if}" min="{$product.minimal_quantity}" data-step="{$product.minimal_quantity}">
2. 修改前端JS的增减逻辑
问题核心是PrestaShop默认购物车JS会忽略data-step,强制按1步进。找到主题的购物车JS文件(一般是themes/你的主题/assets/js/cart.js),替换加减按钮的点击事件逻辑:
// 处理加号按钮 $('.product-quantity .btn-plus').off('click').on('click', function() { var $input = $(this).closest('.product-quantity').find('input'); var step = parseInt($input.data('step')) || 1; var min = parseInt($input.attr('min')) || 1; $input.val(parseInt($input.val()) + step); if (parseInt($input.val()) < min) { $input.val(min); } $input.trigger('change'); }); // 处理减号按钮 $('.product-quantity .btn-minus').off('click').on('click', function() { var $input = $(this).closest('.product-quantity').find('input'); var step = parseInt($input.data('step')) || 1; var min = parseInt($input.attr('min')) || 1; var newVal = parseInt($input.val()) - step; $input.val(Math.max(newVal, min)); $input.trigger('change'); });
可选:添加输入框手动输入验证
防止用户手动输入不符合步进的数量,给输入框绑定change事件:
$('.product-quantity input').off('change').on('change', function() { var $input = $(this); var step = parseInt($input.data('step')) || 1; var min = parseInt($input.attr('min')) || 1; var val = parseInt($input.val()); if (isNaN(val) || val < min) { $input.val(min); } else { // 将输入值调整为最近的步进倍数(这里用向上取整,可按需改为向下) var remainder = val % step; if (remainder !== 0) { val = Math.ceil(val / step) * step; $input.val(val); } } // 保留原有购物车更新逻辑 updateCartQuantity($input); });
3. 后端验证(防止绕过前端限制)
前端修改后,需确保后端不会接收不符合步进的数量,推荐用钩子实现(无需修改核心文件):
- 创建或使用现有自定义模块,添加
actionCartUpdateQuantity钩子:
public function hookActionCartUpdateQuantity($params) { $id_product = $params['id_product']; $quantity = $params['quantity']; $product = new Product($id_product); $min_qty = $product->minimal_quantity; if ($quantity % $min_qty !== 0) { // 调整为最近的倍数,且不小于最小数量 $adjusted_qty = round($quantity / $min_qty) * $min_qty; $params['quantity'] = max($adjusted_qty, $min_qty); } }
- 启用该模块,后端会自动校验并调整数量。
4. 清除缓存
修改完成后,在PrestaShop后台「高级参数→性能」中清除缓存,确保修改生效。
内容的提问来源于stack exchange,提问作者redpillcoders
相关产品推荐
相关产品推荐

