Добавление нового поля фильтра товаров в админке OcStore/OpenCart 2

Код рабочий, но редактировать исходные файлы в OcStore/OpenCart нехорошо, гораздо правильней создать модуль и установить его стандартными средствами движка.
В интернете пошаговых инструкций (для новичков) по этой теме я не нашел, решил поделиться информацией. Задача: в админ-панели OpenCart (в OcStore также должно работать) на странице Каталог->Товары добавить новый фильтр по какому-нибудь существующему полю. Для примера пусть будет поле UPC:
OpenCart добавление поля

1) Файл product.php (/admin/controller/catalog/product.php)

Тут придется добавлять изменения в более чем 10 разных местах. Приятный момент в том, что особо придумывать ничего не нужно, достаточно копировать готовые куски кода и менять имена.
Так как поле UPC хранится в базе данных с типом varchar, я выбрал для копирования существующий фильтр filter_model с таким же типом данных.
Пример первого скопированного куска кода (33 строка):

if (isset($this->request->get['filter_model'])) {
$url .= '&filter_model=' . urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES, 'UTF-8'));
}
			
if (isset($this->request->get['filter_upc'])) {
$url .= '&filter_upc=' . urlencode(html_entity_decode($this->request->get['filter_upc'], ENT_QUOTES, 'UTF-8'));
}

Продолжая искать по коду "filter_model" я произвожу аналогичные действия: копирую, вставляю ниже и меняю имена. Исключение — в конце функция autocomplete, туда я не добавляю filter_upc.

2) Файл product.php (/admin/model/catalog/product.php)

В коде из каталога model происходит работа с базой данных. Ищу по filter_model, нахожу куски кода в функциях getProducts и getTotalProducts. В обоих дублирую и меняю имена:

if (!empty($data['filter_model'])) {
$sql .= " AND p.model LIKE '" . $this->db->escape($data['filter_model']) . "%'";
}
		
if (isset($data['filter_upc']) && !is_null($data['filter_upc'])) {
$sql .= " AND p.upc LIKE '" . $this->db->escape($data['filter_upc']) . "%'";
}

3) Файл product_list.tpl (/admin/view/template/catalog/product_list.tpl)

Открываем и находим последний div с классом col-sm-4, внутри него выводится поле статуса товара:

<div class="col-sm-4">

<div class="form-group">
<label class="control-label" for="input-status"><?php echo $entry_status; ?></label>
<select name="filter_status" id="input-status" class="form-control">
<option value="*"></option>
<?php if ($filter_status) { ?>
<option value="1" selected="selected"><?php echo $text_enabled; ?></option>
<?php } else { ?>
<option value="1"><?php echo $text_enabled; ?></option>
<?php } ?>
<?php if (!$filter_status && !is_null($filter_status)) { ?>
<option value="0" selected="selected"><?php echo $text_disabled; ?></option>
<?php } else { ?>
<option value="0"><?php echo $text_disabled; ?></option>
<?php } ?>
</select>
</div>

Добавляем сразу после этого:

<div class="form-group">
<label class="control-label" for="input-upc"><?php echo 'UPC'; ?></label>
<input type="text" name="filter_upc" value="<?php echo $filter_upc; ?>" placeholder="<?php echo 'UPC'; ?>" id="input-upc" class="form-control" />
</div>

То есть просто берем часть готового кода и меняем имена атрибутов и полей, например $entry_upc, $filter_upc.

В конце product_list.tpl есть javascript, который обрабатывает нажатие кнопки "Фильтр", а именно проверяет какие поля фильтра были заполнены, формирует URL и перенаправляет на него. Здесь тоже копируем кусок кода с filter_quantity, вставляем после него и меняем имена на filter_upc:

var filter_upc = $('input[name=\'filter_upc\']').val();
if (filter_upc) {
url += '&filter_upc=' + encodeURIComponent(filter_upc);
}

Готово! Проверяю работает ли фильтрация. При заполнении поля UPC и нажатии кнопки фильтра в URL-строки должно добавляться &filter_upc=[содержимое поля].

На всякий случай добавляю изменённые файлы, версия OpenCart 2.0.3.1: скачать (обязательно сделайте резервную копию, если надумаете скопировать сами файлы).

Posted under: OpenCart

Один комментарий

  • Ахмад (29.04.2020@01:22)

    Спасибо тебе огромное за эту статью, дружище! Помог очень, добавил фильтр по артикулу.

Добавить комментарий для Ахмад Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *