Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...

[Модуль] Фильтр товаров в категории 2.0 / 3.0


 Поделиться

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

Возможность есть. Скоро напишу как выводить опции и значения для категории и для отдельного товара.

Ссылка на комментарий
Поделиться на других сайтах

Возможность есть. Скоро напишу как выводить опции и значения для категории и для отдельного товара.

Жду с нетерпением)))

Ссылка на комментарий
Поделиться на других сайтах


Очень хотелось бы увидеть возможность указания нескольких значений одной характеристики (например, товар может быть как мужским, так и женским).

Тоже нужна была такая возможность.

Сделал так:

в файле admin\model\catalog\product.php строки:

// Start filter
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_to_value WHERE product_id = '" . (int)$product_id . "'");

		if (isset($data['product_to_value_id'])) {
			foreach ($data['product_to_value_id'] as $option_id => $value_id) {
				$this->db->query("INSERT INTO " . DB_PREFIX . "product_to_value SET product_id = '" . (int)$product_id . "', option_id = '" . (int)$option_id . "', value_id = '" . (int)$value_id . "'");
			}
		}
		// End filter

изменил на:

// Start filter
		$this->db->query("DELETE FROM " . DB_PREFIX . "product_to_value WHERE product_id = '" . (int)$product_id . "'");

		if (isset($data['product_to_value_id'])) {
			foreach ($data['product_to_value_id'] as $option_id => $value_arr) {
				foreach($value_arr as $value_id) {
					$this->db->query("INSERT INTO " . DB_PREFIX . "product_to_value SET product_id = '" . (int)$product_id . "', option_id = '" . (int)$option_id . "', value_id = '" . (int)$value_id . "'");
				}
			}
		}
		// End filter

в файле admin\controller\catalog\filter.php строку:

$html .= '<select name="product_to_value_id[' . $option['option_id'] . ']">';

изменил на:

$html .= '<select multiple name="product_to_value_id[' . $option['option_id'] . '][]">';
  • +1 1
Ссылка на комментарий
Поделиться на других сайтах


Еще вопрос возник...

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

Ссылка на комментарий
Поделиться на других сайтах


LiS, я учел это и по умолчанию все сортирует. Покажите ваш магазин.
Ссылка на комментарий
Поделиться на других сайтах

LiS, сравните код с вашим в category.php

if (isset($this->request->get['filter'])) {
  $url .= '&filter=' . $this->request->get['filter'];
}

$this->data['sorts'] = array();

И стоит ли переменная $url во всех элементах массива sorts?

Должно быть так:

if (isset($this->request->get['filter'])) {

$url .= '&filter=' . $this->request->get['filter'];

}

$this->data['sorts'] = array();

$this->data['sorts'][] = array('text' => $this->language->get('text_name_asc'), 'value' => 'pd.name-ASC', 'href' => $this->model_tool_seo_url->rewrite($this->url->http('product/category&path=' . $this->request->get['path'] . '&sort=pd.name&order=ASC' . $url)));

$this->data['sorts'][] = array('text' => $this->language->get('text_name_desc'), 'value' => 'pd.name-DESC', 'href' => $this->model_tool_seo_url->rewrite($this->url->http('product/category&path=' . $this->request->get['path'] . '&sort=pd.name&order=DESC' . $url)));

$this->data['sorts'][] = array('text' => $this->language->get('text_price_asc'), 'value' => 'p.price-ASC', 'href' => $this->model_tool_seo_url->rewrite($this->url->http('product/category&path=' . $this->request->get['path'] . '&sort=p.price&order=ASC' . $url)));

$this->data['sorts'][] = array('text' => $this->language->get('text_price_desc'), 'value' => 'p.price-DESC', 'href' => $this->model_tool_seo_url->rewrite($this->url->http('product/category&path=' . $this->request->get['path'] . '&sort=p.price&order=DESC' . $url)));

$this->data['sorts'][] = array('text' => $this->language->get('text_rating_desc'), 'value' => 'rating-DESC', 'href' => $this->model_tool_seo_url->rewrite($this->url->http('product/category&path=' . $this->request->get['path'] . '&sort=rating&order=DESC' . $url)));

