Приветствую! Недавно мне написал заказчик который попросил меня сделать достаточно интересную доработку. Суть ее в том что надо сделать порядок сортировки товара который можно задать для каждой категории к которой будет привязан этот товар. То есть у него есть категория видеорегистраторы где регистраторы идут по своему порядку, также есть категории видеокамеры где камерам задан параметр sort_order. Так вот на сайте еще есть такие разделы как готовые наборы где выводятся товары из разных категорий и сортируются в зависимости от заданного sort_order.
Чем это неудобно
Тем, что в категории готовые наборы нужна своя сортировка, например камеры идут первыми, регистраторы вторыми и т.д.То есть суть в том что одному и тому же товару можно задать разную сортировку для каждой категории. Для регистраторов будет 45 для наборов 12 - это к примеру.
В чем сложность
Дело в том что прописать сортировку дело не хитрое, но другое дело что надо еще и править выборку из базы. В стандарте опенкарт сортирует по умолчанию как p.sort_order а нам же надо для каждой категории своя.
Для начала нам надо создать в таблице product_to_category после category_order (int 11). После чего идем в файл catalog/model/product/product.php где строку
$sql .= ' ORDER BY p.sort_order';
меняем на
$sql .= ' ORDER BY p2c.category_order';
Таким образом мы говорим выборке из базы что будет сортировка согласно той что прописана в таблице product_to_category в поле p2c.category_order а туда мы будем писать порядок сортировки для каждой категории.
Далее нам надо править admin/model/catalog/product.php - это модель товара в админке. Там находим строки с
if (isset($data['product_category'])) { до if (isset($data['product_filter'])) {
и все что между ними заменяем на код
if (isset($data['product_category'])) {
foreach ($data['product_category'] as $category) {
if(isset($category['category_id'])){
$this->db->query('INSERT INTO ' . DB_PREFIX . 'product_to_category SET product_id = '' . (int)$product_id . '', category_id = '' . (int)$category['category_id'] . '', category_order = '' . (int)$category['category_order'] . '''); //
}
}
}
if(isset($data['main_category_id']) && $data['main_category_id'] > 0) {
$this->db->query('DELETE FROM ' . DB_PREFIX . 'product_to_category WHERE product_id = '' . (int)$product_id . '' AND category_id = '' . (int)$data['main_category_id'] . ''');
$this->db->query('INSERT INTO ' . DB_PREFIX . 'product_to_category SET product_id = '' . (int)$product_id . '', category_id = '' . (int)$data['main_category_id'] . '', main_category = 1, category_order = '' . (int)$data['sort_order'] . ''');
}
Еще в этом файле в любое удобное место вставляем функцию выборки сортировок категорий
public function getProductCategorySorts($product_id) {
$product_category_data = array();
$query = $this->db->query('SELECT * FROM ' . DB_PREFIX . 'product_to_category WHERE product_id = '' . (int)$product_id . ''');
foreach ($query->rows as $result) {
$product_category_data[$result['category_id']] = $result['category_order'];
}
return $product_category_data;
}
Таким образом мы подготовим модель к записи не только категорий товара а и сортировку в той категории. После этого можно открыть контроллер категории admin/controller/catalog/product.php и после строки
if (isset($this->request->post['product_category'])) {
добавить строки
if (isset($this->request->post['product_category'])) {
$data['product_category_sorts'] = $this->request->post['product_category'];
} elseif (isset($this->request->get['product_id'])) {
$data['product_category_sorts'] = $this->model_catalog_product->getProductCategorySorts($this->request->get['product_id']);
} else {
$data['product_category_sorts'] = array();
}
Этим мы передаем в шаблон данные какая сортировка у категории. Далее редактируем шаблон формы редактирования товара он находится по адресу admin/view/template/catalog/product_form.tpl в нем есть строка
там идут эти галочки для выбора категорий
][category_order]' value='0)?$product_category_sorts[$category['category_id']]:''; ?>' />
У меня например это было после закрывающего тега После чего у нас появится возможность задать каждой категории свою сортировку.
Но, как же быть в главных категориях - во всех товарах она не задана. Выход очень простой. Откройте файл admin/controller/common/header.php и после
public function index() {
Вставьте код прописи уже существующий сортировок товара в таблицу product_to_category что бы в главных категориях сортировка не сбилась.
$query = $this->db->query('SELECT * FROM ' . DB_PREFIX . 'product_to_category WHERE main_category = 1');
print_r($query->rows);
foreach($query->rows as $item){
$product_info = $this->db->query('SELECT sort_order FROM ' . DB_PREFIX . 'product WHERE product_id = '' . $item['product_id'] . ''');
$this->db->query('UPDATE ' . DB_PREFIX . 'product_to_category SET category_order = '' . $product_info->row['sort_order'] . '' WHERE product_id = '' . $item['product_id'] . '' AND main_category = 1');
}
После чего просто зайдите в админку обновите кеш модификаторов и удалить этот код.
Все, дело сделано, теперь у нас во вкладке Связи есть список категорий в который выводить товары и + поле ввода порядка сортировки для этих категорий.
Но для того что бы так сработало надо еще открыть контроллер категории catalog/controller/product/category.php и заменить
$sort = 'p.sort_order';
на
$sort = 'p2c.category_order';
После этого у нас на сайте будет работать разная сортировка для всех категорий товара.