Перейти к содержанию
SooR

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

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

спасибо будем тестировать сейчас

Поделиться сообщением


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

лучше думаю было бы сделать кнопочку "фильтр" , то есть, чтобы поставить галочками нужные опции и кнопочку "фильтр". а то как-то нехорошо когда после каждого выбора опции страница перегружаеться. Это только моя мысль

Поделиться сообщением


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

Попробовал поставить на осторе 2.0 метомдо обновления с предыдущего модуля через поиск изменений. вот вобщем какую ошибку выдает при попытке просмотра котегории. как я понял с префиксами беда?

[b]Notice[/b]: Undefined offset:  1 in [b]/home/o/oktclubru/bodybuildingshop/public_html/catalog/model/catalog/product.php[/b] on line [b]24[/b]Error: Unknown column 'p2v.option_id' in 'where clause'
Error No: 1054
SELECT *, p.product_id AS product_id, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM oc_review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM oc_product p LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id) LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN oc_manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN oc_stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN oc_product_to_category p2c ON (p.product_id = p2c.product_id) LEFT JOIN oc_product_to_value p2v ON (p.product_id = p2v.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '1' AND p2s.store_id = '0' AND ss.language_id = '1' AND p2c.category_id = '3' AND p2v.value_id IN (0) AND p2v.option_id IN (0) GROUP BY p.product_id ORDER BY p.sort_order DESC LIMIT 100,20
кнопочки "Установить таблицы". не нашел :)

Поделиться сообщением


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

Ставил не на чистую систему, но изменения в заменяемых файлах не делались. Но не работает, в БД разница, что добавился столбик "option_id" в таблице "product_to_value". Вот результат http://portex.com.ua/index.php?route=product/category&path=42_58

Кто подскажет что я сделал не так?

Поделиться сообщением


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

lampard, вобще-то очень даже работает.

если проблемы с конкретными параметрами - пишите подробно "что и как".

Поделиться сообщением


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

Panasonic+Msi и ценовую категорию отобрать из уже выбранных!

Поделиться сообщением


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

Цитирую

Внимание: проверено на последней версии OpenStore v1.4.9.4 (March 19, 2011) с офф. сайта

Т.е. поставил двиг, поверх модуль. Тогда все ок. Остальные нужно смотреть.

lampard что именно не работает? Я зашел, все ок..

Поделиться сообщением


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

лучше думаю было бы сделать кнопочку "фильтр" , то есть, чтобы поставить галочками нужные опции и кнопочку "фильтр". а то как-то нехорошо когда после каждого выбора опции страница перегружаеться. Это только моя мысль

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

Поделиться сообщением


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

кнопочки "Установить таблицы". не нашел :)

И не найдете, если хоть одна из таблиц фильтра уже есть.

Поделиться сообщением


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

afwollis, уже разобрались, т.к. делался update модуля, то многие option_id в product_to_value остались в нулевом значении, что недопустимо при выборке с данным запросом

if ($filter) {
      $options = array();
      $values = array();
      foreach (explode(';', $filter) as $option) {
        $parts = explode('=', $option);
        
        foreach (explode(',', $parts[1]) as $value_id) {
          $values[] = (int)$value_id;
        }
        $options[] = (int)$parts[0];
      }
      $sql .= " AND p2v.value_id IN (" . implode(",", $values) . ") AND p2v.option_id IN (" . implode(',', $options) . ")";
    }

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

if ($filter) {
      foreach (explode(';', $filter) as $option) {
        $values = explode('=', $option);
        $data = array();
        foreach (explode(',', $values[1]) as $value_id) {
          $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product_to_value WHERE value_id='" . (int)$value_id . "'");
          if ($query->rows) {
            foreach($query->rows as $row) {
              $data[] = $row['product_id'];
            }
          } else {
            unset($data);
          }
        }
        if (!empty($data)) {
          $sql .= " AND p.product_id IN (" . implode(",", $data) . ")";
        }
      }
    }

Поделиться сообщением


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

Большое СПАСИБО товарищу SooR, что помог разобраться!!!

Поделиться сообщением


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

Для избежания этой ошибки, уже всем скачавшим советую перекачать архив, там исправлено.

openstore_filter_2.0_clean_install.zip

Поделиться сообщением


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

уважаемый SooR, могли бы вы подогнать данный модуль под openstore 2.0. При чистой установке возникают ошибки, конкретно в данном файле catalog\model\catalog\product.php

В данном файле много изменений с оригинальным файлом и немного другого вида запросы. Могу выложить сюда данный файл :)

Поделиться сообщением


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

Дайте оригинальный файл.

Поделиться сообщением


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

Попробуйте...

product.php

PS>> уже залил пива, возможно где-то косяк.

Основные методы для фильтра в категории:

