Флуд на тему PrestaShop

появилась проблема, при работе express chach, на сайте, перестаёт работать модуль
Сгруппированные функции SOD - это важный модуль, для меня, он нужен для группировки характеристик товара в карточке. Раньше всё было нормально, а сегодня обнаружил, что харакетристики не группируются, а пишутся подряд. Как решить этот вопрос?
 
Ребятушки, хэлп!
Как в админке, в каталоге товаров, добавить фильтр по производителю?
Пользуюсь престой 1.7.4.3
для 1.6 находил решение - для этого в AdminProductsController.php нужно было дописать небольшой код. пробовал - работает отлично.
перешёл на 1.7 и лишился такого удобства. может кто что подскажет?

Тоже было интересно. Подойдет вот такой модуль Для просмотра ссылки Войди или Зарегистрируйся, но для PS 1.7.4.3 нужно изменить шаблоны, которые в нем используются.
После распаковки с гитхаба проверьте права на файлы и папки модуля.

Для PS 1.7.4.3 в папке модуля создаем новые:
views/PrestaShop/Admin/Product/CatalogPage/Lists

В папке Lists добавляем два файла:

products_table.html.twig
PHP:
{#**
* 2007-2018 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/OSL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author    PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2018 PrestaShop SA
* @license   https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*#}
<div class="table-responsive">
  <table
    class="table product mt-3"
    redirecturl="{{ path('admin_product_catalog', {
        'limit': limit,
        'offset': offset,
        'orderBy': orderBy,
        'sortOrder': sortOrder
      })
    }}"
  >
    <thead class="with-filters">
      {% block product_catalog_form_table_header %}
        <tr class="column-headers">
          <th scope="col" style="width: 2rem"></th>
          <th scope="col" style="width: 5rem">
            {{ ps.sortable_column_header("ID"|trans({}, 'Admin.Global'), 'id_product', orderBy, sortOrder) }}
          </th>
          <th scope="col">
            {{ "Image"|trans({}, 'Admin.Global') }}
          </th>
          <th scope="col">
            {{ ps.sortable_column_header("Name"|trans({}, 'Admin.Global'), 'name', orderBy, sortOrder) }}
          </th>
          <th scope="col" style="width: 9%">
            {{ ps.sortable_column_header("Reference"|trans({}, 'Admin.Global'), 'reference', orderBy, sortOrder) }}
          </th>
          <th scope="col">
            {{ ps.sortable_column_header("Category"|trans({}, 'Admin.Catalog.Feature'), 'name_category', orderBy, sortOrder) }}
          </th>
          {{ renderhook('displayAdminCatalogTwigProductHeader') }}
          <th scope="col" class="text-center" style="width: 9%">
            {{ ps.sortable_column_header("Price (tax excl.)"|trans({}, 'Admin.Catalog.Feature'), 'price', orderBy, sortOrder) }}
          </th>

          {% if 'PS_STOCK_MANAGEMENT'|configuration %}
          <th scope="col" class="text-center" style="width: 9%">
            {{ ps.sortable_column_header("Quantity"|trans({}, 'Admin.Catalog.Feature'), 'sav_quantity', orderBy, sortOrder) }}
          </th>
          {% else %}
            <th></th>
          {% endif %}

          <th scope="col" class="text-center">
            {{ ps.sortable_column_header("Status"|trans({}, 'Admin.Global'), 'active', orderBy, sortOrder) }}
          </th>
          {% if has_category_filter == true %}
            <th scope="col">
              {{ ps.sortable_column_header("Position"|trans({}, 'Admin.Global'), 'position') }}
            </th>
          {% endif %}
          <th scope="col" class="text-right" style="width: 3rem; padding-right: 2rem">
              {{ "Actions"|trans({}, 'Admin.Global') }}
          </th>
        </tr>
      {% endblock %}

      {% block product_catalog_form_table_filters %}
        <tr class="column-filters">
          <th colspan="2">
            {% include 'PrestaShopBundle:Admin/Helpers:range_inputs.html.twig' with {
              'input_name': "filter_column_id_product",
              'min': '0',
              'max': '1000000',
              'minLabel': "Min"|trans({}, 'Admin.Global'),
              'maxLabel': "Max"|trans({}, 'Admin.Global'),
              'value': filter_column_id_product,
            } %}
          </th>
          <th>&nbsp;</th>
          <th>
            <input
              type="text"
              class="form-control"
              placeholder="{{ "Search name"|trans({}, 'Admin.Catalog.Help') }}"
              name="filter_column_name"
              value="{{ filter_column_name }}"
            />
          </th>
          <th>
            <input
              type="text"
              class="form-control"
              placeholder="{{ "Search ref."|trans({}, 'Admin.Catalog.Help') }}"
              name="filter_column_reference"
              value="{{ filter_column_reference }}"
            />
          </th>
          <th>
            <input
              type="text"
              class="form-control"
              placeholder="{{ "Search category"|trans({}, 'Admin.Catalog.Help') }}"
              name="filter_column_name_category"
              value="{{ filter_column_name_category }}"
            />
          </th>
          {{ renderhook('displayAdminCatalogTwigProductFilter') }}
          <th class="text-center">
            {% include 'PrestaShopBundle:Admin/Helpers:range_inputs.html.twig' with {
              'input_name': "filter_column_price",
              'min': '0',
              'max': '1000000',
              'minLabel': "Min"|trans({}, 'Admin.Global'),
              'maxLabel': "Max"|trans({}, 'Admin.Global'),
              'value': filter_column_price,
            } %}
          </th>

          {% if 'PS_STOCK_MANAGEMENT'|configuration %}
          <th class="text-center">
            {% include 'PrestaShopBundle:Admin/Helpers:range_inputs.html.twig' with {
              'input_name': "filter_column_sav_quantity",
              'min': '-1000000',
              'max': '1000000',
              'minLabel': "Min"|trans({}, 'Admin.Global'),
              'maxLabel': "Max"|trans({}, 'Admin.Global'),
              'value': filter_column_sav_quantity,
            } %}
          </th>
          {% else %}
            <th></th>
          {% endif %}

          <th id="product_filter_column_active" class="text-center">
            <div class="form-select">
              <select class="custom-select"  name="filter_column_active">
                <option value=""></option>
                <option value="1" {% if (filter_column_active is defined) and filter_column_active == '1' %}selected="selected"{% endif %}>Active</option>
                <option value="0" {% if (filter_column_active is defined) and filter_column_active == '0' %}selected="selected"{% endif %}>Inactive</option>
              </select>
            </div>
          </th>
          {% if has_category_filter == true %}
            <th>
              {% if not(activate_drag_and_drop) %}
                <input type="button" class="btn btn-outline-secondary" name="products_filter_position_asc" value="{{ "Reorder"|trans({}, 'Admin.Actions') }}" onclick="productOrderPrioritiesTable();" />
                {% else %}
                <input type="button" id="bulk_edition_save_keep" class="btn" onclick="bulkProductAction(this, 'edition');" value="{{ "Save & refresh"|trans({}, 'Admin.Actions')|raw }}" />
            {% endif %}

            </th>
          {% endif %}
          <th class="text-right" style="width: 5rem">
            <button
              type="submit"
              class="btn btn-primary"
              name="products_filter_submit"
              title="{{ "Search"|trans({}, 'Admin.Actions') }}"
            >
              <i class="material-icons">search</i>
              {{ "Search"|trans({}, 'Admin.Actions') }}
            </button>
            <button
              type="reset"
              class="btn btn-link"
              name="products_filter_reset"
              onclick="productColumnFilterReset($(this).closest('tr.column-filters'))"
              title="{{ "Reset"|trans({}, 'Admin.Actions') }}"
            >
              <i class="material-icons">clear</i>
              {{ "Reset"|trans({}, 'Admin.Actions') }}
            </button>
          </th>
        </tr>
      {% endblock %}
    </thead>
    {% block product_catalog_form_table_items %}
      {{ render(controller('PrestaShopBundle\\Controller\\Admin\\ProductController::listAction', {
        'limit': limit,
        'offset': offset,
        'orderBy': orderBy,
        'sortOrder': sortOrder,
        'products': products,
        'last_sql': last_sql
      })) }}
    {% endblock %}
  </table>
