Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

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


Recommended Posts

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

Link to post
Share on other sites

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

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

Link to post
Share on other sites

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

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

Сделал так:

в файле 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
Link to post
Share on other sites

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

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

Link to post
Share on other sites

LiS, я учел это и по умолчанию все сортирует. Покажите ваш магазин.
Link to post
Share on other sites

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 может отличаться! Так что не копируйте данный код, а просто исправьте при необходимости свой.

Link to post
Share on other sites

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

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

Link to post
Share on other sites

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

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

Link to post
Share on other sites

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

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

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

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

Link to post
Share on other sites

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

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

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

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

Link to post
Share on other sites

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

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

Заработало.

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

Link to post
Share on other sites

установил, настроил. галочки на чекбоксах не могу поставить...

Link to post
Share on other sites

simulacrum, может не присвоены значения к товарам?
Link to post
Share on other sites

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

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

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

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

Link to post
Share on other sites

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

  • +1 1
Link to post
Share on other sites

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

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

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

Link to post
Share on other sites

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

Link to post
Share on other sites

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

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

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

Жаль!

Link to post
Share on other sites

simulacrum, вы про калькуляцию цены при особых параметрах?
Link to post
Share on other sites

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

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

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

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

Link to post
Share on other sites

  • 2 weeks later...

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

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 опыт небольшой. Подскажите как это сделать.

Link to post
Share on other sites

LiS, )) что вы хотите сделать? Выводить опции для товара?
Link to post
Share on other sites

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++;
				}
Как я понимаю так правильнее, однако проблема остается
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.