public function getProductsByCategoryId($category_id, $filter = 0, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20) {
		$sql = "SELECT *, pd.name AS name, p.image, m.name AS manufacturer, ss.name AS stock, (SELECT AVG(r.rating) FROM " . DB_PREFIX . "review r WHERE p.product_id = r.product_id GROUP BY r.product_id) AS rating FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.product_id) LEFT JOIN " . DB_PREFIX . "manufacturer m ON (p.manufacturer_id = m.manufacturer_id) LEFT JOIN " . DB_PREFIX . "stock_status ss ON (p.stock_status_id = ss.stock_status_id) LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (p.product_id = p2c.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND ss.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p2c.category_id = '" . (int)$category_id . "'";

    // Start filter
    if ($filter) {
      foreach (explode(';', $filter) as $option) {
        $values = explode('=', $option);
        $data = array();
        foreach (explode(',', $values[1]) as $value_id) {
          $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product_to_value WHERE value_id='" . (int)$value_id . "'");
          if ($query->rows) {
            foreach($query->rows as $row) {
              $data[] = $row['product_id'];
            }
          } else {
            unset($data);
          }
        }
        if (!empty($data)) {
          $sql .= " AND p.product_id IN (" . implode(",", $data) . ")";
        }
      }
    }
    // End filter

    $sql .= " GROUP BY p.product_id";

		$sort_data = array(
			'pd.name',
			'p.sort_order',
			'special',
			'rating',
			'p.price',
			'p.model'
		);

		if (in_array($sort, $sort_data)) {
			if ($sort == 'pd.name' || $sort == 'p.model') {
				$sql .= " ORDER BY LCASE(" . $sort . ")";
			} else {
				$sql .= " ORDER BY " . $sort;
			}
		} else {
			$sql .= " ORDER BY p.sort_order";
		}

		if ($order == 'DESC') {
			$sql .= " DESC";
		} else {
			$sql .= " ASC";
		}

		if ($start < 0) {
			$start = 0;
		}

		$sql .= " LIMIT " . (int)$start . "," . (int)$limit;

		$query = $this->db->query($sql);

		return $query->rows;
	}

	public function getTotalProductsByCategoryId($category_id = 0, $filter = 0) {

    $sql = "SELECT COUNT(DISTINCT p.product_id) AS total FROM " . DB_PREFIX . "product_to_category p2c LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id) LEFT JOIN " . DB_PREFIX . "product_to_value p2v ON (p.product_id = p2v.product_id) WHERE p.status = '1' AND p.date_available <= NOW() AND p2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND p2c.category_id = '" . (int)$category_id . "'";

    // Start filter
    if ($filter) {
      foreach (explode(';', $filter) as $option) {
        $values = explode('=', $option);
        $data = array();
        foreach (explode(',', $values[1]) as $value_id) {
          $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product_to_value WHERE value_id='" . (int)$value_id . "'");
          if ($query->rows) {
            foreach($query->rows as $row) {
              $data[] = $row['product_id'];
            }
          } else {
            unset($data);
          }
        }
        if (!empty($data)) {
          $sql .= " AND p.product_id IN (" . implode(",", $data) . ")";
        } else {
          return 0; // запрос на строке 88 ничего не вернул, а общее количество в категории нам не интересно
        }
      }
    }
    // End filter

    $query = $this->db->query($sql);

    return $query->row['total'];
  }

Поделиться сообщением


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

Установил на чистую ocStore 0.2.0. Включил модуль, установил таблицы.

В админке Каталог/Товары вываливает ошибки:

Undefined variable: enable in <b>Z:\home\opencart.loc\www\admin\view\template\catalog\product_list.tpl</b> on line <b>17</b>

Выглядит как на скриншоте.

post-4242-0-84385800-1303586053_thumb.jpg

Поделиться сообщением


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

Добавьте в контроллер product.php (метод getList) строки вида

$this->data['button_enable'] = 'Включено';

$this->data['button_disable'] = 'Выключено';

Поделиться сообщением


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

считаю что данный модель надо включить в оф сборку. так как необходим практически в любом магазине. Если конечно SooR будет не против

Поделиться сообщением


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

Нисколько не против, всё на благо развития.

Другое дело, что надо добавить еще диапазон по цене, поле для выбора где размещать опцию (везде, только в фильтре, только в характеристиках), ну и еще пару мелочей... есть идеи.

Поделиться сообщением


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

Нисколько не против, всё на благо развития.

Другое дело, что надо добавить еще диапазон по цене, поле для выбора где размещать опцию (везде, только в фильтре, только в характеристиках), ну и еще пару мелочей... есть идеи.

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

  • +1 2

Поделиться сообщением


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

Спасибо огромное SooR! Отличная работа.

Сделал все по инструкции, работает.

Возникло пару вопросов.

1) Например у меня есть 50 товаров, которые попадают под некий фильтр - "N", я проглядел где-то, или же каждому товару нужно отдельно выставлять "Опции фильтра"?

2) Не работают кнопки - "Удалить,Включено,Выключено" в - "Каталог->Товары", при нажатии Not Found The requested document was not found on this server.

Предварительно вписывал в product.php

$this->data['button_enable'] = 'Включено';
$this->data['button_disable'] = 'Выключено';

Спасибо

Поделиться сообщением


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

hotep, уж лучше мужчин и женщин разбить на категории, или под видом брендов. Или же делать зависимые опции (от выбранных значений), но это отдельная тема.

Trance around the world) скиньте полный код ошибки или страницу с ошибкой. Я написал о полной совместимости с версией, указанной по ссылке.

Поделиться сообщением


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

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

Хочется в карточке товара вывести табличку с параметрами товара, заполняемую значениями фильтра

Поделиться сообщением


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

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

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

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

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

×

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

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