</div>

и

list.html.twig
PHP:
{#**
* 2007-2018 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/OSL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author    PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2018 PrestaShop SA
* @license   https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*#}
<tbody
    {% if activate_drag_and_drop and has_category_filter %}class="sortable"{% endif %}
    last_sql="{{ last_sql_query|escape('html_attr') }}"
>
    {% for product in products %}
    {% block product_catalog_form_table_row %}
    <tr data-uniturl="{{ product.unit_action_url|default('#') }}" data-product-id="{{ product.id_product }}">
        <td class="checkbox-column form-group">
            <div class="md-checkbox md-checkbox-inline">
                <label>
                    <input type="checkbox" id="bulk_action_selected_products-{{ product.id_product }}" name="bulk_action_selected_products[]" value="{{ product.id_product }}">
                    <i class="md-checkbox-control"></i>
                </label>
            </div>
        </td>
        <td>
            <label class="form-check-label" for="bulk_action_selected_products-{{ product.id_product }}">
                {{ product.id_product }}
            </label>
        </td>
        <td>
            <a href="{{ product.url|default('') }}#tab-step1">{{ product.image|raw }}</a>
        </td>
        <td>
            <a href="{{ product.url|default('') }}#tab-step1">{{ product.name|default('N/A'|trans({}, 'Admin.Global')) }}</a>
        </td>
        <td>
            {{ product.reference|default('') }}
        </td>
        <td>
            {{ product.name_category|default('') }}
        </td>
        {{ renderhook('displayAdminCatalogTwigListingProductFields', { 'product': product }) }}
        <td class="text-center">
            <a href="{{ product.url|default('') }}#tab-step2">{{ product.price|default('N/A'|trans({}, 'Admin.Global')) }}</a>
        </td>

        {% if 'PS_STOCK_MANAGEMENT'|configuration %}
            <td class="product-sav-quantity text-center" data-product-quantity-value="{{ product.sav_quantity|default('') }}">
                <a href="{{ product.url|default('') }}#tab-step3">
                    {% if product.sav_quantity is defined and product.sav_quantity > 0 %}
                        {{ product.sav_quantity }}
                    {% else %}
                        {{ product.sav_quantity|default('N/A'|trans({}, 'Admin.Global')) }}
                    {% endif %}
                </a>
            </td>
        {% else %}
            <td></td>
        {% endif %}
        <td class="text-center">
            {% if product.active|default(0) == 0 %}
                <a href="#" onclick="unitProductAction(this, 'activate'); return false;">
                    <i class="material-icons action-disabled">clear</i>
                </a>
            {% else %}
                <a href="#" onclick="unitProductAction(this, 'deactivate'); return false;">
                    <i class="material-icons action-enabled ">check</i>
                </a>
            {% endif %}
        </td>
        {% if product.position is defined %}
            <td {% if activate_drag_and_drop %}class="placeholder"{% endif %} style="cursor: pointer; cursor: hand;">
                {% if activate_drag_and_drop %}
                    <big><big>⇅</big></big>
                {% endif %}
                <span class="position">{{ product.position }}</span>
                <input type="hidden" name="mass_edit_action_sorted_products[]" value="{{ product.id_product }}" />
                <input type="hidden" name="mass_edit_action_sorted_positions[]" value="{{ product.position }}" />
            </td>
        {% endif %}
        <td class="text-right">
            <div class="btn-group-action">

                {% set buttons_action = [
                    {
                        "href": product.preview_url|default('#'),
                        "target": "_blank",
                        "icon": "remove_red_eye",
                        "label": "Preview"|trans({}, 'Admin.Actions')
                    }
                ] %}

                {% set buttons_action = buttons_action|merge([
                    {
                        "onclick": "unitProductAction(this, 'duplicate');",
                        "icon": "content_copy",
                        "label": "Duplicate"|trans({}, 'Admin.Actions')
                    }
                ]) %}

                {% set buttons_action = buttons_action|merge([
                    {
                        "onclick": "unitProductAction(this, 'delete');",
                        "icon": "delete",
                        "label": "Delete"|trans({}, 'Admin.Actions')
                    }
                ]) %}

                {% include '@Product/CatalogPage/Forms/form_edit_dropdown.html.twig' with {
                    'button_id': "product_list_id_" ~ product.id_product ~ "_menu",
                    'default_item': {
                        "href": product.url|default('#'),
                        "icon": "mode_edit"
                    },
                    'right': true,
                    'items': buttons_action
                } %}
            </div>
        </td>
    </tr>
    {% endblock %}
{% else %}
<tr><td colspan="11">
        {{ "There is no result for this search. Update your filters to view other products."|trans({}, 'Admin.Catalog.Notification') }}
    </td></tr>
{% endfor %}

Устанавливаем. :)
 
