Категории производителя

категория: , Дорабатываем


Опубликовано: 31.05.2015 Обновлено: 28.08.2015 Просмотров: 9597 Комментарии: 26


Категории производителя

В одном из проектов интернет-магазина керамики заказчик захотел видеть в функционале магазина «Вывод коллекций плитки определенного производителя».


В одном из проектов интернет-магазина керамики заказчик захотел видеть в функционале магазина «Вывод коллекций плитки определенного производителя». Сами «коллекции» это не что иное, как категории, а товары это уже сама плитка. Решением было сделать дополнительный вывод категорий производителя.

 

Однако у нас в магазине не было связки категории и производители, а делать её в админке вручную, при этом создавая дополнительные поля в базе данных, я считаю нецелесообразным. Да и при каждом изменении, удалении или дополнении товаров, категорий каждый раз все связки категорий и производителей надо делать вручную, что согласитесь и неудобно и можно во всем запутаться.

Для вывода категорий конкретного производителя мы будем использовать связь товар с производителем, который есть в стандартном исполнении магазина. Для этого выберем сначала все товары производителя, а потом циклом, используя связь товар – категории, сделаем выборку уникальных значений всех категорий, так как в одной может быть много товаров. Этими манипуляциями мы получили все 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, что не совсем красиво, но оно не мешает и прекрасно выполняет поставленную функцию.


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


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

Катерина 31.05.2015

Добрый вечер, Николай подскажите, а вам не попадалось решение вывода логотипа производителя в список товаров. catalog.tpl (в product-grid и product-list). Заранее спасибо.
Администратор

Ответ for-opencart.com 31.05.2015

Добрый день, вот статья вывод логотипа-производителя товара

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

ROS 31.05.2015

А реально сделать описание производителя? Мне нужно прописать условия работы с производителем каждым.
Администратор

Ответ for-opencart.com 31.05.2015

Конечно реально! Для этого надо в массив

$this->data['manufacturer_categories']

добавить описание производителя и потом соответственно сделать вывод описания на странице производителя

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

Антон 31.05.2015

Подскажите ,как оформить в стилях что бы расположить эти картинки с названиями под-категорий по горизонтали.
Администратор

Ответ for-opencart.com 31.05.2015

В стилях можно прописать

.category-list>div{display:inline-block;width:200px;vertical-align:top;}

Ну вообще там все просто, стили подучите и сможете выровнять и расположить все как надо. Или же дайте ссылку на сайт я посмотрю.

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

Антон 31.05.2015

При таком расположении картинки действительно располагаются по горизонтали.Но так как названия категорий не привязаны ни к какому диву,то их просто раскидывает по всему блоку category-list.Пробовал по аналогии с category.tpl , всё равно получается не то))
Администратор

Ответ for-opencart.com 31.05.2015

Антон, учите CSS все же просто, пробуйте!

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

Михаил 31.05.2015

Здравствуйте. Подскажите, можно как-то передать в категорию и имя бренда, чтобы в категории при сортировке по производителю, к заголовку H1 добавлялось название бренда? Например: «Компьютеры от Apple»
Администратор

Ответ for-opencart.com 31.05.2015

Да, можно. Для этого надо использовать GET параметр который мы передали в качестве id производителя. Для этого в контроллере категории сделайте выборку производителя по его id и при условии что задана переменная GET['m'] подставляете в переменную heading_title

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

grechcacom 31.05.2015

Николай, скажите пожалуйста. Например у меня производитель: Атем в нем есть категория: Керамическая плитка и подкатегория-коллекция VIRUSO соответственно на странице производителя отображает все (категории и подкатегории) Как исключить главные категории а отобразить только подкатегории? Буду благодарен за ответ.
Фото комментатора

Антон 28.08.2015

