Jump to content
Sign in to follow this  
SooR

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

Recommended Posts

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Попробовал поставить на осторе 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
кнопочки "Установить таблицы". не нашел :)

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Цитирую

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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) . ")";
        }
      }
    }

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

openstore_filter_2.0_clean_install.zip

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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'];
  }

Share this post


Link to post
Share on other sites

Установил на чистую 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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

  • +1 2

Share this post


Link to post
Share on other sites

Спасибо огромное 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'] = 'Выключено';

Спасибо

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

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.