[OCMOD] Дополнительное поле Название фильтра в Фильтре OpenCart 3

Тема в разделе "Модули и дополнения", создана пользователем Maksikus, 16 май 2023.

  1. Maksikus

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

    Сообщения:
    84
    Симпатии:
    8
    Коллеги, приветствую!

    Тут решил сделать:
    - в:
    Catalog -> Filters -> Add New
    - поле:
    Additional Filter Group Name
    - аналогичному этому:
    Filter Group Name

    Чтобы как-то проще было ориентироваться по фильтрам, создавать их, назначать к категориям.
    В инете что-то не нашёл решение, здесь тоже...

    Сложность в том, что в стандарте:
    Filter Group Name
    - отображается в фронте
    - а хочется, чтобы в админке, отображалось:
    Additional Filter Group Name
    и они были не взаимосвязанные

    Пока только скрин сделал. :)

    upload_2023-5-16_12-12-30.png

    P.S.:
    OpenCart 3.0.3.7
     
    Последнее редактирование: 17 май 2023
  2. devimirochnik

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

    Сообщения:
    730
    Симпатии:
    100
    А какая практическая цель у данного дополнительного названия?
     
  3. devimirochnik

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

    Сообщения:
    730
    Симпатии:
    100
    В плане у вас много одинаковых фильтров с одним и тем же названием? Если так, то зачем? Какой-то пример нужен для понимания
     
  4. Maksikus

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

    Сообщения:
    84
    Симпатии:
    8
    devimirochnik , как выше написал, что:
    - хочу отвязать название фильтра, который отображается на фронте, как пример:
    - создаю группу фильтр:
    - "Возраст" указываю имена:
    - от 1 до 4 месяцев"
    - от 4 до 10 месяцев"

    Есть услуга "отель для питомцев", питомцы:
    - собаки, кошки, попугаи и т.д.
    - у них свой возраст, порода и т.д. и под возраст уже подбирается номер в отеле.

    Если создавать группу фильтр:
    - Кошка Возраст, то будет в фронте отображаться Кошка Возраст
    - что не очень красиво - раз
    - сортировать в админке тоже не очень
    - поиск в админке не очень...

    Если создавать группу фильтр:
    - Возраст, то будет в фронте отображаться Возраст, но:
    - тогда в админке будет много Возраст и:
    - не понятно к какому питомцу это группа фильтр принадлежит...
     
  5. devimirochnik

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

    Сообщения:
    730
    Симпатии:
    100
    А что если в фильтре указать все возможные варианты, а потом для товаров выбирать только нужные?

    В принципе-то, для такого допила, нужно добавить поле в БД, переделать контроллер и модель создания фильтров, а так же подправить часть в карточке товара
     
  6. Tom

    Tom Специалист

    Сообщения:
    674
    Симпатии:
    204
    Фильтр встроенный в опенкарт ламно ещё то.
    Поэтому не стоит он ни правок ни обсуждений.
     
  7. devimirochnik

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

    Сообщения:
    730
    Симпатии:
    100
    Ну фиг знает, если товаров не очень много и от фильтров много не требуется, то, в принципе, нормально. Но так, конечно, лучше использовать какой-нибудь модуль фильтров. И функционал поширше, и вид более эстетичный.
     
  8. Maksikus

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

    Сообщения:
    84
    Симпатии:
    8
    Tom , согласен...
    Но, всё же хочу по минималке его доработать... :)
     
  9. Maksikus

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

    Сообщения:
    84
    Симпатии:
    8
    devimirochnik , товаров не много , поэтому и не нужны навороченные модули...
     
  10. devimirochnik

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

    Сообщения:
    730
    Симпатии:
    100
    Так а в чём у вас загвоздка?
     
  11. Maksikus

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

    Сообщения:
    84
    Симпатии:
    8
    Пока так сделал:
    - база создаётся, туда записывается, форма работает...

    Черновой вариант работающий:
    Код:
    <?xml version="1.0" encoding="utf-8"?>
    <modification>
      <name>[BEFE] Extra Filter Group Name v.1.0.0</name>
      <code>BEFE_Extra_Filter_Group_Name_v100</code>
      <version>1.0.0</version>
      <author>MAEmelyanov</author>
      <link>https://t.me/maemelyanov</link>
    <!--ok-->
      <file path="admin/controller/catalog/filter.php">
        <operation>
          <search><![CDATA[if (isset($this->request->post['filter_group_description'])) {]]></search>
          <add position="after" offset="6"><![CDATA[
            if (isset($this->request->post['filter_extra_group_description'])) {
                $data['filter_extra_group_description'] = $this->request->post['filter_extra_group_description'];
            } elseif (isset($this->request->get['filter_group_id'])) {
                $data['filter_extra_group_description'] = $this->model_catalog_filter->getFilterGroupDescriptions($this->request->get['filter_group_id']);
            } else {
                $data['filter_extra_group_description'] = array();
            }
          ]]></add>
        </operation>
      </file>
    
      <file path="admin/model/catalog/filter.php">
        <operation><!--009-->
          <search index="0"><![CDATA[name = '" . $this->db->escape($value['name']) . "']]></search>
          <add position="replace"><![CDATA[
            name = '" . $this->db->escape($value['name']) . "', extra_name = '" . $this->db->escape($value['extra_name']) . "'
          ]]></add>
        </operation>
        <operation><!--033-->
           <search index="1"><![CDATA[name = '" . $this->db->escape($value['name']) . "']]></search>
          <add position="replace"><![CDATA[
            name = '" . $this->db->escape($value['name']) . "', extra_name = '" . $this->db->escape($value['extra_name']) . "'
          ]]></add>
        </operation>
        <operation><!--069-->
          <search><![CDATA[public function getFilterGroups($data = array()) {]]></search>
          <add position="after"><![CDATA[
            $result_extra_name = $this->db->query("SHOW COLUMNS FROM " . DB_PREFIX . "filter_group_description LIKE 'extra_name';");
            if ($result_extra_name->num_rows == 0) {
                $this->db->query("ALTER TABLE " . DB_PREFIX . "filter_group_description ADD COLUMN extra_name TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER  `name` ;");           
            }
          ]]></add>
        </operation>
        <operation><!--112-->
          <search><![CDATA[$filter_group_data[$result['language_id']] = array('name' => $result['name']);]]></search>
          <add position="replace"><![CDATA[
            $filter_group_data[$result['language_id']] = array('name' => $result['name'], 'extra_name' => $result['extra_name']);
          ]]></add>
        </operation>
      </file>
    <!--ok-->
      <file path="admin/view/template/catalog/filter_form.twig">
        <operation>
          <search><![CDATA[<input type="text" name="filter_group_description[{{ language.language_id }}][name]" value="{{ filter_group_description[language.language_id] ? filter_group_description[language.language_id].name }}" placeholder="{{ entry_group }}" class="form-control" />]]></search>
          <add position="after" offset="6"><![CDATA[
                <div class="form-group required">
                  <label class="col-sm-2 control-label">{{ entry_extra_group }}</label>
                  <div class="col-sm-10"> {% for language in languages %}
                    <div class="input-group"><span class="input-group-addon"><img src="language/{{ language.code }}/{{ language.code }}.png" title="{{ language.extra_name }}" /></span>
                      <input type="text" name="filter_group_description[{{ language.language_id }}][extra_name]" value="{{ filter_group_description[language.language_id] ? filter_group_description[language.language_id].extra_name }}" placeholder="{{ entry_extra_group }}" class="form-control" />
                    </div>
                    {% if error_group[language.language_id] %}
                    <div class="text-danger">{{ error_group[language.language_id] }}</div>
                    {% endif %}
                    {% endfor %} </div>
                </div>
          ]]></add>
        </operation>
      </file>
    <!--
      <file path="catalog/controller/extension/module/filter.php">
        <operation>
          <search><![CDATA[]]></search>
          <add position="after"><![CDATA[
    
          ]]></add>
        </operation>
        <operation>
          <search><![CDATA[]]></search>
          <add position="after"><![CDATA[
    
          ]]></add>
        </operation>
      </file>
    
      <file path="catalog/model/.....">
        <operation>
          <search><![CDATA[]]></search>
          <add position="after"><![CDATA[
    
          ]]></add>
        </operation>
      </file>
     
       <file path="catalog/view/theme/default/template/extension/module/filter.twig">
        <operation>
          <search><![CDATA[]]></search>
          <add position="replace"><![CDATA[
    
          ]]></add>
        </operation>
      </file>
    -->
    <!--ok-->
      <file path="admin/language/ru-ru/catalog/filter.php">
        <operation>
          <search><![CDATA[$_['entry_group']]]></search>
          <add position="before"><![CDATA[
    $_['entry_extra_group']       = 'Дополнительное Название группы фильтра';
          ]]></add>
        </operation>
      </file>
     
    <!--ok-->
      <file path="admin/language/en-gb/catalog/filter.php">
        <operation>
          <search><![CDATA[$_['entry_group']]]></search>
          <add position="before"><![CDATA[
    $_['entry_extra_group']       = 'Additional Filter Group Name';
          ]]></add>
        </operation>
      </file>
     
    </modification>
     

    Вложения:

    Последнее редактирование: 17 май 2023
  12. devimirochnik

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

    Сообщения:
    730
    Симпатии:
    100
    Кстати, не стоит делать поле NOT NULL, ну или хотя бы нужно добавлять default значение, иначе после отключения модификатора и попытки создать фильтр, у вас будет возникать ошибка БД
     
  13. Maksikus

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

    Сообщения:
    84
    Симпатии:
    8
    Я не знаю как это делается...
    Я у RoS'а, решение по БД, в этой теме стыбрил:
    Вывод дополнительного описания в карточку товара {OCMOD}
    - правда у него под Opencart 2.3.0.2 (rs.4)
     
  14. devimirochnik

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

    Сообщения:
    730
    Симпатии:
    100
    Код:
    $this->db->query("ALTER TABLE " . DB_PREFIX . "filter_group_description ADD COLUMN extra_name TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL AFTER  `name` ;");             
    в

    Код:
    $this->db->query("ALTER TABLE " . DB_PREFIX . "filter_group_description ADD COLUMN extra_name TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' AFTER  `name` ;");             
    ну и удалить ранее созданную колонку
     
    Maksikus нравится это.
  15. Maksikus

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

    Сообщения:
    84
    Симпатии:
    8
    devimirochnik , понял , спасибо! Исправил.

    Сделал:
    - исправление от devimirochnik
    - добавил вывод в filter_list.twig

    Черновой вариант работающий:
    Код:
    <?xml version="1.0" encoding="utf-8"?>
    <modification>
      <name>[BEFE] Extra Filter Group Name v.1.0.0</name>
      <code>BEFE_Extra_Filter_Group_Name_v100</code>
      <version>1.0.0</version>
      <author>MAEmelyanov</author>
      <link>https://t.me/maemelyanov</link>
    <!--
    Изменения для:
    - создания дополнительного поля в форме создания фильтра:
    filter_form.twig
    Изменения в:
    admin/controller/catalog/filter.php
    admin/model/catalog/filter.php
    admin/view/template/catalog/filter_form.twig
    -->
      <file path="admin/controller/catalog/filter.php">
        <operation><!--313-->
          <search><![CDATA[if (isset($this->request->post['filter_group_description'])) {]]></search>
          <add position="after" offset="6"><![CDATA[
            if (isset($this->request->post['filter_extra_group_description'])) {
                $data['filter_extra_group_description'] = $this->request->post['filter_extra_group_description'];
            } elseif (isset($this->request->get['filter_group_id'])) {
                $data['filter_extra_group_description'] = $this->model_catalog_filter->getFilterGroupDescriptions($this->request->get['filter_group_id']);
            } else {
                $data['filter_extra_group_description'] = array();
            }
          ]]></add>
        </operation>
      </file>
    
      <file path="admin/model/catalog/filter.php">
        <operation><!--009-->
          <search index="0"><![CDATA[name = '" . $this->db->escape($value['name']) . "']]></search>
          <add position="replace"><![CDATA[
            name = '" . $this->db->escape($value['name']) . "', extra_name = '" . $this->db->escape($value['extra_name']) . "'
          ]]></add>
        </operation>
        <operation><!--033-->
           <search index="1"><![CDATA[name = '" . $this->db->escape($value['name']) . "']]></search>
          <add position="replace"><![CDATA[
            name = '" . $this->db->escape($value['name']) . "', extra_name = '" . $this->db->escape($value['extra_name']) . "'
          ]]></add>
        </operation>
        <operation><!--069-->
          <search><![CDATA[public function getFilterGroups($data = array()) {]]></search>
          <add position="after"><![CDATA[
            $result_extra_name = $this->db->query("SHOW COLUMNS FROM " . DB_PREFIX . "filter_group_description LIKE 'extra_name';");
            if ($result_extra_name->num_rows == 0) {
                $this->db->query("ALTER TABLE " . DB_PREFIX . "filter_group_description ADD COLUMN extra_name TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' AFTER `name` ;");              
            }
          ]]></add>
        </operation>
        <operation><!--112-->
          <search><![CDATA[$filter_group_data[$result['language_id']] = array('name' => $result['name']);]]></search>
          <add position="replace"><![CDATA[
            $filter_group_data[$result['language_id']] = array('name' => $result['name'], 'extra_name' => $result['extra_name']);
          ]]></add>
        </operation>
      </file>
    
      <file path="admin/view/template/catalog/filter_form.twig">
        <operation><!--033-->
          <search><![CDATA[<input type="text" name="filter_group_description[{{ language.language_id }}][name]" value="{{ filter_group_description[language.language_id] ? filter_group_description[language.language_id].name }}" placeholder="{{ entry_group }}" class="form-control" />]]></search>
          <add position="after" offset="6"><![CDATA[
                <div class="form-group required">
                  <label class="col-sm-2 control-label">{{ entry_extra_group }}</label>
                  <div class="col-sm-10"> {% for language in languages %}
                    <div class="input-group"><span class="input-group-addon"><img src="language/{{ language.code }}/{{ language.code }}.png" title="{{ language.extra_name }}" /></span>
                      <input type="text" name="filter_group_description[{{ language.language_id }}][extra_name]" value="{{ filter_group_description[language.language_id] ? filter_group_description[language.language_id].extra_name }}" placeholder="{{ entry_extra_group }}" class="form-control" />
                    </div>
                    {% if error_group[language.language_id] %}
                    <div class="text-danger">{{ error_group[language.language_id] }}</div>
                    {% endif %}
                    {% endfor %} </div>
                </div>
          ]]></add>
        </operation>
      </file>
     
    <!--
    Изменения для:
    - вывода дополнительного поля в фильтр листе:
    filter_list.twig
    Изменения в:
    admin/controller/catalog/filter.php
    admin/view/template/catalog/filter_list.twig
    -->
      <file path="admin/controller/catalog/filter.php">
        <operation><!--117-->
          <search><![CDATA[$sort = 'fgd.name';]]></search>
          <add position="after" offset="1"><![CDATA[
            if (isset($this->request->get['sort'])) {
                $sort = $this->request->get['sort'];
            } else {
                $sort = 'fgd.extra_name';
            }
          ]]></add>
        </operation>
        <operation><!--177-->
          <search><![CDATA['name'            => $result['name'],]]></search>
          <add position="after"><![CDATA[
                    'extra_name'            => $result['extra_name'],
          ]]></add>
        </operation>
        <operation><!--215-->
          <search><![CDATA[$data['sort_name'] = $this->url->link('catalog/filter', 'user_token=' . $this->session->data['user_token'] . '&sort=fgd.name' . $url, true);]]></search>
          <add position="after"><![CDATA[
            $data['sort_extra_name'] = $this->url->link('catalog/filter', 'user_token=' . $this->session->data['user_token'] . '&sort=fgd.extra_name' . $url, true);
          ]]></add>
        </operation>
      </file>
    
      <file path="admin/view/template/catalog/filter_list.twig">
        <operation><!--038-->
          <search><![CDATA[<td class="text-left">{% if sort == 'fgd.name' %}]]></search>
          <add position="after" offset="4"><![CDATA[
                      <td class="text-left">{% if sort == 'fgd.extra_name' %}
                        <a href="{{ sort_extra_name }}" class="{{ order|lower }}">{{ column_extra_group }}</a>
                        {% else %}
                        <a href="{{ sort_extra_name }}">{{ column_extra_group }}</a>
                        {% endif %}</td>
          ]]></add>
        </operation>
        <operation>
          <search><![CDATA[<td class="text-left">{{ filter.name }}</td>]]></search>
          <add position="after"><![CDATA[
                      <td class="text-left">{{ filter.extra_name }}</td>
          ]]></add>
        </operation>
        <operation>
          <search><![CDATA[<td class="text-center" colspan="4">{{ text_no_results }}</td>]]></search>
          <add position="replace"><![CDATA[
                      <td class="text-center" colspan="5">{{ text_no_results }}</td>
          ]]></add>
        </operation>
      </file>
    <!--
    Это мы не трогаем пока...:
      <file path="catalog/controller/extension/module/filter.php">
        <operation>
          <search><![CDATA[]]></search>
          <add position="after"><![CDATA[
    
          ]]></add>
        </operation>
        <operation>
          <search><![CDATA[]]></search>
          <add position="after"><![CDATA[
    
          ]]></add>
        </operation>
      </file>
    
      <file path="catalog/model/.....">
        <operation>
          <search><![CDATA[]]></search>
          <add position="after"><![CDATA[
    
          ]]></add>
        </operation>
      </file>
     
       <file path="catalog/view/theme/default/template/product/product.twig">
        <operation>
          <search><![CDATA[]]></search>
          <add position="replace"><![CDATA[
    
          ]]></add>
        </operation>
      </file>
    -->
    
    <!--
    Изменения для:
    - перевод для дополнительного поля
    Изменения в:
    admin/language/en-gb/catalog/filter.php
    admin/language/ru-ru/catalog/filter.php
    -->
      <file path="admin/language/en-gb/catalog/filter.php">
        <operation>
          <search><![CDATA[$_['column_group']      = 'Filter Group';]]></search>
          <add position="after"><![CDATA[
    $_['column_extra_group']      = 'Additional Filter Group';
          ]]></add>
        </operation>
        <operation>
          <search><![CDATA[$_['entry_group']       = 'Filter Group Name';]]></search>
          <add position="after"><![CDATA[
    $_['entry_extra_group']       = 'Additional Filter Group Name';
          ]]></add>
        </operation>
      </file>
    
      <file path="admin/language/ru-ru/catalog/filter.php">
        <operation>
          <search><![CDATA[$_['column_group']      = 'Группа фильтра';]]></search>
          <add position="after"><![CDATA[
    $_['column_extra_group']      = 'Дополнительная Группа фильтра';
          ]]></add>
        </operation>
        <operation>
          <search><![CDATA[$_['entry_group']]]></search>
          <add position="before"><![CDATA[
    $_['entry_extra_group']       = 'Дополнительное Название группы фильтра';
          ]]></add>
        </operation>
      </file>
    
    </modification>
    

    Единственный момент:
    - почему-то в filter_list.twig
    - активная сортировка:
    Additional Filter Group
    - а не:
    Filter Group

    upload_2023-5-17_7-8-17.png
     

    Вложения:

    Последнее редактирование: 17 май 2023
    Ravilr нравится это.
  16. Maksikus

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

    Сообщения:
    84
    Симпатии:
    8
    Осталось сделать:
    - в категории и в товарах сделать привязку фильтра не по:
    Filter Group (name)
    - а по:
    Additional Filter Group (extra_name)
    - точнее в админке поиск по extra_name, а применение по name
     
    Последнее редактирование: 17 май 2023
  17. Maksikus

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

    Сообщения:
    84
    Симпатии:
    8
    С этим разобрался.
    Удалил операцию:
    Код:
      <file path="admin/controller/catalog/filter.php">
        <operation><!--117-->
          <search><![CDATA[$sort = 'fgd.name';]]></search>
          <add position="after" offset="1"><![CDATA[
            if (isset($this->request->get['sort'])) {
                $sort = $this->request->get['sort'];
            } else {
                $sort = 'fgd.extra_name';
            }
          ]]></add>
        </operation>
     
  18. Maksikus

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

    Сообщения:
    84
    Симпатии:
    8
    Готово.

    Черновой вариант работающий, оставляю черновой (вдруг кому-то пригодится для обучения):

    Огромедное спасибо (!!!): devimirochnik
     

    Вложения:

  19. Maksikus

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

    Сообщения:
    84
    Симпатии:
    8
    Чистовой вариант работающий.
     

    Вложения:

    devimirochnik нравится это.