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

[Модуль] Фильтр товаров в категории 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, вобще-то очень даже работает.

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

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

Цитирую

Внимание: проверено на последней версии 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) . ")";
        }
      }
    }
Ссылка на комментарий
Поделиться на других сайтах

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

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