Тоже было интересно. Подойдет вот такой модуль Для просмотра ссылки Войди или Зарегистрируйся, но для PS 1.7.4.3 нужно изменить шаблоны, которые в нем используются.
После распаковки с гитхаба проверьте права на файлы и папки модуля.

Для PS 1.7.4.3 в папке модуля создаем новые:
views/PrestaShop/Admin/Product/CatalogPage/Lists

В папке Lists добавляем два файла:

products_table.html.twig
PHP:
{#**
* 2007-2018 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/OSL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author    PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2018 PrestaShop SA
* @license   https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*#}
<div class="table-responsive">
  <table
    class="table product mt-3"
    redirecturl="{{ path('admin_product_catalog', {
        'limit': limit,
        'offset': offset,
        'orderBy': orderBy,
        'sortOrder': sortOrder
      })
    }}"
  >
    <thead class="with-filters">
      {% block product_catalog_form_table_header %}
        <tr class="column-headers">
          <th scope="col" style="width: 2rem"></th>
          <th scope="col" style="width: 5rem">
            {{ ps.sortable_column_header("ID"|trans({}, 'Admin.Global'), 'id_product', orderBy, sortOrder) }}
          </th>
          <th scope="col">
            {{ "Image"|trans({}, 'Admin.Global') }}
          </th>
          <th scope="col">
            {{ ps.sortable_column_header("Name"|trans({}, 'Admin.Global'), 'name', orderBy, sortOrder) }}
          </th>
          <th scope="col" style="width: 9%">
            {{ ps.sortable_column_header("Reference"|trans({}, 'Admin.Global'), 'reference', orderBy, sortOrder) }}
          </th>
          <th scope="col">
            {{ ps.sortable_column_header("Category"|trans({}, 'Admin.Catalog.Feature'), 'name_category', orderBy, sortOrder) }}
          </th>
          {{ renderhook('displayAdminCatalogTwigProductHeader') }}
          <th scope="col" class="text-center" style="width: 9%">
            {{ ps.sortable_column_header("Price (tax excl.)"|trans({}, 'Admin.Catalog.Feature'), 'price', orderBy, sortOrder) }}
          </th>

          {% if 'PS_STOCK_MANAGEMENT'|configuration %}
          <th scope="col" class="text-center" style="width: 9%">
            {{ ps.sortable_column_header("Quantity"|trans({}, 'Admin.Catalog.Feature'), 'sav_quantity', orderBy, sortOrder) }}
          </th>
          {% else %}
            <th></th>
          {% endif %}

          <th scope="col" class="text-center">
            {{ ps.sortable_column_header("Status"|trans({}, 'Admin.Global'), 'active', orderBy, sortOrder) }}
          </th>
          {% if has_category_filter == true %}
            <th scope="col">
              {{ ps.sortable_column_header("Position"|trans({}, 'Admin.Global'), 'position') }}
            </th>
          {% endif %}
          <th scope="col" class="text-right" style="width: 3rem; padding-right: 2rem">
              {{ "Actions"|trans({}, 'Admin.Global') }}
          </th>
        </tr>
      {% endblock %}

      {% block product_catalog_form_table_filters %}
        <tr class="column-filters">
          <th colspan="2">
            {% include 'PrestaShopBundle:Admin/Helpers:range_inputs.html.twig' with {
              'input_name': "filter_column_id_product",
              'min': '0',
              'max': '1000000',
              'minLabel': "Min"|trans({}, 'Admin.Global'),
              'maxLabel': "Max"|trans({}, 'Admin.Global'),
              'value': filter_column_id_product,
            } %}
          </th>
          <th>&nbsp;</th>
          <th>
            <input
              type="text"
              class="form-control"
              placeholder="{{ "Search name"|trans({}, 'Admin.Catalog.Help') }}"
              name="filter_column_name"
              value="{{ filter_column_name }}"
            />
          </th>
          <th>
            <input
              type="text"
              class="form-control"
              placeholder="{{ "Search ref."|trans({}, 'Admin.Catalog.Help') }}"
              name="filter_column_reference"
              value="{{ filter_column_reference }}"
            />
          </th>
          <th>
            <input
              type="text"
              class="form-control"
              placeholder="{{ "Search category"|trans({}, 'Admin.Catalog.Help') }}"
              name="filter_column_name_category"
              value="{{ filter_column_name_category }}"
            />
          </th>
          {{ renderhook('displayAdminCatalogTwigProductFilter') }}
          <th class="text-center">
            {% include 'PrestaShopBundle:Admin/Helpers:range_inputs.html.twig' with {
              'input_name': "filter_column_price",
              'min': '0',
              'max': '1000000',
              'minLabel': "Min"|trans({}, 'Admin.Global'),
              'maxLabel': "Max"|trans({}, 'Admin.Global'),
              'value': filter_column_price,
            } %}
          </th>

          {% if 'PS_STOCK_MANAGEMENT'|configuration %}
          <th class="text-center">
            {% include 'PrestaShopBundle:Admin/Helpers:range_inputs.html.twig' with {
              'input_name': "filter_column_sav_quantity",
              'min': '-1000000',
              'max': '1000000',
              'minLabel': "Min"|trans({}, 'Admin.Global'),
              'maxLabel': "Max"|trans({}, 'Admin.Global'),
              'value': filter_column_sav_quantity,
            } %}
          </th>
          {% else %}
            <th></th>
          {% endif %}

          <th id="product_filter_column_active" class="text-center">
            <div class="form-select">
              <select class="custom-select"  name="filter_column_active">
                <option value=""></option>
                <option value="1" {% if (filter_column_active is defined) and filter_column_active == '1' %}selected="selected"{% endif %}>Active</option>
                <option value="0" {% if (filter_column_active is defined) and filter_column_active == '0' %}selected="selected"{% endif %}>Inactive</option>
              </select>
            </div>
          </th>
          {% if has_category_filter == true %}
            <th>
              {% if not(activate_drag_and_drop) %}
                <input type="button" class="btn btn-outline-secondary" name="products_filter_position_asc" value="{{ "Reorder"|trans({}, 'Admin.Actions') }}" onclick="productOrderPrioritiesTable();" />
                {% else %}
                <input type="button" id="bulk_edition_save_keep" class="btn" onclick="bulkProductAction(this, 'edition');" value="{{ "Save & refresh"|trans({}, 'Admin.Actions')|raw }}" />
            {% endif %}

            </th>
          {% endif %}
          <th class="text-right" style="width: 5rem">
            <button
              type="submit"
              class="btn btn-primary"
              name="products_filter_submit"
              title="{{ "Search"|trans({}, 'Admin.Actions') }}"
            >
              <i class="material-icons">search</i>
              {{ "Search"|trans({}, 'Admin.Actions') }}
            </button>
            <button
              type="reset"
              class="btn btn-link"
              name="products_filter_reset"
              onclick="productColumnFilterReset($(this).closest('tr.column-filters'))"
              title="{{ "Reset"|trans({}, 'Admin.Actions') }}"
            >
              <i class="material-icons">clear</i>
              {{ "Reset"|trans({}, 'Admin.Actions') }}
            </button>
          </th>
        </tr>
      {% endblock %}
    </thead>
    {% block product_catalog_form_table_items %}
      {{ render(controller('PrestaShopBundle\\Controller\\Admin\\ProductController::listAction', {
        'limit': limit,
        'offset': offset,
        'orderBy': orderBy,
        'sortOrder': sortOrder,
        'products': products,
        'last_sql': last_sql
      })) }}
    {% endblock %}
  </table>
