Перейти к содержанию
  • В связи с блокировкой банка QIWI оплата через сайт не возможна.
    Для оплаты и получения дополнений просьба писать в личные сообщения
    Admin*у
    После оплаты Вам так же будет доступно скачивание дополнений и обновлений на данном форуме

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


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

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

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

 

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

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

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

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