категория: , Дорабатываем, Полезности
✎ Опубликовано: 11.02.2018 ✎ Обновлено: 18.09.2019 ☕ Просмотров: 6157 ✉ Комментарии: 6
В стандарте опенкарт сортирует по умолчанию как p.sort_order а нам же надо для каждой категории своя. Инструкция как сделать.
Приветствую! Недавно мне написал заказчик который попросил меня сделать достаточно интересную доработку. Суть ее в том что надо сделать порядок сортировки товара который можно задать для каждой категории к которой будет привязан этот товар. То есть у него есть категория видеорегистраторы где регистраторы идут по своему порядку, также есть категории видеокамеры где камерам задан параметр 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 в нем есть строка
<?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';
После этого у нас на сайте будет работать разная сортировка для всех категорий товара.
Доработка сортировка рекомендованных товаров по категориям
С коробки сортировка на странице акции по цене работает не правильно. Исправляем баг Opencart
Сортировка товаров в Opencart по названию в списке никак не хотело выводить в нужном порядке. Пришлось искать обходной путь
Сортировка рекомендуемых товаров перетягиванием мышки
Сортировка товаров в корзине по порядку добавления
Читая информацию о рекламе в facebook я нашел кое что интересное
Чистый и валидный HTML и CSS код, Хорошие показатели Google Page Speed, Более 20 модулей в комплекте, Профессиональная техническая поддержка - это только часть того что есть в шаблоне
Исправляем странный баг в Opencart в удаляется товар при копировании. Этот баг присутствует в google chrome
Также в статье хочу выразить благодарность не только Виталию а и другим крутым авторам дополнений с кем приходилось иметь дело
Чтобы принимать Биткоин и Лайткоин в OpenCart, вам не нужно заполнять утомительные документы, проходить проверку и ждать несколько дней. Установите бесплатный модуль и просто введите адрес своего Биткоин и/или Лайткоин кошелька. Тогда все входящие платежи
Монобанк - прогрессивный банк без отделений в котором дают кредитные карточки с хорошим грейс периодом а также возможностью заработать открыв в нем депозит. Именно о нем и пойдет речь
Мы знаем что поисковые роботы любят текст на страницах. Однако публикуя тексты помните предназначена ли эта страница для такого текста
Небольшой пример как можно сделать автоматически содержание описания со скролом при клике на заголовок
Обзор платежного шлюза fondy который позволяет сделать онлайн оплату на сайте за любые товары или услуги
Как оптимизировать сайт для google page speed - обзор основного функционала сервиса от гугл для проверки скорости загрузки страницы
Для того что бы вывести кастомную информацию не надо много кода. Достаточно применить правильный подход и пару строк кода. Читаем в статье.
Как мне "посчастливилось" пощупать UMI CMS особенно со стороны переноса данных и почему меня до сих пор тошнит при слове UMI
В этом обзоре будут выявлены все плюсы и минусы каждого фильтра. Всего в обзоре будет 7 фильтров который продаются и развиваются. По завершению будет дана рекомендация какой же выбрать
Коллеги, давайте предоставлять хороший сервис и поднимать планку качества. Небольшая история как я обращался к разным разработчикам