Php 如何添加自定义产品;按“排序”;普雷斯塔索普球场?

Php 如何添加自定义产品;按“排序”;普雷斯塔索普球场?,php,symfony,model-view-controller,prestashop,prestashop-1.7,Php,Symfony,Model View Controller,Prestashop,Prestashop 1.7,我是Prestashop的新手,我正在尝试添加一个新的“排序依据”字段(默认情况下,您有:“相关性”、“名称,a到Z”、“名称,Z到a”、“价格,从低到高”、“价格,从高到低”) 正如大家所知,该功能位于名为: “Ps_facetedsearch”,链接 我试过: 编辑模块文件,这是可行的,但是如果我想保留功能,我不能再升级模块了 重写,但似乎无法使其工作,它仍然使用相同的旧模块,而不是被重写的模块 所以我的问题是: 如何以最优雅/最简单的方式在产品列表(前面)中添加额外的“排序方式”字段?

我是Prestashop的新手,我正在尝试添加一个新的“排序依据”字段(默认情况下,您有:“相关性”、“名称,a到Z”、“名称,Z到a”、“价格,从低到高”、“价格,从高到低”)

正如大家所知,该功能位于名为: “Ps_facetedsearch”,链接

我试过:

  • 编辑模块文件,这是可行的,但是如果我想保留功能,我不能再升级模块了
  • 重写,但似乎无法使其工作,它仍然使用相同的旧模块,而不是被重写的模块
