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

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


Recommended Posts

В 1.5 этот модуль частично работает. Полностью работает админка (можно задать фильтры и указать их в параметрах товара). Но вывод во фронт не получается. Что с этим делать, я не знаю:

[=== catalog/model/catalog/product.php ===]

находим функцию
	= = =
  public function getTotalProductsByCategoryId($category_id = 0) {
	= = =

меняем ее полностью на
	= = =
  public function getTotalProductsByCategoryId($category_id = 0, $filter = 0) {

    $sql = "SELECT COUNT(DISTINCT p2c.product_id) AS total FROM " . DB_PREFIX . "product_to_category p2c LEFT JOIN " . DB_PREFIX . "product p ON (p.product_id = p2c.product_id) LEFT JOIN " . DB_PREFIX . "product_to_store p2s ON (p.product_id = p2s.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 p2c.category_id = '" . (int)$category_id . "' AND p2s.store_id = '" . (int)$this->config->get('config_store_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'];
  }
	= = =

##################

так же функцию
	= = =
  public function getProductsByCategoryId($category_id, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20) {
	= = =

полностью меняем на
	= = =
  public function getProductsByCategoryId($category_id, $filter = 0, $sort = 'p.sort_order', $order = 'ASC', $start = 0, $limit = 20) {
    $sql = "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 " . 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) 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 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) . ")";
        }
      }
    }
    $sql .= " GROUP BY p.product_id";
    // End filter

    $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;
  }
	= = =
Надіслати
Поділитися на інших сайтах


Всем привет. Нашел полностью рабочий вариант для 1.5.1

Модуль Narrow By for products - Модуль платный. Полностью учитываются "на следствия параметров". Плюс есть возможность быстро убрать один из параметров (смотрите картинки на странице с модулем).

ДЕМО - колонка справа. Там где года, пол, цвет, и тд...

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


Всем привет. Нашел полностью рабочий вариант для 1.5.1

Модуль Narrow By for products

ДЕМО - колонка справа. Там где года, пол, цвет, и тд...

Такой же варинт есть в 2 раза дешевле. Да и не то это...
Надіслати
Поділитися на інших сайтах


Такой же варинт есть в 2 раза дешевле. Да и не то это...

А ссылку пжл в студию, можно? А то запарился ждать Soor-a. Сегодня наткнулся на этот модуль.

Кстати, он полностью повторяет модуль soor-a.

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


есть Narrow By и тот вариант что "в два раза дешевле"

поменялся бы на что-то (если это корректно), тем более что автор модуля ведет себя очень некрасиво (((

Ну раз не красиво, тогда в общий доступ)))

*Шутка- юмора

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


@mid431 хватит уже. Вам уже выше все сказали. Вы пытаетесь поиметь денег, на запутавшегося пользователе!

Ваш вариант, работает совершенно по "быдло принципу". Он тупо выводит параметры из _Опций товара_... и всё. И соответственно они не как не связаны, и сами по себе.

И вот почему это плохо.

1. Идем на ваш сайт

2. Мы попадаем в раздел "Постельное белье". Покупатель хочет купить постельку из Шелка, окей - Выбираем "Шелк натуральный (5)"

3. Ага в этой категории 5шт товаров из Шелка. Пока всё здорово. Ваш вариант работает.

4. Покупатель полюбовавшись на постельку их шелка, понимает что у него диван большой, и ему нужно воспользоваться фильтром - Выбираем "Двуспаль(евро) (110)" - ой, а почему сайт пишет что в категории "Шелк 5шт", откуда то взялось ещё 110 товаров?

5. Тут покупатель в ступоре, так как он видит товары из Сатина, Хлопка, и тд. Хотя пришел из "Шелк натуральный (5)"

Это простите ЧТО?! Вы ещё бабки за это вымогаете. Модуль soora и тот что я дал выше, такого себе не позволяет.

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


А ссылку пжл в студию, можно? А то запарился ждать Soor-a. Сегодня наткнулся на этот модуль.

Кстати, он полностью повторяет модуль soor-a.

http://www.opencart.com/index.php?route=extension/extension/info&extension_id=2458 - $30, OC v1.5
Надіслати
Поділитися на інших сайтах


у меня он, кстати, на ocstore 1.0.1 не заработал нормально

насколько я понял, ему нужен стандартный seo, а у меня включен seo pro

Narrow By стал нормально. нашел правда в нем ошибочку в работе... отпишу автору, надеюсь оперативно поправит

PS: уже плохо помню, но работают они вроде по разному. первый использует стандартные атрибуты товара, а для второго нужно создавать новые

  • +1 2
Надіслати
Поділитися на інших сайтах


@mid431 хватит уже. Вам уже выше все сказали. Вы пытаетесь поиметь денег, на запутавшегося пользователе!

Ваш вариант, работает совершенно по "быдло принципу". Он тупо выводит параметры из _Опций товара_... и всё. И соответственно они не как не связаны, и сами по себе.

И вот почему это плохо.

1. Идем на ваш сайт

2. Мы попадаем в раздел "Постельное белье". Покупатель хочет купить постельку из Шелка, окей - Выбираем "Шелк натуральный (5)"

3. Ага в этой категории 5шт товаров из Шелка. Пока всё здорово. Ваш вариант работает.

4. Покупатель полюбовавшись на постельку их шелка, понимает что у него диван большой, и ему нужно воспользоваться фильтром - Выбираем "Двуспаль(евро) (110)" - ой, а почему сайт пишет что в категории "Шелк 5шт", откуда то взялось ещё 110 товаров?

