Фильтр товара по производителю и категориям в админке

Тема в разделе "Готовые модули и модификаторы. Бесплатно", создана пользователем tsap, 19 июн 2015.

  1. tsap

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

    Сообщения:
    230
    Симпатии:
    131
    возможно кому-то понадобится
    сделал МОД, который добавляет фильтр по производителю и категориям в разделе Товары,
    также добавил соответствующие колонки в списке товара.
    до
    do.jpg
    после
    posle.jpg

    МОД вносит изменения в файлы:
    admin/language/russian/catalog/product.php
    admin/model/catalog/product.php
    admin/controller/catalog/product.php
    admin/view/template/catalog/product_list.tpl

    если у вас эти файлы уже модифицированы, возможно будут проблемы.

    сортировка по колонкам Категория и Производитель идет не по наименованию, а по ID!

    проверял на 2.0.2.0 rs.4 и 2.0.3.1 rs.1, 2.1.0.2 rs.1, 2.2.0.0 rs.1, вроде работает как надо, но работающего магазина у меня нет, а на тестовых мало товара, поэтому не могу сказать насколько корректно работает с большим количеством товара.
     

    Вложения:

    Последнее редактирование: 12 апр 2016
    asa937, ILexus, nail.css и 13 другим нравится это.
  2. marand

    marand Пользователь

    Сообщения:
    123
    Симпатии:
    9
    Все хорошо. Но как сделать чтобы поля Категория и Производите были не с правой стороны, а слева. Соответственно под полями Модель и Количество. У меня в правой колонке фильтр по ID стоит.
     
  3. tsap

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

    Сообщения:
    230
    Симпатии:
    131
    не знаю как через мод так сделать...
    в теории все выглядит так:
    открываем файл product_list.tpl
    находим это
    HTML:
    <div class="form-group">
                    <label class="control-label" for="input-name"><?php echo $entry_name; ?></label>
                    <input type="text" name="filter_name" value="<?php echo $filter_name; ?>" placeholder="<?php echo $entry_name; ?>" id="input-name" class="form-control" />
                  </div>
                  <div class="form-group">
                    <label class="control-label" for="input-model"><?php echo $entry_model; ?></label>
                    <input type="text" name="filter_model" value="<?php echo $filter_model; ?>" placeholder="<?php echo $entry_model; ?>" id="input-model" class="form-control" />
                  </div>
    дописываем
    HTML:
    <div class="form-group">
                    <label class="control-label" for="input-name"><?php echo $entry_name; ?></label>
                    <input type="text" name="filter_name" value="<?php echo $filter_name; ?>" placeholder="<?php echo $entry_name; ?>" id="input-name" class="form-control" />
                  </div>
                  <div class="form-group">
                    <label class="control-label" for="input-model"><?php echo $entry_model; ?></label>
                    <input type="text" name="filter_model" value="<?php echo $filter_model; ?>" placeholder="<?php echo $entry_model; ?>" id="input-model" class="form-control" />
                  </div>
    <div class="form-group">
                        <label class="control-label" for="input-category"><?php echo $entry_category_f; ?></label>
                        <input type="text" name="filter_category" value="<?php echo $filter_category; ?>" placeholder="<?php echo $entry_category_f; ?>" id="input-category" class="form-control" />
                        <input type="hidden" name="filter_category_id" value="<?php echo $filter_category_id; ?>" />
                    </div>
    находим дальше это
    HTML:
    <div class="form-group">
                    <label class="control-label" for="input-price"><?php echo $entry_price; ?></label>
                    <input type="text" name="filter_price" value="<?php echo $filter_price; ?>" placeholder="<?php echo $entry_price; ?>" id="input-price" class="form-control" />
                  </div>
                  <div class="form-group">
                    <label class="control-label" for="input-quantity"><?php echo $entry_quantity; ?></label>
                    <input type="text" name="filter_quantity" value="<?php echo $filter_quantity; ?>" placeholder="<?php echo $entry_quantity; ?>" id="input-quantity" class="form-control" />
                  </div>
    дописываем
    HTML:
    <div class="form-group">
                    <label class="control-label" for="input-price"><?php echo $entry_price; ?></label>
                    <input type="text" name="filter_price" value="<?php echo $filter_price; ?>" placeholder="<?php echo $entry_price; ?>" id="input-price" class="form-control" />
                  </div>
                  <div class="form-group">
                    <label class="control-label" for="input-quantity"><?php echo $entry_quantity; ?></label>
                    <input type="text" name="filter_quantity" value="<?php echo $filter_quantity; ?>" placeholder="<?php echo $entry_quantity; ?>" id="input-quantity" class="form-control" />
                  </div>
    <div class="form-group">
                        <label class="control-label" for="input-manufacturer"><?php echo $entry_manufacturer_f; ?></label>
                        <input type="text" name="filter_manufacturer" value="<?php echo $filter_manufacturer; ?>" placeholder="<?php echo $entry_manufacturer_f; ?>" id="input-manufacturer" class="form-control" />
                        <input type="hidden" name="filter_manufacturer_id" value="<?php echo $filter_manufacturer_id; ?>" />
                    </div>
    соответственно из мода нужно удалить
    Код:
            <operation>
                <search><![CDATA[
                    <button type="button" id="button-filter" class="btn btn-primary pull-right"><i class="fa fa-search"></i> <?php echo $button_filter; ?></button>
                    ]]>
                </search>
                <add position="before"><![CDATA[
                    <div class="form-group">
                        <label class="control-label" for="input-category"><?php echo $entry_category_f; ?></label>
                        <input type="text" name="filter_category" value="<?php echo $filter_category; ?>" placeholder="<?php echo $entry_category_f; ?>" id="input-category" class="form-control" />
                        <input type="hidden" name="filter_category_id" value="<?php echo $filter_category_id; ?>" />
                    </div>
                    <div class="form-group">
                        <label class="control-label" for="input-manufacturer"><?php echo $entry_manufacturer_f; ?></label>
                        <input type="text" name="filter_manufacturer" value="<?php echo $filter_manufacturer; ?>" placeholder="<?php echo $entry_manufacturer_f; ?>" id="input-manufacturer" class="form-control" />
                        <input type="hidden" name="filter_manufacturer_id" value="<?php echo $filter_manufacturer_id; ?>" />
                    </div>
                    ]]>
                </add>
            </operation>
     
  4. mazik001

    mazik001 Новичок

    Сообщения:
    12
    Симпатии:
    1
    А как к этому можно добавить фильтр по SKU ?
     
  5. tsap

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

    Сообщения:
    230
    Симпатии:
    131
    сложно.., можно открыть CategoryAndManufactureFilter.ocmod.xml редактором и дописывать свое, за пример брать строки где встречается "model".
    было так
    PHP:
     <operation>
                <
    search><![CDATA[
                    if (!empty(
    $data['filter_model'])) {
                    ]]>
                </
    search>
                <
    add position="before"><![CDATA[          
            if (isset(
    $data['filter_category_id']) && !is_null($data['filter_category_id'])) {
                
    $sql .= " AND p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
            }
          
            if (isset(
    $data['filter_manufacturer_id']) && !is_null($data['filter_manufacturer_id'])) {
                
    $sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";
            }
                    ]]>
                </
    add>
            </
    operation>
    переписали вот так:
    PHP:
     <operation>
                <
    search><![CDATA[
                    if (!empty(
    $data['filter_model'])) {
                    ]]>
                </
    search>
                <
    add position="before"><![CDATA[          
            if (isset(
    $data['filter_category_id']) && !is_null($data['filter_category_id'])) {
                
    $sql .= " AND p2c.category_id = '" . (int)$data['filter_category_id'] . "'";
            }
          
            if (isset(
    $data['filter_manufacturer_id']) && !is_null($data['filter_manufacturer_id'])) {
                
    $sql .= " AND p.manufacturer_id = '" . (int)$data['filter_manufacturer_id'] . "'";
            }
          
            if (!empty(
    $data['filter_sku'])) {
                
    $sql .= " AND p.sku LIKE '" $this->db->escape($data['filter_sku']) . "%'";
            }
                    ]]>
                </
    add>
            </
    operation>
    и тд.
    плюс придется переписывать или дописывать функцию autocomplete - эта функция отвечает за авто заполнение
     
  6. optimlab

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

    Сообщения:
    813
    Симпатии:
    216
    Может переделаешь на выпадающий список? Если не влом конечно)))
     
  7. tsap

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

    Сообщения:
    230
    Симпатии:
    131
    не влом, просто с меня программист как швея-мотористка, свое не напишу, у меня только готовое содрать и передать подсебя получается, так что лучше помощи попросить у более компетентных людей
     
  8. Ravilr

    Ravilr Специалист

    Сообщения:
    3.081
    Симпатии:
    853
    от выпадающих списков отказались ввиду того, что категорий бывает > 200 например, а вы хотите весь список.. (глазки устанут листать). А вот для производителей, коих не бывает много обычно.. можно и сделать.
    Как пример брать \admin\controller\catalog\manufacturer.php
     
  9. tsap

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

    Сообщения:
    230
    Симпатии:
    131
    по поводу категорий и производителей вопрос не стоит, внутренние автофильтры замечательно работают.
    человек хочет
    для него я не нашел автофильтра в недрах ОС, тоесть нужно самому придумывать или автофильтр, или выпадающий список
     
  10. Ravilr

    Ravilr Специалист

    Сообщения:
    3.081
    Симпатии:
    853
    поехали!

    В файле \admin\model\catalog\product.php
    после
    PHP:
            if (!empty($data['filter_model'])) {
                
    $sql .= " AND p.model LIKE '" $this->db->escape($data['filter_model']) . "%'";
            }
    вставим
    PHP:
            if (!empty($data['filter_sku'])) {
                
    $sql .= " AND p.sku LIKE '" $this->db->escape($data['filter_sku']) . "%'";
            }

    в файле \admin\controller\catalog\product.php
    после (встречается в двух местах в функции GetList и autocomplete, в двух добавлять)
    PHP:
        if (isset($this->request->get['filter_model'])) {
           
    $filter_model $this->request->get['filter_model'];
         } else {
           
    $filter_model null;
         }
    вставить
    PHP:
            if (isset($this->request->get['filter_sku'])) {
                
    $filter_sku $this->request->get['filter_sku'];
            } else {
                
    $filter_sku null;
            }


    после (встречается в двух местах в функции GetList и autocomplete, в двух добавлять)
    PHP:
            if (isset($this->request->get['filter_model'])) {
                
    $url .= '&filter_model=' urlencode(html_entity_decode($this->request->get['filter_model'], ENT_QUOTES'UTF-8'));
            }
    вставим (встречается в двух местах в функции GetList)
    PHP:
            if (isset($this->request->get['filter_sku'])) {
                
    $url .= '&filter_sku=' urlencode(html_entity_decode($this->request->get['filter_sku'], ENT_QUOTES'UTF-8'));
            }

    после
    PHP:
          if (isset($this->request->get['filter_model'])) {
             
    $filter_model $this->request->get['filter_model'];
           } else {
             
    $filter_model '';
           }
    вставим
    PHP:
                if (isset($this->request->get['filter_sku'])) {
                    
    $filter_model $this->request->get['filter_sku'];
                } else {
                    
    $filter_sku'';
                }


    и перед
    PHP:
    'option'     => $option_data,
    вставить
    PHP:
    'sku'      => $result['sku'],

    после
    PHP:
    $data['filter_model'] = $filter_model;
    добавить
    PHP:
    $data['filter_sku'] = $filter_sku;

    после
    PHP:
    'filter_model'      => $filter_model,
    вставить
    PHP:
    'filter_sku'      => $filter_sku,
    вместо
    PHP:
    if (isset($this->request->get['filter_name']) || isset($this->request->get['filter_model'])) {
    вставить
    PHP:
    if (isset($this->request->get['filter_name']) || isset($this->request->get['filter_model']) || isset($this->request->get['filter_sku'])) {

    ну и в шаблоне \admin\view\template\catalog\product_list.tpl
    например после
    Код:
                  <div class="form-group">
                    <label class="control-label" for="input-model"><?php echo $entry_model; ?></label>
                    <input type="text" name="filter_model" value="<?php echo $filter_model; ?>" placeholder="<?php echo $entry_model; ?>" id="input-model" class="form-control" />
                  </div>
    вставим
    Код:
                   <div class="form-group">
                    <label class="control-label" for="input-sku">SKU</label>
                    <input type="text" name="filter_sku" value="<?php echo $filter_sku; ?>" placeholder="SKU" id="input-sku" class="form-control" />
                  </div>

    и перед
    Код:
    var filter_price = $('input[name=\'filter_price\']').val();
    вставить
    Код:
        var filter_sku = $('input[name=\'filter_sku\']').val();
    
        if (filter_sku) {
            url += '&filter_sku=' + encodeURIComponent(filter_sku);
        }

    и перед
    Код:
    $('input[name=\'filter_model\']').autocomplete({
    вставить
    Код:
    $('input[name=\'filter_sku\']').autocomplete({
        'source': function(request, response) {
            $.ajax({
                url: 'index.php?route=catalog/product/autocomplete&token=<?php echo $token; ?>&filter_sku=' +  encodeURIComponent(request),
                dataType: 'json',
                success: function(json) {
                    response($.map(json, function(item) {
                        return {
                            label: item['sku'],
                            value: item['product_id']
                        }
                    }));
                }
            });
        },
        'select': function(item) {
            $('input[name=\'filter_sku\']').val(item['label']);
        }
    });
    ВСЕ!!! 100 раз пожалел что начал писать инструкцию.... но начал так начал..
     
    asa937, MaxcMods, RoS и 4 другим нравится это.
  11. optimlab

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

    Сообщения:
    813
    Симпатии:
    216
    Поражаюсь вашему терпению. Так сделайте модификатор и выставите его за копейку, уж добейте до конца, всё равно начинающие не поймут ничего или ошибку сделают и опять по новой...)))
    Кто хочет в инструкции разобраться, тот поймет, кто не хочет пусть на пирожок копейку скидывает.
     
  12. Ravilr

    Ravilr Специалист

    Сообщения:
    3.081
    Симпатии:
    853
    так и сделаю. Просто начал... а отступать было поздно. И решил дописать....
     
  13. tsap

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

    Сообщения:
    230
    Симпатии:
    131
    собрал в мод. Ravilr, обратите внимание на автофильтр, както криво получается, показывает только первые 5 KSU, но фильтрует правильно.
    наверное нужно отдельный автофильтр без привязки к наименованию и модели
     
    Последнее редактирование: 20 июл 2015
    Viktor нравится это.
  14. Ravilr

    Ravilr Специалист

    Сообщения:
    3.081
    Симпатии:
    853
    ну это же автозаполнение стандартное, поэтому и 5. Надо вводить сам ску.
     
  15. tsap

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

    Сообщения:
    230
    Симпатии:
    131
    вот скриншот 1 когда просто ставишь курсор
    1.jpg
    дальше набираю, фильтр не реагирует
    2.jpg
    фильтрую
    3.jpg
    хотя конечно может ошибся гдето, когда мод собирал, но и ваша инструкция не идеал
    взглянув по трезвому, случайно здесь не нужно переписать \admin\controller\catalog\product.php
    это
    PHP:
    $filter_data = array(
                    
    'filter_name'  => $filter_name,
                    
    'filter_model' => $filter_model,
                    
    'start'        => 0,
                    
    'limit'        => $limit
                
    );
    так
    Код:
    $filter_data = array(
                    'filter_name'  => $filter_name,
                    'filter_model' => $filter_model,
                    'filter_sku' => $filter_sku,
                    'start'        => 0,
                    'limit'        => $limit
                );
     
  16. Ravilr

    Ravilr Специалист

    Сообщения:
    3.081
    Симпатии:
    853
    нужно. Наверно тоже надо еще разок пройтись ко коду и потестить..
     
  17. ivanitskydenis

    ivanitskydenis Новичок

    Сообщения:
    1
    Симпатии:
    0
    @tsap Спасибо огромное за Ваш труд! Очень полезное расширение.
     
  18. geminusone

    geminusone Новичок

    Сообщения:
    2
    Симпатии:
    0
    Здравствуйте @tsap, подскажите пожалуйста, есть такой мод для ocStore 2.1.0.1 ?
     
    Последнее редактирование: 28 янв 2016
  19. tsap

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

    Сообщения:
    230
    Симпатии:
    131
    понятия не имею, я один проект до ума не довел на 2.0.3.1, на 2.1.х не было нужды ставить,
    то что есть, на 2.1.0.1 не работает?
     
  20. geminusone

    geminusone Новичок

    Сообщения:
    2
    Симпатии:
    0
    Поставил, воде работает нормально, единственное, в админке названия полей криво прописаны.
     

    Вложения:

    • 111.png
      111.png
      Размер файла:
      25,2 КБ
      Просмотров:
      96