Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

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


Recommended Posts

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

Надіслати
Поділитися на інших сайтах


Попробовал поставить на осторе 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'] = 'Выключено';

Надіслати
Поділитися на інших сайтах

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

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

Надіслати
Поділитися на інших сайтах

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

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

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

  • +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 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.