5. Тут покупатель в ступоре, так как он видит товары из Сатина, Хлопка, и тд. Хотя пришел из "Шелк натуральный (5)"

Это простите ЧТО?! Вы ещё бабки за это вымогаете. Модуль soora и тот что я дал выше, такого себе не позволяет.

Хотите поговорить об этом? По моему вам нужно больше отдыхать, уж больно не адекватная реакция. Хотя, конечно, можно понять.. трудно пережить то, что кто-то делает это лучше вас.. Отдохните, сходите погулять, обратитесь к психиатору, наконец. Это нельзя запускать..
Надіслати
Поділитися на інших сайтах


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

А по сути поста совсем нечего сказать? Что там неправильно изложено?
  • +1 2
Надіслати
Поділитися на інших сайтах


Amarous, задать стиле блока опции параметр line-height

В общем я сидел 3 часа... в итоге ничего не понял. помогите чайнику..

нужно сдвинуть текст на 2 пикселя вверх относительно чекбокса

перекрасить количество в скобках и изменить размер

перекрасить название фильтра и изменить размер

<?php if ($category_options) { ?>
<style type="text/css">
  #filters{line-height: 22px;}
  #filters b{display:block;padding: 2px 5px 1px 15px;}
  .filter-item{margin: 0 5px;}
  .filter-item label{margin-left:5px;padding-left:5px;display: block;cursor:pointer;}
  .filter-item label input{margin: 0 3px;}
  .filter-item label a{text-decoration:none;color: #236BBB;}
  .filter-item label.active a{color: #E56101;font-weight:bold;}
  .filter-item select{margin-left:10px;min-width:100px;}
  .filter-item label + label{border-top: 1px solid #ECECEC;}
</style>
<div class="box">
  <div class="top"><img src="catalog/view/theme/default/image/filter.png" alt="" /><?php echo $heading_title; ?></div>
  <div class="middle">
    <form id="filters">
      <?php foreach ($category_options as $category_option) { ?>
        <b><?php echo $category_option['name']; ?></b>
        <div class="filter-item">
        <?php if ($category_option['values']) { ?>
          <?php foreach ($category_option['values'] as $value) { ?>
            <?php if (in_array($value['value_id'], $filter_values_id)) { ?>
              <label class="active"><input type="checkbox" onclick="window.location='<?php echo $value['href']; ?>'" checked="checked"><a href="<?php echo $value['href']; ?>"><?php echo $value['name']; ?></a></label>
            <?php } else { ?>
              <?php if ($value['products']) { ?>
                <label><input type="checkbox" onclick="window.location='<?php echo $value['href']; ?>'"><a href="<?php echo $value['href']; ?>"><?php echo $value['name']; ?></a> (<?php echo $value['products']; ?>)</label>
              <?php } else { ?>
                <label><input type="checkbox" disabled="disabled"><span class="grey"><?php echo $value['name']; ?> (<?php echo $value['products']; ?>)</span></label>
              <?php } ?>
            <?php } ?>
          <?php } ?>
        <?php } ?>
        </div>
      <?php } ?>
    </form>
  </div>
  <div class="bottom"> </div>
</div>
<?php } ?>
Надіслати
Поділитися на інших сайтах


Fck, запустил же. Каюсь.

И главное, всё же есть, надо только опубликовать цивильно.

Не могу говорить ждите, но ждите.

  • +1 3
Надіслати
Поділитися на інших сайтах

Fck, запустил же. Каюсь.

И главное, всё же есть, надо только опубликовать цивильно.

Не могу говорить ждите, но ждите.

Счастья, здоровья тебе, денег побольше... :)
  • +1 1
Надіслати
Поділитися на інших сайтах


столкнулся с такой проблемой: поставил на сайт фильтр. ставил по ручной инструкции. всё работало отлично, полёт был нормальный.

копию сайта перенесли на другой хостинг (оба не локальные) и на новом хостинге фильтр начал пропадать о_0

Ну вот в прямом смысле - исчезает из админки и не показывается на сайте.

После проверки выяснилось, что из таблицы "oc_extension" пропадает строка

extension_id	type	key     
18	        module 	filter
случается сие диво стабильно. раз-два в неделю.

сначала были мысли, что виноват хостер, но

1. модули установленные после этого работают отлично и все на месте

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

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

собственно, сабж: в чём может быть причина? в какую сторону копать?

могут ли быть какие-либо ещё пропавшие строки из БД, которые приводят к такому результату?

p.s. на сайте, с которого копия делалась, всё работает до сих пор и никуда не пропадает.

p.p.s. на проблемной копии правки касались только сортировки параметров в SELECT`ах фильтра и было добавлено бОльшее количество параметров к товарам.

p.p.p.s. последний раз фильтр умер при попытке сменить шаблон. когда вернули предыдущий, то фильтр не ожил - "oc_extension" лишилась одной, ранее упомянутой, строки

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

хочу сделать кнопку для сброса всех чекбоксов (если клиент перебрал с фильтром), но обычный <input type="button" value="Сброс" onClick="this.form.reset()" > не работает. Кто поможет?

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


sandu, сделай ссылкой на текущую категорию.
<a href="index.php?route=product/category&path=<?php echo $this->request->get['path']; ?>">Сбросить параметры</a>
  • +1 1
Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

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

Important Information

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