</div>

и

list.html.twig
PHP:
{#**
* 2007-2018 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/OSL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author    PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2018 PrestaShop SA
* @license   https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*#}
<tbody
    {% if activate_drag_and_drop and has_category_filter %}class="sortable"{% endif %}
    last_sql="{{ last_sql_query|escape('html_attr') }}"
>
    {% for product in products %}
    {% block product_catalog_form_table_row %}
    <tr data-uniturl="{{ product.unit_action_url|default('#') }}" data-product-id="{{ product.id_product }}">
        <td class="checkbox-column form-group">
            <div class="md-checkbox md-checkbox-inline">
                <label>
                    <input type="checkbox" id="bulk_action_selected_products-{{ product.id_product }}" name="bulk_action_selected_products[]" value="{{ product.id_product }}">
                    <i class="md-checkbox-control"></i>
                </label>
            </div>
        </td>
        <td>
            <label class="form-check-label" for="bulk_action_selected_products-{{ product.id_product }}">
                {{ product.id_product }}
            </label>
        </td>
        <td>
            <a href="{{ product.url|default('') }}#tab-step1">{{ product.image|raw }}</a>
        </td>
        <td>
            <a href="{{ product.url|default('') }}#tab-step1">{{ product.name|default('N/A'|trans({}, 'Admin.Global')) }}</a>
        </td>
        <td>
            {{ product.reference|default('') }}
        </td>
        <td>
            {{ product.name_category|default('') }}
        </td>
        {{ renderhook('displayAdminCatalogTwigListingProductFields', { 'product': product }) }}
        <td class="text-center">
            <a href="{{ product.url|default('') }}#tab-step2">{{ product.price|default('N/A'|trans({}, 'Admin.Global')) }}</a>
        </td>

        {% if 'PS_STOCK_MANAGEMENT'|configuration %}
            <td class="product-sav-quantity text-center" data-product-quantity-value="{{ product.sav_quantity|default('') }}">
                <a href="{{ product.url|default('') }}#tab-step3">
                    {% if product.sav_quantity is defined and product.sav_quantity > 0 %}
                        {{ product.sav_quantity }}
                    {% else %}
                        {{ product.sav_quantity|default('N/A'|trans({}, 'Admin.Global')) }}
                    {% endif %}
                </a>
            </td>
        {% else %}
            <td></td>
        {% endif %}
        <td class="text-center">
            {% if product.active|default(0) == 0 %}
                <a href="#" onclick="unitProductAction(this, 'activate'); return false;">
                    <i class="material-icons action-disabled">clear</i>
                </a>
            {% else %}
                <a href="#" onclick="unitProductAction(this, 'deactivate'); return false;">
                    <i class="material-icons action-enabled ">check</i>
                </a>
            {% endif %}
        </td>
        {% if product.position is defined %}
            <td {% if activate_drag_and_drop %}class="placeholder"{% endif %} style="cursor: pointer; cursor: hand;">
                {% if activate_drag_and_drop %}
                    <big><big>⇅</big></big>
                {% endif %}
                <span class="position">{{ product.position }}</span>
                <input type="hidden" name="mass_edit_action_sorted_products[]" value="{{ product.id_product }}" />
                <input type="hidden" name="mass_edit_action_sorted_positions[]" value="{{ product.position }}" />
            </td>
        {% endif %}
        <td class="text-right">
            <div class="btn-group-action">

                {% set buttons_action = [
                    {
                        "href": product.preview_url|default('#'),
                        "target": "_blank",
                        "icon": "remove_red_eye",
                        "label": "Preview"|trans({}, 'Admin.Actions')
                    }
                ] %}

                {% set buttons_action = buttons_action|merge([
                    {
                        "onclick": "unitProductAction(this, 'duplicate');",
                        "icon": "content_copy",
                        "label": "Duplicate"|trans({}, 'Admin.Actions')
                    }
                ]) %}

                {% set buttons_action = buttons_action|merge([
                    {
                        "onclick": "unitProductAction(this, 'delete');",
                        "icon": "delete",
                        "label": "Delete"|trans({}, 'Admin.Actions')
                    }
                ]) %}

                {% include '@Product/CatalogPage/Forms/form_edit_dropdown.html.twig' with {
                    'button_id': "product_list_id_" ~ product.id_product ~ "_menu",
                    'default_item': {
                        "href": product.url|default('#'),
                        "icon": "mode_edit"
                    },
                    'right': true,
                    'items': buttons_action
                } %}
            </div>
        </td>
    </tr>
    {% endblock %}
{% else %}
<tr><td colspan="11">
        {{ "There is no result for this search. Update your filters to view other products."|trans({}, 'Admin.Catalog.Notification') }}
    </td></tr>
{% endfor %}

Устанавливаем. :)


