Как задать разный порядок сортировки товара для каждой из категорий к которому он привязан

категория: , Дорабатываем, Полезности


Опубликовано: 11.02.2018 Просмотров: 484 Комментарии: 1


Как задать разный порядок сортировки товара для каждой из категорий к которому он привязан

В стандарте опенкарт сортирует по умолчанию как p.sort_order а нам же надо для каждой категории своя. Инструкция как сделать.


Приветствую! Недавно мне написал заказчик который попросил меня сделать достаточно интересную доработку. Суть ее в том что надо сделать порядок сортировки товара который можно задать для каждой категории к которой будет привязан этот товар. То есть у него есть категория видеорегистраторы где регистраторы идут по своему порядку, также есть категории видеокамеры где камерам задан параметр sort_order. Так вот на сайте еще есть такие разделы как готовые наборы где выводятся товары из разных категорий и сортируются в зависимости от заданного sort_order.

Чем это неудобно

Тем, что в категории готовые наборы нужна своя сортировка, например камеры идут первыми, регистраторы вторыми и т.д.То есть суть в том что одному и тому же товару можно задать разную сортировку для каждой категории. Для регистраторов будет 45 для наборов 12 - это к примеру.

В чем сложность

Дело в том что прописать сортировку дело не хитрое, но другое дело что надо еще и править выборку из базы. В стандарте опенкарт сортирует по умолчанию как p.sort_order а нам же надо для каждой категории своя.

Для начала нам надо создать в таблице product_to_category после category_sort (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 в нем есть строка

<?php if (in_array($category['category_id'], $product_category)) { ?>

там идут эти галочки для выбора категорий <input type="checkbox" и в любое место (рядом в цикле) вставляем поле ввода сортировки

<input type="text" class="hided_text" placeholder="Сорт" name="product_category[<?php echo $category['category_id']; ?>][category_order]" value="<?php echo (isset($product_category_sorts[$category['category_id']]) && $product_category_sorts[$category['category_id']]>0)?$product_category_sorts[$category['category_id']]:''; ?>" />

У меня например это было после закрывающего тега </label> После чего у нас появится возможность задать каждой категории свою сортировку.

Но, как же быть в главных категориях - во всех товарах она не задана. Выход очень простой. Откройте файл 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';

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


Комментарии:


Фото комментатора

Павел 03.04.2018

Спасибо. В инструкции еще не указано что нужно в шаблоне категории изменить имя поля в чекбоксах выбранных категорий на name="product_category[<?php echo $category['category_id']; ?>][category_id]"
Администратор

Ответ for-opencart.com 03.04.2018

Может упустил - спасибо за поправку!

Быстрый поиск

Похожее

Новое на сайте