Как добавить новый фильтр по товарам в бэкофисе Prestashop 1.7

Как добавить новый фильтр по товарам в бэкофисе Prestashop 1.7

Как пере­опре­де­лить стра­ни­цы бэк-офиса?

Начи­ная с v 1.7 PrestaShop, бэко­фис посте­пен­но пере­во­дит­ся на плат­фор­му Symfony. Нет воз­мож­но­сти делать пере­опре­де­ле­ние (override) кон­трол­ле­ру, но как-то пра­вить бэко­фис всё-таки надо… Ока­зы­ва­ет­ся мож­но пере­опре­де­лять сами шаб­ло­ны, кото­рые исполь­зу­ют­ся для выво­да на экран. Теперь в админ­ке вме­сто шаб­ло­ни­за­то­ра Smarty исполь­зу­ет­ся шаб­ло­ни­за­тор Twig, кото­рый намно­го мощ­ней по воз­мож­но­стям, быст­рей и луч­ше доку­мен­ти­ро­ван. Вот с twig-шаб­ло­на­ми как раз и мож­но поиг­рать­ся”, что­бы допол­нить или убрать нуж­ную инфор­ма­цию в нуж­ном месте.

Как это вооб­ще работает

Для нача­ла надо узнать какой имен­но шаб­лон twig исполь­зу­ет­ся. Для это­го вклю­ча­ем режим отлад­ки, пере­хо­дим на нуж­ную стра­ни­цу, и в пане­ли инстру­мен­тов Symfony смот­рим раз­дел Twig, кото­рый пока­зы­ва­ет какие имен­но шаб­ло­ны задействованы.

панель инструментов Symfony

Теперь, к при­ме­ру, зная что нам нужен @PrestaShop/Admin/Product/CatalogPage/catalog.html.twig, мож­но пере­опре­де­лить его в сво­ём моду­ле. Путь @PrestaShop/Admin/Product/CatalogPage/catalog.html.twig — это в реаль­но­сти на дис­ке файл нахо­дя­щий­ся здесь: src/PrestaShopBundle/Resources/views/Admin/Product/CatalogPage/catalog.html.twig. Пред­по­ло­жим, что у нас есть какой-то про­стей­ший модуль, копи­ру­ем файл в пап­ку моду­ля modules/имя_модуля/views/PrestaShop/Admin/Product/CatalogPage/catalog.html.twig и можем делать с ним что угод­но (под­ра­зу­ме­ва­ет­ся, что мы зна­ем что-то про син­так­сис twig-шаблонов).

Пер­вая стро­ка в этом шаб­лоне самая важ­ная, она гово­рит, что шаб­лон сам осно­ван на дру­гом шаб­лоне, кото­рый нахо­дит­ся по адре­су @PrestaShop/Admin/layout.html.twig Такой код пере­пи­шет таб­ли­цу с ката­ло­гом това­ров на стро­ку Здесь был я”.

{% extends  '@PrestaShop/Admin/layout.html.twig ' %}
{% block  content %}
    Здесь был я.
{% endblock %}

Как доба­вить новый фильтр по товарам

Теперь что нуж­но кон­крет­но сде­лать для добав­ле­ния ново­го филь­тра к таб­ли­це това­ров. Нуж­но 2 фай­ла-шаб­ло­на, в каж­дый нуж­но будет вста­вить вызов сво­е­го хука, сами хуки опре­де­лим в самом моду­ле. фай­лы src/PrestaShopBundle/Resources/views/Admin/Product/CatalogPage/Lists/list.html.twig, src/PrestaShopBundle/Resources/views/Admin/Product/CatalogPage/Lists/products_table.html.twig

копи­ру­ем в соот­вет­ству­ю­щие пап­ки наше­го модуля: 

modules/​имя_​модуля/​views/​PrestaShop/​Admin/​Product/​CatalogPage/​Lists/​

В products_table.html.twig после 