Здравствуйте, При выполнении выше представленных операций, на странице производителя в вверху страницы выводится ошибка: Notice: Indirect modification of overloaded property ControllerProductManufacturer::$data has no effect in /home/i/***/***/public_html/system/modification/catalog/controller/product/manufacturer.php on line 136Notice: Indirect modification of overloaded property ControllerProductManufacturer::$data has no effect in /home/i/***/***/public_html/system/modification/catalog/controller/product/manufacturer.php on line 138Notice: Indirect modification of overloaded property ControllerProductManufacturer::$data has no effect in /home/i/***/***/public_html/system/modification/catalog/controller/product/manufacturer.php on line 149 Ругается на строчки 136: $this->data['manufacturer_id'] = $manufacturer_id; 138: $this->data['manufacturer_categories'] = array(); 149: $this->data['manufacturer_categories'][] = array( И на месте где должны быть категории, выводится ошибка: Notice: Undefined variable: manufacturer_categories in /home/i/***/***/public_html/system/modification/catalog/view/theme/default/template/product/manufacturer_info.tpl on line 24 24: <a href="<?php echo $category['href']; ?>?m=<?php echo $manufacturer_id; ?>"> Подскажите пожалуйста, как можно это исправить? Или возможно это решение не подходит для версии Opencart 2.0.3.1 (rs.2), подскажите тогда если знаете, что нужно под эту версию подправить или изменить. Заранее большое спасибо вам!
Администратор

Ответ for-opencart.com 28.08.2015

Добрый день, дело такого рода что на данный момент почти все статьи на сайте предназначены на версию 1.5 - 1.6. Для версии 2.х информация будет но позже.

Могу подсказать что отличие передаваемых переменных в Opencart 1.х и 2.х незначительно отличаются.

Для Opencart 1 данные передаются $this->data['название_переменной'] = значение;

Для Opencart 2 надо так: $data['название_переменной'] = значение;

Но есть в этой доработке замените $this->data на $data

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

Виталий 10.09.2015

тоже проблема со стилями - никак равномерно не стает. вот сайт - хелп! biomaniya.net
Администратор

Ответ for-opencart.com 10.09.2015

Ну стилями например можно сделать так .category-list>div{width:120px;display:unline-block;vertical-align:top;}

И надо каждый элемент обернуть в div

Раномерно - это по рядкам сделать то есть вывод сеткой верно?

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

Виталий 10.09.2015

Совершенно верно, надо обернуть я так думаю в файле /catalog/controller/product/manufacturer.php, но что именно - уже перепробовал вроде все и какой именно div?
Администратор

Ответ for-opencart.com 10.09.2015

Вместо этого:

  <?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;}

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

Виталий 10.09.2015

Спасибо, помогло! Кошелек WM R - пришлю на пиво!
Администратор

Ответ for-opencart.com 10.09.2015

Пожалуйста! На почту прислал файлы исправленные.

WMR: R406892170013

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

Виталий 14.09.2015

может подскажете, как их меньше в ширину сделать - сейчас 8, а надо бы 6.
Администратор

Ответ for-opencart.com 14.09.2015

Можно сделать с помощью CSS стилей width - ширина, ставим больше и будет помещаться меньше блоков

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

Вячеслав 23.09.2015

"...Этот метод будет работать, если у вас включено ЧПУ, если нет, то знак ? надо поменять на знак &." Спасибо за статью,это единственный момент который смущает.Есть ли какой то универсальный вариант для магазинов в которых есть ссылки ,как с чпу так и без?
Администратор

Ответ for-opencart.com 23.09.2015

Да, Вы правы, но я думаю что надо думать не о универсальности а о том как настроить ЧПУ. Этот метод не совсем универсальный, но он показывает принцип работы.

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

Антон 05.10.2015

Спасибо огромнейшее!
Администратор

Ответ for-opencart.com 05.10.2015

Пожалуйста, успешных разработок на Opencart :)

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

Виталий 12.10.2015

все работает отлично кроме одного производителя - почему-то выдает ошибку http://www.biomaniya.net/akademi-biokosmetiks вот страница. с другими производителями все ок
Администратор

Ответ for-opencart.com 12.10.2015