所以我的问题是:

  • 如何以最优雅/最简单的方式在产品列表(前面)中添加额外的“排序方式”字段?我很想听听其他解决此问题的方法
  • 例如,如果您购买了另一个覆盖主模块的模块(“Ps_facetedsearch”,以便两个覆盖不会发生冲突),您是否可以在不覆盖的情况下执行此操作
  • 欢迎提供任何提示

    预设版本:1.7.4.2

    Ps_facetedsearch模块中需要复制/粘贴的行,以便添加额外的“排序依据”字段:

    可在Ps_FacetedsearchProductSearchProvider.php中找到
    (第117-136行)

    您可以通过覆盖
    Ps\u Facetedsearch
    模块添加自定义排序方式选项

    您可以按照以下步骤添加自定义排序顺序

    1) 在文件夹
    override/modules/ps_facetedsearch
    中添加文件
    ps_facetedsearch.php
    ;(如果不存在,则创建文件夹)和此文件中的以下代码

    <?php
    /**
     * @override Ps_Facetedsearch
     */
    
    if (!defined('_PS_VERSION_')) {
        exit;
    }
    
    require_once implode(DIRECTORY_SEPARATOR, array(
        __DIR__, 'src', 'Ps_FacetedsearchProductSearchProvider.php',
    ));
    
    class Ps_FacetedsearchOverride extends Ps_Facetedsearch
    {
        public function hookProductSearchProvider($params)
        {
            $query = $params['query'];
            // do something with query,
            // e.g. use $query->getIdCategory()
            // to choose a template for filters.
            // Query is an instance of:
            // PrestaShop\PrestaShop\Core\Product\Search\ProductSearchQuery
            if ($query->getIdCategory()) {
                return new Ps_FacetedsearchProductSearchProviderOverride($this);
            } else {
                return null;
            }
        }
    }
    
    3) 确保在后端启用了覆盖;从高级参数>性能

    4) 要加载覆盖,您需要
    重新索引
    自动加载,为此,您需要删除
    class_index.php
    文件;从
    var/cache/dev
    var/cache/prod
    文件夹中删除
    class_index.php
    文件

    5) 检查你的商店;将添加新的自定义排序顺序


    希望有帮助

    您可以通过覆盖
    Ps\u Facetedsearch
    模块添加自定义排序方式选项

    您可以按照以下步骤添加自定义排序顺序

    1) 在文件夹
    override/modules/ps_facetedsearch
    中添加文件
    ps_facetedsearch.php
    ;(如果不存在,则创建文件夹)和此文件中的以下代码

    <?php
    /**
     * @override Ps_Facetedsearch
     */
    
    if (!defined('_PS_VERSION_')) {
        exit;
    }
    
    require_once implode(DIRECTORY_SEPARATOR, array(
        __DIR__, 'src', 'Ps_FacetedsearchProductSearchProvider.php',
    ));
    
    class Ps_FacetedsearchOverride extends Ps_Facetedsearch
    {
        public function hookProductSearchProvider($params)
        {
            $query = $params['query'];
            // do something with query,
            // e.g. use $query->getIdCategory()
            // to choose a template for filters.
            // Query is an instance of:
            // PrestaShop\PrestaShop\Core\Product\Search\ProductSearchQuery
            if ($query->getIdCategory()) {
                return new Ps_FacetedsearchProductSearchProviderOverride($this);
            } else {
                return null;
            }
        }
    }
    
    3) 确保在后端启用了覆盖;从高级参数>性能

    4) 要加载覆盖,您需要
    重新索引
    自动加载,为此,您需要删除
    class_index.php
    文件;从
    var/cache/dev
    var/cache/prod
    文件夹中删除
    class_index.php
    文件

    5) 检查你的商店;将添加新的自定义排序顺序


    希望有帮助

    适用于1.7.4.x

    • 转到/modules/ps\u facetedsearch/src
    • 打开Ps_FacetedsearchProductSearchProvider.php
    • 查找
      私有函数getAvailableSortOrders()
    • 并添加您想要的内容,如:
    (新排序器(“产品”、“日期添加”、“描述”)->setLabel( $this->module->getTranslator()->trans('dateadded:latest first',array(),'Modules.Facetedsearch.Shop') ), (新排序器(“产品”、“日期添加”、“asc”)->setLabel( $this->module->getTranslator()->trans('添加日期:最早的第一个',数组(),'Modules.Facetedsearch.Shop') ), (新排序器(“产品”、“位置”、“asc”)->setLabel( $this->module->getTranslator()->trans('Relevance',array(),'Modules.Facetedsearch.Shop')) ),

    适用于1.7.6.x

    您可以在/modules/ps_facetedsearch/src/Product/SearchProvider.php中找到该文件

    并发现:

    private function getAvailableSortOrders()
    
    对于旧版本: -themes/default/product-sort.tpl -添加如下内容:

    <option value="date_add:desc" {if $orderby eq 'date_add' AND $orderway eq 'desc'}selected="selected"{/if}>{l s='Date added: latest first'}</option>
    
    {l s='Date added:latest first'}
    

    对于1.7.4.x

    • 转到/modules/ps\u facetedsearch/src
    • 打开Ps_FacetedsearchProductSearchProvider.php
    • 查找
      私有函数getAvailableSortOrders()
    • 并添加您想要的内容,如:
    (新排序器(“产品”、“日期添加”、“描述”)->setLabel( $this->module->getTranslator()->trans('dateadded:latest first',array(),'Modules.Facetedsearch.Shop') ), (新排序器(“产品”、“日期添加”、“asc”)->setLabel( $this->module->getTranslator()->trans('添加日期:最早的第一个',数组(),'Modules.Facetedsearch.Shop') ), (新排序器(“产品”、“位置”、“asc”)->setLabel( $this->module->getTranslator()->trans('Relevance',array(),'Modules.Facetedsearch.Shop')) ),

    适用于1.7.6.x

    您可以在/modules/ps_facetedsearch/src/Product/SearchProvider.php中找到该文件

    并发现:

    private function getAvailableSortOrders()
    
    对于旧版本: -themes/default/product-sort.tpl -添加如下内容:

    <option value="date_add:desc" {if $orderby eq 'date_add' AND $orderway eq 'desc'}selected="selected"{/if}>{l s='Date added: latest first'}</option>
    
    {l s='Date added:latest first'}
    

    由于
    ps\u facetedsearch
    模块最近进行了一些更改,这里是基于@Divjesh答案的最新ps1.7.7.1版本:

  • 在文件夹
    override/modules/ps\u facetedsearch
    中添加文件
    ps\u facetedsearch.php
    (如果不存在,则创建文件夹),并将下面的代码放入该文件中

  • 由于
    ps\u facetedsearch
    模块最近进行了一些更改,这里是基于@Divjesh答案的最新ps1.7.7.1版本:

  • 在文件夹
    override/modules/ps\u facetedsearch
    中添加文件
    ps\u facetedsearch.php
    (如果不存在,则创建文件夹),并将下面的代码放入该文件中

  • 可能可以在Override的帮助下完成可能可以在Override的帮助下完成我需要包括Facetedsearch
    <?php
    
    use PrestaShop\Module\FacetedSearch\Filters;
    use PrestaShop\Module\FacetedSearch\URLSerializer;
    use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchContext;
    use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchQuery;
    use PrestaShop\PrestaShop\Core\Product\Search\SortOrder;
    
    use PrestaShop\Module\FacetedSearch\Product\SearchProvider;
    
    class SearchProviderOverride extends SearchProvider
    {
        private $_module;
        
        public function __construct(
            Ps_Facetedsearch $module,
            Filters\Converter $converter,
            URLSerializer $serializer,
            SearchFactory $searchFactory = null
        ) {
            parent::__construct($module, $converter, $serializer, $searchFactory);
            $this->_module = $module;
        }   
        
        public function runQuery(
            ProductSearchContext $context,
            ProductSearchQuery $query
        ) {
            $result = parent::runQuery($context, $query);
            $result->setAvailableSortOrders($this->getMyAvailableSortOrders());
            return $result;
        }
        
        private function getMyAvailableSortOrders()
        {
            // define your SortOrders here for example:
            $sortDateDesc = new SortOrder('product', 'date_add', 'desc');
            $translator = $this->_module->getTranslator();
            return [
                $sortDateDesc->setLabel(
                    $translator->trans('Newest', [], 'Modules.Facetedsearch.Shop')
                ),
            ];
        }
    }