Приветствую! Недавно мне написал заказчик который попросил меня сделать достаточно интересную доработку. Суть ее в том что надо сделать порядок сортировки товара который можно задать для каждой категории к которой будет привязан этот товар. То есть у него есть категория видеорегистраторы где регистраторы идут по своему порядку, также есть категории видеокамеры где камерам задан параметр 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';

После этого у нас на сайте будет работать разная сортировка для всех категорий товара.


11.02.2018 8005
Новости из этой категории
11.09.2019 5068
В Opencart при копировании товара удаляет
Во втором Opencart замечен странный баг который вместо копирования товара в списке его удаляет. Что бы исправить необходимо открыть файлadmin/view/template/catalog/produc..
15.11.2018 17423
Как вывести любую информацию в любом месте в карточке товара
Приветствую тебя юный разработчик! Очень часто в заданиях или целых проектах у меня бывают похожие пункты. Очень популярный это вывод информационного блока в карточке тов..
29.09.2018 8222
Исправляем баг Opencart редирект с page=1 на страницу категории
В пагинации Opencart зарыто очень много багов. Например при перелистывании категории кнопками 1.2.3... у нас создаются дубли страниц, которые можно решить с помощью внедр..
28.09.2018 4612
Как при зажатии кнопки +/- делать ускоренное увеличение/уменьшение количества товара
Часто делаю калькуляторы, где есть расчеты по количеству квадратных метров, количество упаковок, добавляю +/- в товаре и другие доработки.Недавно обратился постоянный зак..
23.01.2018 9945
Пропадают заказы в Opencart - как вылечить?
Очень часто ко мне обращаются мои клиенты с просьбой разобраться почему у них пропадают заказы. То есть клиенты звонят и говорят что заказ сделали но никто не перезванива..
Вся информация, представленная на сайте, является демонстрационной и оставляя информацию о своих персональных данных, вы добровольно делаете их общедоступными.
Рекомендуем использовать обезличенные данные. Мы используем файлы cookie для вашего удобства пользования сайтом и повышения качества рекомендаций. Подробнее