Этот код:

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'])

		);
	}		
}
Фото комментатора

Константин 27.11.2015

Здравствуйте! Подскажите, как можно избежать дублей, которые генерируются категориями производителей? Т.е. как сделать правильные ссылки у категорий?
Администратор

Ответ for-opencart.com 27.11.2015

Либо использовать rel="canonical", либо запрещать индексацию.

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

Кирилл 10.12.2015

Есть такой вопрос - этот метод очень эффективен и красив,если у производителя есть только один уровень категорий(т.е. производитель -> категория этого производителя -> товары этой категории). А вот если у производителя кроме основных категорий,к примеру, есть еще подкатегории, и в каждой из этих подкатегорий еще по несколько подкатегорий и т.д. А на самом последнем уровне ооочень много подкатегорий.То в итоге получается не очень красиво - выводится 30-40 конечных подкатегорий, причем все вперемешку, без какой либо сортировки. Есть ли возможность в вашем функционале где-то задавать какой уровень категорий выводить в итоге.Что бы, к примеру, вывести только самые главные категории этого производителя, а не десятки конечных его подкатегорий? Если такой возможности нету, то можно как-то организованно выводить все эти конечные подкатегории, что бы они, к примеру, выводились по группам, в зависимости от того к какой из главных категорий они пренадлежат?
Администратор

Ответ for-opencart.com 10.12.2015

Да все можно сделать, надо под себя дописать функционал. Как это сделать пока не смогу помочь, т.к. очень загружен.

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

Дмитрий 17.12.2015

Такой вопрос, как можно ещё добавить подсчет количества товаров этого бренда в этой категории?
Администратор

Ответ for-opencart.com 17.12.2015

Для этого надо писать функцию выбор количества товара в конкретной категории конкретного производителя - это в модели. Данные вставлять в контроллер и вывод в шаблон.

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

Евгения 23.12.2015

Это работает, но если товаров в этой категории много, при переходе на другую страницы - появляются товары других производителей.
Администратор

Ответ for-opencart.com 23.12.2015

В комментариях есть решение.

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

Анастасия 20.02.2016

Такой вопрос, при показе товаров в производителях, не корректно отображаются товары в сетке, в самих товарах все ок, как исправить http://savepic.ru/8732071.jpg Опенкарт версия Version 2.1.0.2 (rs.1)
Администратор

Ответ for-opencart.com 20.02.2016

Нужно инспектировать почему идет перенос, по картинке тяжело сказать почему так.

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

Дмитрий 20.05.2016

Добрый день! Сделал все по вашей инструкции - в принципе почти все хорошо, но на странице производителя теперь появляются следующие ошибки: Notice: Undefined index: image in /home/c/konder/public_html/vqmod/vqcache/vq2-catalog_controller_product_manufacturer.php on line 156 Notice: Undefined index: category_id in /home/c/chelklimat/konder/public_html/vqmod/vqcache/vq2-catalog_controller_product_manufacturer.php on line 163 Notice: Undefined index: name in /home/c/konder/public_html/vqmod/vqcache/vq2-catalog_controller_product_manufacturer.php on line 164 Notice: Undefined index: category_id in /home/c/konder/public_html/vqmod/vqcache/vq2-catalog_controller_product_manufacturer.php on line 166 Notice: Undefined index: image in /home/c/konder/public_html/vqmod/vqcache/vq2-catalog_controller_product_manufacturer.php on line 156 Notice: Undefined index: category_id in /home/c/konder/public_html/vqmod/vqcache/vq2-catalog_controller_product_manufacturer.php on line 163 Notice: Undefined index: name in /home/c/konder/public_html/vqmod/vqcache/vq2-catalog_controller_product_manufacturer.php on line 164 Notice: Undefined index: category_id in /home/c/konder/public_html/vqmod/vqcache/vq2-catalog_controller_product_manufacturer.php on line 166 второй вопрос - при переходе в категорию с параметром производителя m=N, товары сортируются. Но при переходе на вторую страницу в постраничной навигации - параметр слетает. Как можно решить этот вопрос? спасибо!
Администратор

