Как добавить пользовательское поле «Сортировать по» в prestashop? - PullRequest
0 голосов
/ 30 сентября 2018

Я новичок в Prestashop и пытаюсь добавить новое поле «Сортировать по» (где по умолчанию у вас есть: «Релевантность», «Имя, от A до Z», «Имя, от Z до A», «Цена»От низкого до высокого "," Цена от высокого до низкого ")

Как вы, ребята, знаете, функциональность находится в модуле, который называется:" Ps_facetedsearch ", ссылка здесь .

Я пытался:

  • Редактирование файлов модуля, это работает, но я больше не могу обновить модуль, если я хочу сохранить функциональность.
  • Переопределение, но не может заставить его работать, он все еще использует тот же старый модуль, а не переопределенный.

Итак, мои вопросы:

  1. Как вы можете добавить дополнительное поле «Сортировать по» в списке продуктов (спереди) наиболее элегантным / простым способом? Я хотел бы услышать о любых других подходах к этой проблеме.
  2. Можете ли вы сделать это без переопределения / s, если, например, вы купили другой модуль, который переопределяет основной модуль ("Ps_facetedsearch", такчто два переопределения не будут конфликтовать)

Любые советы приветствуются !!!

Версия PrestaShop: 1.7.4.2

Строки в модуле Ps_facetedsearch, которые мне нужно скопировать / вставить, чтобы добавить дополнительное поле «Сортировать по»:

private function getAvailableSortOrders()
{
    return [
        (new SortOrder('product', 'position', 'asc'))->setLabel(
            $this->module->getTranslator()->trans('Relevance', array(), 'Modules.Facetedsearch.Shop')
        ),
        (new SortOrder('product', 'name', 'asc'))->setLabel(
            $this->module->getTranslator()->trans('Name, A to Z', array(), 'Shop.Theme.Catalog')
        ),
        (new SortOrder('product', 'name', 'desc'))->setLabel(
            $this->module->getTranslator()->trans('Name, Z to A', array(), 'Shop.Theme.Catalog')
        ),
        (new SortOrder('product', 'price', 'asc'))->setLabel(
            $this->module->getTranslator()->trans('Price, low to high', array(), 'Shop.Theme.Catalog')
        ),
        (new SortOrder('product', 'price', 'desc'))->setLabel(
            $this->module->getTranslator()->trans('Price, high to low', array(), 'Shop.Theme.Catalog')
        )
        // copy and paste here for another one, but lose the upgradability
       // of a module.
    ];

}

Найдено в Ps_FacetedsearchProductSearchProvider.php (строки 117-136)

1 Ответ

0 голосов
/ 02 октября 2018

Вы можете добавить пользовательскую сортировку по опции, переопределив модуль Ps_Facetedsearch.

Вы можете выполнить следующие шаги, чтобы добавить пользовательскую сортировку по порядку.

1) Добавить файл ps_facetedsearch.php в папкуoverride/modules/ps_facetedsearch;(создайте папки, если они не существуют) и код ниже в этом файле.

<?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;
        }
    }
}

2) Добавьте файл Ps_FacetedsearchProductSearchProvider.php в папку override/modules/ps_facetedsearch/src;(создайте папки, если они не существуют) и добавьте в них код ниже.

<?php

require_once implode(DIRECTORY_SEPARATOR, array(
    __DIR__, '..', '..', '..', '..', 'modules', 'ps_facetedsearch', 'src', 'Ps_FacetedsearchProductSearchProvider.php',
));

require_once implode(DIRECTORY_SEPARATOR, array(
    __DIR__, '..', '..', '..', '..', 'modules', 'ps_facetedsearch', 'src', 'Ps_FacetedsearchFiltersConverter.php',
));

require_once implode(DIRECTORY_SEPARATOR, array(
    __DIR__, '..', '..', '..', '..', 'modules', 'ps_facetedsearch', 'src', 'Ps_FacetedsearchFacetsURLSerializer.php',
));

use PrestaShop\PrestaShop\Core\Product\Search\URLFragmentSerializer;
use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchProviderInterface;
use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchContext;
use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchQuery;
use PrestaShop\PrestaShop\Core\Product\Search\ProductSearchResult;
use PrestaShop\PrestaShop\Core\Product\Search\Facet;
use PrestaShop\PrestaShop\Core\Product\Search\FacetCollection;
use PrestaShop\PrestaShop\Core\Product\Search\Filter;
use PrestaShop\PrestaShop\Core\Product\Search\SortOrder;

class Ps_FacetedsearchProductSearchProviderOverride extends Ps_FacetedsearchProductSearchProvider
{
    private $module;

    public function __construct(Ps_Facetedsearch $module)
    {
        $this->module = $module;
    }

    public function runQuery(
        ProductSearchContext $context,
        ProductSearchQuery $query
    ) {
        $facetedSearch = new Ps_FacetedsearchProductSearchProvider($this->module);
        $result = $facetedSearch->runQuery($context, $query);

        $sortOrders = $this->getAvailableSortOrders();
        foreach ($sortOrders as $sortOrder) {
            $result->addAvailableSortOrder($sortOrder);
        }

        return $result;
    }

    /**
     * New sort order that needs to be appended
     * 
     * @return array
     */
    private function getAvailableSortOrders()
    {
        return [
            // add your custom sort by orders here;
        ];
    }
}

3) Убедитесь, что overrides включен в бэкэнде;из Расширенные параметры> Производительность

4) Чтобы загрузить переопределения, вам нужно re-index автозагрузки и для этого вам нужно удалить файл class_index.php;удалить файл class_index.php из папок var/cache/dev и var/cache/prod.

5) Проверить магазин;Будет добавлен новый пользовательский порядок сортировки.

Надеюсь, это поможет!

...