Prestashop 1.7基于库存自动设置默认组合及库存显示优化需求
嘿,我来给你拆解这两个方案的具体实现,都是直接基于PrestaShop 1.7的核心代码修改,不用装任何模块:
方案一:自动切换默认组合到有库存的组合
这个方案的核心是,当商品的默认组合缺货时,自动替换成第一个有库存的组合,这样分类列表里就会显示有库存的组合状态。
实现步骤:
创建Product类的Override文件(推荐用这种方式,避免修改核心文件)
在你的PrestaShop根目录下创建override/classes/Product.php文件,如果已经存在就直接编辑。重写
getDefaultAttribute方法
把以下代码写入Override文件:class Product extends ProductCore { public function getDefaultAttribute($id_lang = null, $context = null) { // 先获取原默认组合ID $default_attr_id = parent::getDefaultAttribute($id_lang, $context); // 如果开启了库存管理,才执行切换逻辑 if (Configuration::get('PS_STOCK_MANAGEMENT') && $default_attr_id) { // 检查默认组合的库存 $default_stock = StockAvailable::getQuantityAvailableByProduct($this->id, $default_attr_id); if ($default_stock <= 0) { // 遍历所有商品组合,找第一个有库存的 $attributes = $this->getAttributes($id_lang); foreach ($attributes as $attr) { $attr_stock = StockAvailable::getQuantityAvailableByProduct($this->id, $attr['id_product_attribute']); if ($attr_stock > 0) { return $attr['id_product_attribute']; } } } } // 如果没有找到可用组合,返回原默认值 return $default_attr_id; } }让Override生效
删除PrestaShop根目录下cache/class_index.php文件,系统会自动重新生成类索引。
方案二:优化缺货标识逻辑(仅全组合缺货才显示)
这个方案更直接:修改缺货标识的判断逻辑,只有当商品的所有组合都缺货时,才在分类列表显示缺货标识。
实现步骤:
方式1:通过修改核心逻辑(推荐)
同样用Override方式修改Product类:
在
override/classes/Product.php中添加/修改hasStockAvailable方法:class Product extends ProductCore { public function hasStockAvailable($id_product_attribute = null) { // 如果指定了单个组合,直接判断该组合的库存 if ($id_product_attribute !== null) { return StockAvailable::getQuantityAvailableByProduct($this->id, $id_product_attribute) > 0; } // 没有指定组合时,检查所有组合是否至少有一个有库存 $attributes = $this->getAttributes(); foreach ($attributes as $attr) { if (StockAvailable::getQuantityAvailableByProduct($this->id, $attr['id_product_attribute']) > 0) { return true; } } // 没有组合或者所有组合都缺货,调用父类方法判断 return parent::hasStockAvailable($id_product_attribute); } }删除
cache/class_index.php生效。
方式2:直接修改模板文件(快速见效,但升级时可能丢失)
如果不想改PHP逻辑,可以直接修改商品列表的模板:
- 找到模板文件
templates/catalog/_partials/miniature/product-availability.tpl - 替换原来的缺货判断代码:
原代码大概是:
改成:{if !$product.available_now && !$product.available_later} <span class="label label-danger">{$smarty.const.STOCK_OUT}</span> {/if}
注意:这个方式需要确保商品列表中已经加载了{* 判断所有组合是否都缺货 *} {assign var='all_out_of_stock' value=true} {foreach from=$product.attributes item='attr'} {if $attr.stock_quantity > 0} {assign var='all_out_of_stock' value=false} {break} {/if} {/foreach} {if $all_out_of_stock} <span class="label label-danger">{$smarty.const.STOCK_OUT}</span> {/if}$product.attributes数据,如果没有的话,需要修改Product::getProducts方法来关联查询库存信息
重要提示:
- 不管用哪种方案,修改前一定要备份文件,避免操作失误导致网站崩溃。
- 用Override方式修改的好处是,后续PrestaShop升级时,只要核心类的方法没有大改动,你的修改就不会被覆盖。
内容的提问来源于stack exchange,提问作者KRMIS
相关产品推荐
相关产品推荐

