[OCMOD] Фильтр товара по наличию

Тема в разделе "Готовые модули и модификаторы. Бесплатно", создана пользователем Vlad, 12 мар 2016.

  1. Vlad

    Vlad Эксперт

    Сообщения:
    4.129
    Симпатии:
    999
    Модификатор Фильтр товара по наличию

    filstock.png



    Описание

    Добавляет возможность на странице категории, отфильтровать товары которых нет в наличии


    Установка:
    1. Распакуйте zip архив;
    2. Установите ocmod файл через "Модули - Установка расширений";
    3. Обновите модификатор
    На заметку: В модификаторе в строке 60 есть проверка на статус товара. Там указывается id состояния на складе. Например если вы желаете оставить как в наличии товары со статусом Ожидание 2-3 дня то ид ставьте 6 (по умолчанию оно и стоит)

    Автор:
    Оригинал модуля тут: http://www.opencart.com/index.php?route=extension/extension/info&extension_id=22227
    Что сделано мной: Я его русифицировал и подправил стили, чтобы чекбокс более менее выглядел нормально. Проверил на последней сборке 2.2.0.0
     

    Вложения:

    ahurtep, Romans, DiMoss и 2 другим нравится это.
  2. moskit

    moskit Новичок

    Сообщения:
    3
    Симпатии:
    0
    Не работает на, 2.1.0, ставится все без проблем, но не отображается.
     
  3. Ален

    Ален Эксперт

    Сообщения:
    2.056
    Симпатии:
    640
    вы пишите все данные. Модификаторы всегда проверяются только на стандартном шаблоне. Всегда смотрят лог ошибок модификатора, а так же лог ошибок движка.
     
  4. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    Позволил себе немножко дополнить модуль....
    Код:
    <file path="catalog/view/theme/*/template/product/category.tpl">
      <operation>
        <search><![CDATA[
          <?php if ($products) { ?>
        ]]></search>
        <add position="replace"><![CDATA[
          <?php if ($products || $instock) { ?>  
        ]]></add>
      </operation>
    
    Иначе если в категории нет товара в наличии, то уже не получится отжать галочку Только в наличии.

    Небольшая правка для категорий, которые отображают товары подкатегорий...
    Код:
    <operation>
      <search><![CDATA[
        <?php if (!$categories && !$products) { ?>
      ]]></search>
      <add position="replace"><![CDATA[
        <?php if (!$categories && !$products || $categories && $instock && !$products) { ?>
      ]]></add>
    </operation>
    
    Ну и чтоб в отсутствии товара не мозолили глаза нули (страниц 0 товаров 0 и т.п.)
    Код:
    <operation>
      <search><![CDATA[
        <div class="col-sm-6 text-right"><?php echo $results; ?></div>
      ]]></search>
      <add position="replace"><![CDATA[
        <?php if ($pagination) { ?>
          <div class="col-sm-6 text-right"><?php echo $results; ?></div>
        <?php } ?>
      ]]></add>
    </operation>
    
    Да и вообще если весь товар уместился на одну страницу, то не будет показывать результат выдачи. Только при наличии пагинации.

    Теперь пытаюсь понять как бы мне это дело запомнить. Точнее запомнить то я запомнил с помощью localStorage, но по аналогии с кнопками list/grid-view....
    PHP:
    if (localStorage.getItem('.....') == '.....') {
       ..........
    trigger('click')
    ....сделать не получается, ибо кликает без остановки.

    P.S. А что на кнопки list/grid-view тоже постоянно кликает???[/code]
     

    Вложения:

    Последнее редактирование: 23 июн 2016
    Vlad нравится это.
  5. Vlad

    Vlad Эксперт

    Сообщения:
    4.129
    Симпатии:
    999
    подробнее пожалуйста..
     
  6. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    Например мы имеем категорию в которой отображаем товары всех подкатегорий. В итоге товара на несколько страниц, допустим 6 страниц. Жмякаем Только в наличии, стало 3 страницы, ибо товар которого нет в наличии не попал в выдачу. Однако если мы решим полистать эти страницы, то нас ждёт разочарование, т.к. фильтрация наличия слетает при переходе на другую станицу.

    Хотел изобразить что то типа такого....
    Код:
    <script type="text/javascript"><!--
    var url_filter = '<?php echo $url; ?>';
    
    $('#input-instock').on('click', function() {
      url = url_filter;
    
        var instock = $('#content input[name=\'instock\']').val();
        if (instock == '1') {
          url += '';
        } else if (instock == '') {
          url += '&instock=true';
          localStorage.setItem('view', 'instock');
        } else {
          url += '';
        }
    
        location = url;             
      });
             
      if (localStorage.getItem('view') == 'instock') {
        $('#input-instock').trigger('click');
      }         
    </script>
    
    Но заимел бесконечный цикл нажатия на чекбокс. Надо придумывать что то другое.
     
  7. Vlad

    Vlad Эксперт

    Сообщения:
    4.129
    Симпатии:
    999
    в \catalog\controller\product\category.php есть
    PHP:
    $pagination->url $this->url->link('product/category''path=' $this->request->get['path'] . $url '&page={page}');
    в нее передается $url который формируется выше.
    А выше посмотреть есть примеры. Т.е нужно еще добавить
    PHP:
                if (isset($this->request->get['instock'])) {
                    
    $url .= '&instock=true';
                }
     
    DiMoss нравится это.
  8. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    @Vlad, спасибо за наводку! Сделал немного по другому, ибо если работать с $url, то не получится снять галочку.
    Сделал так....
    Код:
    <operation>
      <search><![CDATA[
        $pagination = new Pagination();
      ]]></search>
      <add position="before"><![CDATA[          
        if (isset($this->request->get['instock'])) {
          $instock_filter = '&instock=true';
        } else {
          $instock_filter = '';
        }
      ]]></add>
    </operation>
    <operation>
      <search><![CDATA[
        $pagination->url = $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&page={page}');          
      ]]></search>
      <add position="replace"><![CDATA[          
        $pagination->url = $this->url->link('product/category', 'path=' . $this->request->get['path'] . $url . '&page={page}' . $instock_filter);
      ]]></add>
    </operation>
    
    Так и по страничкам можно листать с фильтрацией по наличию и можно снять галочку.
     
  9. tolig

    tolig Новичок

    Сообщения:
    10
    Симпатии:
    0
    может подскажете как вывести все товары из наличия на одну страницу а кнопку разместить там где удобно
     
  10. Ravilr

    Ravilr Специалист

    Сообщения:
    3.879
    Симпатии:
    1.064
    вопрос не по теме. А так поиск помогает найти ответ http://forum.opencart-russia.ru/thr...nicu-i-vyvesti-tam-vse-tovary.1304/#post-8225
     
  11. tolig

    tolig Новичок

    Сообщения:
    10
    Симпатии:
    0
    спасибо. а как через этот модуль вывести товары те что в наличии, модуль я уставновил но в категории пусто
     
  12. pokryshkin

    pokryshkin Новичок

    Сообщения:
    8
    Симпатии:
    0
    можете файлик выложить?
     
  13. semilibertus

    semilibertus Новичок

    Сообщения:
    1
    Симпатии:
    0
    А как вывести ту же галку, но в левый столбец, в/под стандартным фильтром?
     
  14. Relative077

    Relative077 Новичок

    Сообщения:
    6
    Симпатии:
    0
    Cложно ли будет "подружить" данный модуль с ocfilter?
    Ибо когда фильтр по наличию активен - он сбрасывается при выборе опций ocfilter.

    Пробовал так:

    catalog/controller/extension/module/ocfilter.php

    $instock_true = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

    if (preg_match('instock', $instock_true)) {
    $json['href'] = str_replace('&amp;', '&', $this->ocfilter->link($this->ocfilter->getParams())) . '?instock=true';
    } else {
    $json['href'] = str_replace('&amp;', '&', $this->ocfilter->link($this->ocfilter->getParams()));
    }


    Но это не работает(
     
  15. DiMoss

    DiMoss Продвинутый пользователь

    Сообщения:
    862
    Симпатии:
    236
    А вот это что вообще такое?

    OpenCart вроде бы умеет читать query params:
    PHP:
    if (isset($this->request->get['instock'] && )

    Как подружить с OCFilter надо уточнять у разработчика модуля или лопатить код.
    По сути надо всегда конкатенировать условие instock если оно true.
     
    Последнее редактирование: 19 авг 2020
  16. Relative077

    Relative077 Новичок

    Сообщения:
    6
    Симпатии:
    0
    Да, но увы(

    PHP:
        if (isset($this->request->get['instock'])) {
          
    $json['href'] = str_replace('&amp;''&'$this->ocfilter->link($this->ocfilter->getParams())) . '?instock=true';
        } else {
          
    $json['href'] = str_replace('&amp;''&'$this->ocfilter->link($this->ocfilter->getParams()));
        }
     
  17. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    239
    &instock=true
     
  18. Relative077

    Relative077 Новичок

    Сообщения:
    6
    Симпатии:
    0
    не помогло
    Может дело в том, что
    $this->request->get['instock']
    в другом контроллере?
     
  19. fanatic

    fanatic Продвинутый пользователь

    Сообщения:
    1.415
    Симпатии:
    239
    нет, request доступен везде
     
  20. Relative077

    Relative077 Новичок

    Сообщения:
    6
    Симпатии:
    0
    Да, но увы(