$this->data['sorts'][] = array('text' => $this->language->get('text_rating_asc'), 'value' => 'rating-ASC', 'href' => $this->model_tool_seo_url->rewrite($this->url->http('product/category&path=' . $this->request->get['path'] . '&sort=rating&order=ASC' . $url)));

Внимание, состав элементов массива sorts в вашей версии OpenCart может отличаться! Так что не копируйте данный код, а просто исправьте при необходимости свой.

Ссылка на комментарий
Поделиться на других сайтах

Возможность есть. Скоро напишу как выводить опции и значения для категории и для отдельного товара.

А зачем всё это писать? Ведь в версии ocStore 1.0 (основанной на OpenCart 1.5) это уже будет встроено в движок?

Ссылка на комментарий
Поделиться на других сайтах


А зачем всё это писать? Ведь в версии ocStore 1.0 (основанной на OpenCart 1.5) это уже будет встроено в движок?

Вопрос в том, чтобы не заполнять отдельно список характеристик товара и отдельно настраивать фильтр, а использовать параметры одного для заполнения другого

Ссылка на комментарий
Поделиться на других сайтах


Благодарю. Разобрался с ошибкой.

У меня условие

if (isset($this->request->get['filter'])) {
$url .= '&filter=' . $this->request->get['filter'];
 }

было после использования сортировки, и поэтому переменная $url получалась всегда пустой

Ссылка на комментарий
Поделиться на других сайтах


Поставил модуль на localhost, перехожу в админке Каталог>Фильтр товара и получаю сообщение

-Доступ запрещен!

-У Вас нет прав для доступа к этой странице. Если она Вам нужна, обратитесь к администратору.

Что у меня не так, почему не работает?

Ссылка на комментарий
Поделиться на других сайтах


Boob, система -> пользователи -> группы пользователей -> Главный администратор [Изменить], ставим галки напротив catalog/filter и сохраняем
Ссылка на комментарий
Поделиться на других сайтах

Boob, система -> пользователи -> группы пользователей -> Главный администратор [Изменить], ставим галки напротив catalog/filter и сохраняем

Заработало.

Огромное спасибо!

Ссылка на комментарий
Поделиться на других сайтах


simulacrum, может не присвоены значения к товарам?
Ссылка на комментарий
Поделиться на других сайтах

Дефолтовая база - только что поставил.

Например, в iPod Classic есть option - Memory и два значения 1GB и 8GB

прописал Memory и 1GB, 8GB в Products filter.

Понимаю, мож что упустил из виду. Но не могу вьехать

Ссылка на комментарий
Поделиться на других сайтах


А в редакте товара во вкладке "Опции фильтра" вы указали эти значения?

  • +1 1
Ссылка на комментарий
Поделиться на других сайтах

Точно. Есть такой раздел. Я не обратил на него внимания. Спасибо. Отличная работа. Я было начал свой вариант пробовать. Но не успеваю - надо уже заканчивать.

Возможно, ваш вариант даже более разумен, чем дефолтовый. Я имею ввиду иерахрхию опций. С точки зрения продавца каждый товар уникален, Нельзя продать красные по цене синих и тд... У них должен быть разный товарный код, иначе будет пересортица. У Опенкарт в этом плане явное упущение с их дурацкой системой сложения и вычитания. Зачем то приходится три раза указывать количество товара, что неразумно.

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

Ссылка на комментарий
Поделиться на других сайтах


было бы здорово, если сортировать можно не только в конкретных категориях, но и по всем категориям. Так если это размер обуви, то можно было отсортировать всю обувь по этому признаку. или я снова еще не вьехал?

Ссылка на комментарий
Поделиться на других сайтах


А ну вот теперь понял, что не устраивает.

Например, при выборе товара в opencart есть возможность выбрать товар по определенному признаку - цвету, размеру и тд. то есть "опциям". Они указываются в "Available Options"

Фильтр не дает такую возможность. Так что придется искать другие пути.

Жаль!

Ссылка на комментарий
Поделиться на других сайтах


simulacrum, вы про калькуляцию цены при особых параметрах?
Ссылка на комментарий
Поделиться на других сайтах

simulacrum, вы про калькуляцию цены при особых параметрах?

