Перейти к содержанию
View in the app

A better way to browse. Learn more.

Русскоязычное сообщество Opencart

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

В связи с блокировкой банка QIWI оплата через сайт не возможна.
Для оплаты и получения дополнений просьба писать в личные сообщения 
Admin*у
или в Телеграмм https://t.me/pascha_opencart
После оплаты Вам так же будет доступно скачивание дополнений и обновлений на данном форуме

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

Рекомендуемые сообщения

Опубликовано

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

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

 

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

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

Последние посетители 0

  • Ни одного зарегистрированного пользователя не просматривает данную страницу

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.