категория: , Дорабатываем
✎ Опубликовано: 31.05.2015 ✎ Обновлено: 28.08.2015 ☕ Просмотров: 16587 ✉ Комментарии: 43
В одном из проектов интернет-магазина керамики заказчик захотел видеть в функционале магазина «Вывод коллекций плитки определенного производителя».
В одном из проектов интернет-магазина керамики заказчик захотел видеть в функционале магазина «Вывод коллекций плитки определенного производителя». Сами «коллекции» это не что иное, как категории, а товары это уже сама плитка. Решением было сделать дополнительный вывод категорий производителя.
Однако у нас в магазине не было связки категории и производители, а делать её в админке вручную, при этом создавая дополнительные поля в базе данных, я считаю нецелесообразным. Да и при каждом изменении, удалении или дополнении товаров, категорий каждый раз все связки категорий и производителей надо делать вручную, что согласитесь и неудобно и можно во всем запутаться.
Для вывода категорий конкретного производителя мы будем использовать связь товар с производителем, который есть в стандартном исполнении магазина. Для этого выберем сначала все товары производителя, а потом циклом, используя связь товар – категории, сделаем выборку уникальных значений всех категорий, так как в одной может быть много товаров. Этими манипуляциями мы получили все id категорий в которых есть товары определенного производителя. Остается теперь сделать выборку данных о категориях. Для этого можно использовать стандартные методы.
После получения массива с данными, выводим его на странице в opencart.
Реализацию данного функционала разделим на три этапа:
1. Открываем файл модели, и добавляем функцию для выборки категорий товара (всех тех категорий в которых присутствует товар) по адресу: /catalog/model/catalog/category.php Находим строку:
public function getCategoryFilters($category_id) {
Перед! этой строкой вставляем нашу функцию:
public function getProductCategories($product_id) { $query = $this->db->query("SELECT category_id FROM " . DB_PREFIX . "product_to_category WHERE product_id = '" . (int)$product_id . "'"); return $query->rows; }
2. Вставляем в контроллер код, который получая массив из id продуктов данного производителя делает по циклу, перебирая все id, выборку категорий каждого товара и добавляет уникальные значения id категорий в массив всех категорий в которых есть товар этого производителя. Далее мы циклом делаем выборку всех данных категории и записываем нужные (изображение, ссылка, имя) данные в массив категорий.
Для добавления этого кода переходим по адресу: /catalog/controller/product/manufacturer.php Находим строку:
$manufacturer_info = $this->model_catalog_manufacturer->getManufacturer($manufacturer_id);
Перед! этой строкой вставляем наш код::
$this->load->model('catalog/category'); $categories = array(); $products_ids = $this->model_catalog_product->getProducts(array('filter_manufacturer_id' => $manufacturer_id)); foreach ($products_ids as $id) { $manufacturer_products[] = array('product_id' => $id['product_id']); $product_categories = $this->model_catalog_category->getProductCategories($id['product_id']); foreach ($product_categories as $product_category){ if (!in_array($product_category['category_id'], $categories)) { $categories[] = $product_category['category_id']; } } } $this->data['manufacturer_categories'] = array(); foreach ($categories as $value) { $categories_data = $this->model_catalog_category->getCategory($value); if ($categories_data['image']) { $image = $this->model_tool_image->resize($categories_data['image'], $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height')); } else { $image = false; } $this->data['manufacturer_categories'][] = array( 'category_id' => $categories_data['category_id'], 'name' => $categories_data['name'], 'thumb' => $image, 'href' => $this->url->link('product/category', '&path=' . $categories_data['category_id']) ); }
3. После добавления всего программного кода, нам необходимо сделать вывод категорий производителя на страницу информации о производителе и его товарах. Для этого открываем файл шаблона по адресу: /catalog/view/theme/default/template/product/manufacturer_info.tpl Находим строку:
<?php if ($products) { ?>
Перед! этой строкой вставляем код вывода всех категорий производителя::
<?php if ($manufacturer_categories) { ?> <div class="category-list"> <?php foreach ($manufacturer_categories as $category) { ?> <div> <?php if ($category['thumb']) { ?> <a href="<?php echo $category['href']; ?>"> <img src="<?php echo $category['thumb']; ?>"> </a> <?php } ?> </div> <a href="<?php echo $category['href']; ?>"> <?php echo $category['name']; ?> </a> <?php } ?> </div> <?php } ?>
После несложных манипуляций с кодом, мы получаем категории производителя, которые формируеются автоматически.
———- UPD ———-
По просьбам людей, которые прочитали эту статью — напишу еще небольшое дополнение. При переходе в одну из категорий выводятся все товары, независимо от производителя. Как мне пишут, что в некоторых магазинах это не логично и требуется, что бы выводились товары, производителя из которого мы перешли. Для наглядности приведу пример.
Мы открыли страницу производителя Apple. С помощью этой доработки, у нас, помимо товаров, вывелись еще и категории, в которых есть товары этого бренда. Категории будут: Телефоны, Планшеты, Ноутбуки. При переходе в Телефоны у нас будет стандартный вывод всех телефонов, и Apple и Samsung и других производителей.
Так вот, требуется сделать, при заходе в категории Apple, вывод только продуктов этого производителя. Для этого нам надо как-то передать на категорию параметр фильтрации по производителю. Будем использовать старый добрый, может не такой эстетичный, но рабочий, прием с GET переменной.
Для формирования ссылки на категории с параметром фильтрации нам надо открыть контроллер производителя catalog/controller/product/manufacturer.php и перед:
$this->data['manufacturer_categories'] = array();
Добавить:
$this->data['manufacturer_id'] = $manufacturer_id;
После этого переходим в файл шаблона catalog/view/theme/default/template/product/manufacturer_info.tpl и ищем цикл вывода категорий производителя:
<?php foreach ($manufacturer_categories as $category) { ?>
Все ссылки вида:
<a href="<?php echo $category['href'];">
Делаем такими:
<a href="<?php echo $category['href']; ?>?m=<?php echo $manufacturer_id; ?>">
То есть мы добавляем параметр GET к ссылке. Этот метод будет работать, если у вас включено ЧПУ, если нет, то знак ? надо поменять на знак &.
После таких изменений у нас переходя в категорию бренда, будет передаваться данные для фильтрации по производителю. Но что бы стандартный вывод товаров в категории понял этот параметр, нам надо открыть контроллер категории catalog/controller/category.php и найти строку:
'filter_category_id' => $category_id,
После нее вставляем:
'filter_manufacturer_id' => isset($this->request->get['m'])?$this->request->get['m']:false,
После этих изменений ссылки у нас будут в конце с параметром производителя вида site.com/category/?m=11, что не совсем красиво, но оно не мешает и прекрасно выполняет поставленную функцию.
Добрый день, вот статья вывод логотипа-производителя товара
Добрый день, дело такого рода что на данный момент почти все статьи на сайте предназначены на версию 1.5 - 1.6. Для версии 2.х информация будет но позже.
Могу подсказать что отличие передаваемых переменных в Opencart 1.х и 2.х незначительно отличаются.
Для Opencart 1 данные передаются $this->data['название_переменной'] = значение;
Для Opencart 2 надо так: $data['название_переменной'] = значение;
Но есть в этой доработке замените $this->data на $data
Вместо этого:
<?php if ($manufacturer_categories) { ?> <div class="category-list"> <?php foreach ($manufacturer_categories as $category) { ?> <div> <?php if ($category['thumb']) { ?> <a href="<?php echo $category['href']; ?>"> <img src="<?php echo $category['thumb']; ?>"> </a> <?php } ?> </div> <a href="<?php echo $category['href']; ?>"> <?php echo $category['name']; ?> </a> <?php } ?> </div> <?php } ?>
надо вставить это:
<?php if ($manufacturer_categories) { ?> <div class="category-list"> <?php foreach ($manufacturer_categories as $category) { ?> <div> <div> <?php if ($category['thumb']) { ?> <a href="<?php echo $category['href']; ?>"> <img src="<?php echo $category['thumb']; ?>"> </a> <?php } ?> </div> <a href="<?php echo $category['href']; ?>"> <?php echo $category['name']; ?> </a> </div> <?php } ?> </div> <?php } ?>
Ну и стили .category-list>div{display:inline-block;vertical-align:top;width:120px;}
Этот код:
foreach ($categories as $value) { $categories_data = $this->model_catalog_category->getCategory($value); if ($categories_data['image']) { $image = $this->model_tool_image->resize($categories_data['image'], $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height')); } else { $image = false; } $this->data['manufacturer_categories'][] = array( 'category_id' => $categories_data['category_id'], 'name' => $categories_data['name'], 'thumb' => $image, 'href' => $this->url->link('product/category', '&path=' . $categories_data['category_id']) ); }
меняем на:
foreach ($categories as $value) { $categories_data = $this->model_catalog_category->getCategory($value); if(categories_data){ if ($categories_data['image']) { $image = $this->model_tool_image->resize($categories_data['image'], $this->config->get('config_image_product_width'), $this->config->get('config_image_product_height')); } else { $image = false; } $this->data['manufacturer_categories'][] = array( 'category_id' => $categories_data['category_id'], 'name' => $categories_data['name'], 'thumb' => $image, 'href' => $this->url->link('product/category', '&path=' . $categories_data['category_id']) ); } }
Часто бывает, что продаваемый товар в интернет магазине не нуждается в отдельной странице. Вот как, например, гвозди. Им не надо отдельная страница
Бывают случаи, когда в списке товаров нужно кроме основного изображения вывести и дополнительные. Например, интернет-магазин фейерверков.
В стандартной реализации Opencart не предусмотрен вывод производителя товара в категории, но в некоторых ситуациях он просто необходим.
В Opencart есть страница всех производителей. В стандартном функционале и шаблоне посетителю сайта доступно только название. Мы же будем выводить логотипы
В категории Opencart есть пагинация. С помощью нее мы переходим на следующие страницы в каталоге товаров. Но часто многим пагинация не нужна. Есть альтернативный вариант показать пользователю больше товаров не переходя на постраничную навигацию. Этот спос
Выводим все бренды категории в магазине на Opencart
Читая информацию о рекламе в facebook я нашел кое что интересное
Чистый и валидный HTML и CSS код, Хорошие показатели Google Page Speed, Более 20 модулей в комплекте, Профессиональная техническая поддержка - это только часть того что есть в шаблоне
Исправляем странный баг в Opencart в удаляется товар при копировании. Этот баг присутствует в google chrome
Также в статье хочу выразить благодарность не только Виталию а и другим крутым авторам дополнений с кем приходилось иметь дело
Чтобы принимать Биткоин и Лайткоин в OpenCart, вам не нужно заполнять утомительные документы, проходить проверку и ждать несколько дней. Установите бесплатный модуль и просто введите адрес своего Биткоин и/или Лайткоин кошелька. Тогда все входящие платежи
Монобанк - прогрессивный банк без отделений в котором дают кредитные карточки с хорошим грейс периодом а также возможностью заработать открыв в нем депозит. Именно о нем и пойдет речь
Мы знаем что поисковые роботы любят текст на страницах. Однако публикуя тексты помните предназначена ли эта страница для такого текста
Небольшой пример как можно сделать автоматически содержание описания со скролом при клике на заголовок
Обзор платежного шлюза fondy который позволяет сделать онлайн оплату на сайте за любые товары или услуги
Как оптимизировать сайт для google page speed - обзор основного функционала сервиса от гугл для проверки скорости загрузки страницы
Для того что бы вывести кастомную информацию не надо много кода. Достаточно применить правильный подход и пару строк кода. Читаем в статье.
Как мне "посчастливилось" пощупать UMI CMS особенно со стороны переноса данных и почему меня до сих пор тошнит при слове UMI
В этом обзоре будут выявлены все плюсы и минусы каждого фильтра. Всего в обзоре будет 7 фильтров который продаются и развиваются. По завершению будет дана рекомендация какой же выбрать
Коллеги, давайте предоставлять хороший сервис и поднимать планку качества. Небольшая история как я обращался к разным разработчикам