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