PrestaShop 1.7.6.7官方模块ps_facetedsearch代码覆写求助
解决PrestaShop 1.7.6.7中覆写ps_facetedsearch模块ProductSearch.php的问题
我明白你遇到的麻烦——用传统的override文件夹尝试覆写ps_facetedsearch的核心类没成功,这其实是因为PrestaShop 1.7.x版本对模块src目录下的命名空间类,默认的override机制支持有限。下面给你两种可行的解决方案,优先推荐第一种规范的方式:
方案一:创建自定义模块进行覆写(最佳实践)
这种方式不会修改官方模块的原始文件,后续升级ps_facetedsearch也不会丢失你的修改,步骤如下:
- 创建自定义模块结构
在你的PrestaShop根目录的modules文件夹下,新建一个名为my_facetedsearch_override的文件夹,然后按照下面的结构创建文件:
modules/ └── my_facetedsearch_override/ ├── my_facetedsearch_override.php └── src/ └── Hook/ └── ProductSearch.php
- 编写主模块文件
打开my_facetedsearch_override.php,填入以下代码:
<?php if (!defined('_PS_VERSION_')) { exit; } class My_Facetedsearch_Override extends Module { public function __construct() { $this->name = 'my_facetedsearch_override'; $this->tab = 'front_office_features'; $this->version = '1.0.0'; $this->author = 'Your Name'; $this->need_instance = 0; $this->ps_versions_compliancy = [ 'min' => '1.7.6.0', 'max' => _PS_VERSION_ ]; $this->bootstrap = true; parent::__construct(); $this->displayName = $this->l('My Faceted Search Override'); $this->description = $this->l('Adds manufacturer ID check to ps_facetedsearch product search provider'); } public function install() { return parent::install() && $this->registerHook('actionProductSearchProvider'); } }
- 编写覆写的钩子类
打开src/Hook/ProductSearch.php,填入以下代码——这里我们继承原模块的ProductSearch类,重写productSearchProvider方法,只修改你需要的那一行:
<?php namespace MyFacetedsearchOverride\Hook; use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchQuery; use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchResult; use PrestaShop\Module\PsFacetedSearch\Hook\ProductSearch as OriginalProductSearch; class ProductSearch extends OriginalProductSearch { public function productSearchProvider(ProductSearchQuery $query, ProductSearchResult $result) { $this->query = $query; $this->result = $result; if ($this->module->active === false) { return; } $this->assignVariables(); // 这里是你需要修改的核心代码,替换原条件 if ($query->getIdCategory() or $query->getIdManufacturer()) { $this->handleCategoryFilters(); } $this->handlePriceRange(); $this->handleAttributes(); $this->handleFeatures(); $this->handleSuppliers(); $this->handleManufacturers(); $this->handleNewProducts(); $this->handleSaleProducts(); $this->handleStockFilters(); $this->handleCustomFilters(); $this->addFacetTemplate(); } }
- 安装启用模块
登录PrestaShop后台,进入「模块管理器」,找到你创建的My Faceted Search Override模块,点击安装并启用即可。最后记得清除后台缓存(路径:高级参数 -> 性能 -> 清除缓存)。
方案二:直接修改官方模块文件(临时应急用)
如果你只是临时需要修改,不想创建新模块,可以直接编辑官方模块的文件,但要注意备份原文件,因为后续升级ps_facetedsearch模块会覆盖你的修改:
- 找到文件:
/modules/ps_facetedsearch/src/Hook/ProductSearch.php - 定位到第56行,将
if ($query->getIdCategory()) {修改为if ($query->getIdCategory() or $query->getIdManufacturer()) { - 清除PrestaShop后台缓存即可生效。
为什么传统override文件夹没生效?
PrestaShop的默认override机制主要针对核心系统类(比如classes目录下的文件),对于模块src目录下的命名空间类,1.7.6.x版本并没有提供原生的override支持,所以必须用模块覆写的方式来实现。
内容的提问来源于stack exchange,提问作者kanashin
相关产品推荐
相关产品推荐