Ну такой пример

Обувь или Одежда. Могут различаться цветом и размером. Кому-то надо найти товары нужного размера. Задает размер и получает список.

И, например, клиент открывает конкретную модель, скажем, "Модель 5", и уже потом /как это сделано по дефолту/, выбирает по размеру /а в вашем случае для одной модели можно указать только один размер/.

Ссылка на комментарий
Поделиться на других сайтах


  • 2 недели спустя...

Я сейчас пишу таблицу свойств товара, основанную на параметрах фильтра... У меня получается так:

model/catalog/product.php

public function getFilterValue($product_id, $feeld) {
		$query = $this->db->query("SELECT ".$feeld." FROM " . DB_PREFIX . "product_to_value where product_id='".(int)$product_id. "'");
		$i=0;
		while($row = mysql_fetch_array($query))
		{
			$arr[$i]=$row[$feeld];
			$i++;
		}
		return $arr;
	}

public function getFilterCategoryDescription($option_id) {
		$query = $this->db->query("SELECT name FROM " . DB_PREFIX . "category_option_description WHERE option_id='".(int)$option_id. "'");
		$opt_row=mysql_fetch_array($query);
		$opt=$opt_row['name'];
		return $opt;
	}
	
public function getFilterValueDescription($value_id) {
		$query = $this->db->query("SELECT name FROM " . DB_PREFIX . "category_option_description WHERE option_id='".(int)$value_id. "'");
		$val_row=mysql_fetch_array($query);
		$val=$val_row['name'];
		return $val;
	}

controller/product/product.php

$FilterCategory=$this->model_catalog_product->getFilterValue($product_id, 'option_id');
				$FilterValue=$this->model_catalog_product->getFilterValue($product_id, 'value_id');
				$i=0;
				foreach($FilterOptions as $FilterOptions)
				{
					$FilterCategoryDescription[$i]=$this->model_catalog_product->getFilterCategoryDescription($FilterCategory[$i]);
					$FilterValueDescription[$i]=$this->model_catalog_product->getFilterValueDescription($FilterValue[$i]);
					$i++;
				}

product.tpl

<div>
				<table border="1">
			  <?php
				$i=0;
				foreach ($FilterCategoryDescription as $FilterCategoryDescription)
				{
				echo '<tr><td>  '.$FilterCategoryDescription[$i].'</td><td>  '.$FilterValueDescription[$i].'</td></tr>' ;
				$i++;
				}
				?>
				</table>
			  </div>

Но я не знаю как передать массив в шаблон... С php опыт небольшой. Подскажите как это сделать.

Ссылка на комментарий
Поделиться на других сайтах


LiS, )) что вы хотите сделать? Выводить опции для товара?
Ссылка на комментарий
Поделиться на других сайтах

LiS, )) что вы хотите сделать? Выводить опции для товара?

Мне нужна таблица вида:

Категория фильтра - Его значение для данного товара.

Вроде этот код работает и нужные мне данные хранятся в массивах $FilterCategoryDescription[$i] $FilterValueDescription[$i], но возникли проблемы с отображением их на самой странице...

P.S. Внес изменения в код

foreach($FilterOptions as $FilterOptions)
				{
					$this->data['FilterCategoryDescription'][$i]=$this->model_catalog_product->getFilterCategoryDescription($FilterCategory[$i]);
					$this->data['FilterValueDescription'][$i]=$this->model_catalog_product->getFilterValueDescription($FilterValue[$i]);
					$i++;
				}
Как я понимаю так правильнее, однако проблема остается
Ссылка на комментарий
Поделиться на других сайтах


Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас
 Поделиться

  • Сейчас на странице   0 пользователей

    • Нет пользователей, просматривающих эту страницу.
×
×
  • Создать...

Важная информация

На нашем сайте используются файлы cookie и происходит обработка некоторых персональных данных пользователей, чтобы улучшить пользовательский интерфейс. Чтобы узнать для чего и какие персональные данные мы обрабатываем перейдите по ссылке. Если Вы нажмете «Я даю согласие», это означает, что Вы понимаете и принимаете все условия, указанные в этом Уведомлении о Конфиденциальности.