Отличное решение! Благодарю! Все руки не доходили до этого функционала - оказывается существует готовое решение. :ay:
P.S. Для Prestashop 1.7.4.2 тоже необходимо такое же решение (с шаблонами), какое вы предложили для PS 1.7.4.3
 
Последнее редактирование:
Тоже было интересно. Подойдет вот такой модуль Для просмотра ссылки Войди или Зарегистрируйся, но для PS 1.7.4.3 нужно изменить шаблоны, которые в нем используются.
После распаковки с гитхаба проверьте права на файлы и папки модуля.

Для PS 1.7.4.3 в папке модуля создаем новые:
views/PrestaShop/Admin/Product/CatalogPage/Lists

В папке Lists добавляем два файла:

products_table.html.twig
PHP:
{#**
* 2007-2018 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/OSL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author    PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2018 PrestaShop SA
* @license   https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*#}
<div class="table-responsive">
  <table
    class="table product mt-3"
    redirecturl="{{ path('admin_product_catalog', {
        'limit': limit,
        'offset': offset,
        'orderBy': orderBy,
        'sortOrder': sortOrder
      })
    }}"
  >
    <thead class="with-filters">
      {% block product_catalog_form_table_header %}
        <tr class="column-headers">
          <th scope="col" style="width: 2rem"></th>
          <th scope="col" style="width: 5rem">
            {{ ps.sortable_column_header("ID"|trans({}, 'Admin.Global'), 'id_product', orderBy, sortOrder) }}
          </th>
          <th scope="col">
            {{ "Image"|trans({}, 'Admin.Global') }}
          </th>
          <th scope="col">
            {{ ps.sortable_column_header("Name"|trans({}, 'Admin.Global'), 'name', orderBy, sortOrder) }}
          </th>
          <th scope="col" style="width: 9%">
            {{ ps.sortable_column_header("Reference"|trans({}, 'Admin.Global'), 'reference', orderBy, sortOrder) }}
          </th>
          <th scope="col">
            {{ ps.sortable_column_header("Category"|trans({}, 'Admin.Catalog.Feature'), 'name_category', orderBy, sortOrder) }}
          </th>
          {{ renderhook('displayAdminCatalogTwigProductHeader') }}
          <th scope="col" class="text-center" style="width: 9%">
            {{ ps.sortable_column_header("Price (tax excl.)"|trans({}, 'Admin.Catalog.Feature'), 'price', orderBy, sortOrder) }}
          </th>

          {% if 'PS_STOCK_MANAGEMENT'|configuration %}
          <th scope="col" class="text-center" style="width: 9%">
            {{ ps.sortable_column_header("Quantity"|trans({}, 'Admin.Catalog.Feature'), 'sav_quantity', orderBy, sortOrder) }}
          </th>
          {% else %}
            <th></th>
          {% endif %}

          <th scope="col" class="text-center">
            {{ ps.sortable_column_header("Status"|trans({}, 'Admin.Global'), 'active', orderBy, sortOrder) }}
          </th>
          {% if has_category_filter == true %}
            <th scope="col">
              {{ ps.sortable_column_header("Position"|trans({}, 'Admin.Global'), 'position') }}
            </th>
          {% endif %}
          <th scope="col" class="text-right" style="width: 3rem; padding-right: 2rem">
              {{ "Actions"|trans({}, 'Admin.Global') }}
          </th>
        </tr>
      {% endblock %}

      {% block product_catalog_form_table_filters %}
        <tr class="column-filters">
          <th colspan="2">
            {% include 'PrestaShopBundle:Admin/Helpers:range_inputs.html.twig' with {
              'input_name': "filter_column_id_product",
              'min': '0',
              'max': '1000000',
              'minLabel': "Min"|trans({}, 'Admin.Global'),
              'maxLabel': "Max"|trans({}, 'Admin.Global'),
              'value': filter_column_id_product,
            } %}
          </th>
          <th>&nbsp;</th>
          <th>
            <input
              type="text"
              class="form-control"
              placeholder="{{ "Search name"|trans({}, 'Admin.Catalog.Help') }}"
              name="filter_column_name"
              value="{{ filter_column_name }}"
            />
          </th>
          <th>
            <input
              type="text"
              class="form-control"
              placeholder="{{ "Search ref."|trans({}, 'Admin.Catalog.Help') }}"
              name="filter_column_reference"
              value="{{ filter_column_reference }}"
            />
          </th>
          <th>
            <input
              type="text"
              class="form-control"
              placeholder="{{ "Search category"|trans({}, 'Admin.Catalog.Help') }}"
              name="filter_column_name_category"
              value="{{ filter_column_name_category }}"
            />
          </th>
          {{ renderhook('displayAdminCatalogTwigProductFilter') }}
          <th class="text-center">
            {% include 'PrestaShopBundle:Admin/Helpers:range_inputs.html.twig' with {
              'input_name': "filter_column_price",
              'min': '0',
              'max': '1000000',
              'minLabel': "Min"|trans({}, 'Admin.Global'),
              'maxLabel': "Max"|trans({}, 'Admin.Global'),
              'value': filter_column_price,
            } %}
          </th>

          {% if 'PS_STOCK_MANAGEMENT'|configuration %}
          <th class="text-center">
            {% include 'PrestaShopBundle:Admin/Helpers:range_inputs.html.twig' with {
              'input_name': "filter_column_sav_quantity",
              'min': '-1000000',
              'max': '1000000',
              'minLabel': "Min"|trans({}, 'Admin.Global'),
              'maxLabel': "Max"|trans({}, 'Admin.Global'),
              'value': filter_column_sav_quantity,
            } %}
          </th>
          {% else %}
            <th></th>
          {% endif %}

          <th id="product_filter_column_active" class="text-center">
            <div class="form-select">
              <select class="custom-select"  name="filter_column_active">
                <option value=""></option>
                <option value="1" {% if (filter_column_active is defined) and filter_column_active == '1' %}selected="selected"{% endif %}>Active</option>
                <option value="0" {% if (filter_column_active is defined) and filter_column_active == '0' %}selected="selected"{% endif %}>Inactive</option>
              </select>
            </div>
          </th>
          {% if has_category_filter == true %}
            <th>
              {% if not(activate_drag_and_drop) %}
                <input type="button" class="btn btn-outline-secondary" name="products_filter_position_asc" value="{{ "Reorder"|trans({}, 'Admin.Actions') }}" onclick="productOrderPrioritiesTable();" />
                {% else %}
                <input type="button" id="bulk_edition_save_keep" class="btn" onclick="bulkProductAction(this, 'edition');" value="{{ "Save & refresh"|trans({}, 'Admin.Actions')|raw }}" />
            {% endif %}

            </th>
          {% endif %}
          <th class="text-right" style="width: 5rem">
            <button
              type="submit"
              class="btn btn-primary"
              name="products_filter_submit"
              title="{{ "Search"|trans({}, 'Admin.Actions') }}"
            >
              <i class="material-icons">search</i>
              {{ "Search"|trans({}, 'Admin.Actions') }}
            </button>
            <button
              type="reset"
              class="btn btn-link"
              name="products_filter_reset"
              onclick="productColumnFilterReset($(this).closest('tr.column-filters'))"
              title="{{ "Reset"|trans({}, 'Admin.Actions') }}"
            >
              <i class="material-icons">clear</i>
              {{ "Reset"|trans({}, 'Admin.Actions') }}
            </button>
          </th>
        </tr>
      {% endblock %}
    </thead>
    {% block product_catalog_form_table_items %}
      {{ render(controller('PrestaShopBundle\\Controller\\Admin\\ProductController::listAction', {
        'limit': limit,
        'offset': offset,
        'orderBy': orderBy,
        'sortOrder': sortOrder,
        'products': products,
        'last_sql': last_sql
      })) }}
    {% endblock %}
  </table>
