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: скачать (обязательно сделайте резервную копию, если надумаете скопировать сами файлы).
Ахмад (29.04.2020@01:22)
Спасибо тебе огромное за эту статью, дружище! Помог очень, добавил фильтр по артикулу.