Ответ for-opencart.com 20.05.2016

Добрый день, смотрите по коду что-то не так сделали.

По второму вопросу - надо редактировать контроллер категории вписать учет параметра m= для пагинации и сортировок

смотрите в сторону переменной $url

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

Дмитрий 17.05.2017

Добрый день, подскажите а что надо поменять и изменить чтобы список категорий выводился под каждым производителем на странице списка производителей ?
Администратор

Ответ for-opencart.com 17.05.2017

Много надо делать в коде - посмотрите по аналогии как сделано, но примените только для каждого бренда.

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

Кирилл 24.05.2017

Добрый день! У меня планируется, что товары могут быть еще во множестве категорий объединенных по какому-то признаку, и выводить их все нет нужды, надо вывести именно КОЛЛЕКЦИИ. Я подумал использовать для этого не categori_id, а main_category. Заменил везде в вашем коде эти значения, но на выходе получаю ошибки Notice: Undefined index: image in /www/system/storage/modification/catalog/controller/product/manufacturer.php on line 143 Notice: Undefined index: main_category in /www/system/storage/modification/catalog/controller/product/manufacturer.php on line 150 Notice: Undefined index: name in /www/system/storage/modification/catalog/controller/product/manufacturer.php on line 151 Notice: Undefined index: main_category in /www/system/storage/modification/catalog/controller/product/manufacturer.php on line 153 Notice: Undefined index: image in /www/system/storage/modification/catalog/controller/product/manufacturer.php on line 143 Что нужно исправить?
Администратор

Ответ for-opencart.com 24.05.2017

Тяжело сказать, смотрите по коду где-то не получаются данные

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

Александр 26.09.2017

Подскажите как убрать вывод главной категории, если у нее нет картинки. Вариант добавит картинку не подходит)))) Заранее боагодарен
Администратор

Ответ for-opencart.com 26.09.2017

Можно просто сделать проверку на фото. Массив $this->data['manufacturer_categories'] обворачиваем в условие if ($categories_data['image'])
Фото комментатора

Александр 07.10.2017

Ответ for-opencart.com 26.09.2017 Можно просто сделать проверку на фото. Массив $this->data['manufacturer_categories'] обворачиваем в условие if ($categories_data['image']) Все получилось! Огромное спасибо! Теперь задался вопросом вывести категории , в которых есть искомый товар на странице поиска (т.е. ищем бренд Aple и на странице поиска показываются категории с количеством найденных товаров! Может у вас есть наработки для oc 2.3? Заранее спасибо!
Администратор

Ответ for-opencart.com 07.10.2017

А все гораздо проще чем кажется. Смотрите, в доработке мы берем все товары $products_ids а из них уже забираем их категории и формируем массив категорий. В поиске надо в контроллере после строки $result = $this->model_catalog_product->getProduct(... вставить строку $products_ids = $result; и собственно весь код начиная со строки foreach ($products_ids as $id) { На сайте сделать такой же вывод как на странице производителя.
Фото комментатора

Адександр 07.10.2017

Ответ for-opencart.com 07.10.2017 А все гораздо проще чем кажется. Смотрите, в доработке мы берем все товары $products_ids а из них уже забираем их категории и формируем массив категорий. В поиске надо в контроллере после строки $result = $this->model_catalog_product->getProduct(... вставить строку $products_ids = $result; и собственно весь код начиная со строки foreach ($products_ids as $id) { На сайте сделать такой же вывод как на странице производителя. Что то не получилось, написал Вам на почту!
Фото комментатора

Владимир 20.09.2018

здравствуйте! отличное решение, все работает! Подскажите пожалуйста, как сделать, чтобы результат фильтрации показывался на странице производителя без перехода в категорию?
Администратор

Ответ for-opencart.com 20.09.2018

Не совсем понял вопрос но по коду смотрите, просто может ссылку убрать надо

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

Похожее

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