</div>

и

list.html.twig
PHP:
{#**
* 2007-2018 PrestaShop
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* https://opensource.org/licenses/OSL-3.0
* If you did not receive a copy of the license and are unable to
* obtain it through the world-wide-web, please send an email
* to license@prestashop.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future. If you wish to customize PrestaShop for your
* needs please refer to http://www.prestashop.com for more information.
*
* @author    PrestaShop SA <contact@prestashop.com>
* @copyright 2007-2018 PrestaShop SA
* @license   https://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
* International Registered Trademark & Property of PrestaShop SA
*#}
<tbody
    {% if activate_drag_and_drop and has_category_filter %}class="sortable"{% endif %}
    last_sql="{{ last_sql_query|escape('html_attr') }}"
>
    {% for product in products %}
    {% block product_catalog_form_table_row %}
    <tr data-uniturl="{{ product.unit_action_url|default('#') }}" data-product-id="{{ product.id_product }}">
        <td class="checkbox-column form-group">
            <div class="md-checkbox md-checkbox-inline">
                <label>
                    <input type="checkbox" id="bulk_action_selected_products-{{ product.id_product }}" name="bulk_action_selected_products[]" value="{{ product.id_product }}">
                    <i class="md-checkbox-control"></i>
                </label>
            </div>
        </td>
        <td>
            <label class="form-check-label" for="bulk_action_selected_products-{{ product.id_product }}">
                {{ product.id_product }}
            </label>
        </td>
        <td>
            <a href="{{ product.url|default('') }}#tab-step1">{{ product.image|raw }}</a>
        </td>
        <td>
            <a href="{{ product.url|default('') }}#tab-step1">{{ product.name|default('N/A'|trans({}, 'Admin.Global')) }}</a>
        </td>
        <td>
            {{ product.reference|default('') }}
        </td>
        <td>
            {{ product.name_category|default('') }}
        </td>
        {{ renderhook('displayAdminCatalogTwigListingProductFields', { 'product': product }) }}
        <td class="text-center">
            <a href="{{ product.url|default('') }}#tab-step2">{{ product.price|default('N/A'|trans({}, 'Admin.Global')) }}</a>
        </td>

        {% if 'PS_STOCK_MANAGEMENT'|configuration %}
            <td class="product-sav-quantity text-center" data-product-quantity-value="{{ product.sav_quantity|default('') }}">
                <a href="{{ product.url|default('') }}#tab-step3">
                    {% if product.sav_quantity is defined and product.sav_quantity > 0 %}
                        {{ product.sav_quantity }}
                    {% else %}
                        {{ product.sav_quantity|default('N/A'|trans({}, 'Admin.Global')) }}
                    {% endif %}
                </a>
            </td>
        {% else %}
            <td></td>
        {% endif %}
        <td class="text-center">
            {% if product.active|default(0) == 0 %}
                <a href="#" onclick="unitProductAction(this, 'activate'); return false;">
                    <i class="material-icons action-disabled">clear</i>
                </a>
            {% else %}
                <a href="#" onclick="unitProductAction(this, 'deactivate'); return false;">
                    <i class="material-icons action-enabled ">check</i>
                </a>
            {% endif %}
        </td>
        {% if product.position is defined %}
            <td {% if activate_drag_and_drop %}class="placeholder"{% endif %} style="cursor: pointer; cursor: hand;">
                {% if activate_drag_and_drop %}
                    <big><big>⇅</big></big>
                {% endif %}
                <span class="position">{{ product.position }}</span>
                <input type="hidden" name="mass_edit_action_sorted_products[]" value="{{ product.id_product }}" />
                <input type="hidden" name="mass_edit_action_sorted_positions[]" value="{{ product.position }}" />
            </td>
        {% endif %}
        <td class="text-right">
            <div class="btn-group-action">

                {% set buttons_action = [
                    {
                        "href": product.preview_url|default('#'),
                        "target": "_blank",
                        "icon": "remove_red_eye",
                        "label": "Preview"|trans({}, 'Admin.Actions')
                    }
                ] %}

                {% set buttons_action = buttons_action|merge([
                    {
                        "onclick": "unitProductAction(this, 'duplicate');",
                        "icon": "content_copy",
                        "label": "Duplicate"|trans({}, 'Admin.Actions')
                    }
                ]) %}

                {% set buttons_action = buttons_action|merge([
                    {
                        "onclick": "unitProductAction(this, 'delete');",
                        "icon": "delete",
                        "label": "Delete"|trans({}, 'Admin.Actions')
                    }
                ]) %}

                {% include '@Product/CatalogPage/Forms/form_edit_dropdown.html.twig' with {
                    'button_id': "product_list_id_" ~ product.id_product ~ "_menu",
                    'default_item': {
                        "href": product.url|default('#'),
                        "icon": "mode_edit"
                    },
                    'right': true,
                    'items': buttons_action
                } %}
            </div>
        </td>
    </tr>
    {% endblock %}
{% else %}
<tr><td colspan="11">
        {{ "There is no result for this search. Update your filters to view other products."|trans({}, 'Admin.Catalog.Notification') }}
    </td></tr>
{% endfor %}

Устанавливаем. :)
Огогошеньки! спасибо большое!
 
Поставила себе такой-вот чат
Для просмотра ссылки Войди или Зарегистрируйся
Гугл сгенерировал куеву хучу несуществующих страниц несмотря на все запреты.
Что теперь делать? Перенаправить всё куда-то? Оставить 404? А ошибок нагенерировал, между прочим, больше чем живых страниц.
Ошибки такого вида:
папка чата_белиберда на сотню знаков_адрес сайта_страница сайта
Что делать?
Запрет в роботс есть. Может сделать в папке индексный файл с нофоллоу и ноиндекс?
 
Скрытое содержимое доступно для зарегистрированных пользователей!
 
Так пишет когда было проиндексировано, а потом закрыли от индексации и теперь ждать пока протухнет.
Или гарантируете что изначально сразу все было запрещено?
 
Понятно. Я много и сразу всё делаю. Могло быть что угодно :confused:
 
Назад
Сверху