<th scope="col">
    {{ ps.sortable_column_header("Category"|trans({}, 'Admin.Catalog.Feature'), 'name_category', orderBy, sortOrder) }}
</th>

добав­ля­ем вызов ново­го хука для нуж­но­го выво­да в заго­ло­вок таблицы

{{ renderhook('displayAdminCatalogTwigProductHeader') }}

В list.html.twig после 

<td>
    {{ product.name_category|default('') }}
</td>

добав­ля­ем вызов ново­го хука для нуж­но­го выво­да в тело таблицы

{{ renderhook('displayAdminCatalogTwigListingProductFields', { 'product': product }) }}

теперь в самом моду­ле доба­вить 4 хука

displayAdminCatalogTwigProductHeader для выво­да в заго­ло­вок таб­ли­цы назва­ния столбца

public function hookDisplayAdminCatalogTwigProductHeader($params)
{
    return $this->display(__FILE__, 'views/templates/hook/displayAdminCatalogTwigProductHeader.tpl');
}

содер­жи­мое фай­ла views/templates/hook/displayAdminCatalogTwigProductHeader.tpl

<th>{l s='Производитель' mod='имя_модуля'}</th>

displayAdminCatalogTwigProductFilter для выво­да в заго­ло­вок таб­ли­цы само­го поля фильтра

public function hookDisplayAdminCatalogTwigProductFilter($params)
    {
        $manufacturers = Manufacturer::getManufacturers();
        $this->context->smarty->assign(
            [
                'filter_column_name_manufacturer' => Tools::getValue('filter_column_name_manufacturer', »),
                'manufacturers' => $manufacturers,
            ]
        );
        return $this->display(__FILE__, 'views/templates/hook/displayAdminCatalogTwigProductFilter.tpl');
    }

содер­жи­мое фай­ла views/templates/hook/displayAdminCatalogTwigProductFilter.tpl

<th>
    <select name="filter_column_name_manufacturer" data-toggle="select2">
        <option value="">{l s='Производитель' mod='имя_модуля'}</option>
        {foreach from=$manufacturers item=manufacturer}
            <option value="{$manufacturer.id_manufacturer}"
                    {if $filter_column_name_manufacturer == $manufacturer.id_manufacturer} selected="selected"{/if}>
                {$manufacturer.name}
            </option>
        {/foreach}
    </select>
</th>

AdminCatalogTwigListingProductFields для выво­да зна­че­ния поля в таблицу

public function hookDisplayAdminCatalogTwigListingProductFields($params)
    {
        $this->context->smarty->assign('product', $params['product']);
        return $this->display(__FILE__, 'views/templates/hook/displayAdminCatalogTwigListingProductFields.tpl');
    }

содер­жи­мое фай­ла views/templates/hook/displayAdminCatalogTwigListingProductFields.tpl

<td>{$product.manufacturer}</td>

хук для выбор­ки по про­из­во­ди­те­лю из таб­лиц AdminProductsListingFieldsModifier

 public function hookActionAdminProductsListingFieldsModifier($params)
    {

        //Select sql
        $params['sql_select']['manufacturer'] = [
            'table' => 'm',
            'field' => 'name',
            'filtering' => \PrestaShop\PrestaShop\Adapter\Admin\AbstractAdminQueryBuilder::FILTERING_LIKE_BOTH
        ];
        //Table
        $params['sql_table']['m'] = [
            'table' => 'manufacturer',
            'join' => 'LEFT JOIN',
            'on' => 'p.`id_manufacturer` = m.`id_manufacturer`',
        ];

        //Filter
        $manufacturer_filter = Tools::getValue('filter_column_name_manufacturer',false);
        if ( $manufacturer_filter && $manufacturer_filter != '') {
            $params['sql_where'][] .= "p.id_manufacturer =".$manufacturer_filter;
        }
    }

Ссыл­ка на гото­вый модуль на github: Ска­чать модуль — пример

Поделиться / сохранить

Comments