[mSearch2] Версия 1.4.0 с поддержкой History Api

Представляю вам новую версию mSearch2, в которой сильно доработан стандартный javascript.

Теперь фильтры реагируют кнопки браузера взад-вперёд — это поддержка событий History Api. Пришлось повозиться, но работают все стандартные элементы: чекбоксы, радиокнопки, селекты, выбранное, сортировка, лимит и шаблон.

Заходите на страницу поиска, нажимайте на всякие фильтры, а потом тыкайте в браузере кнопочку назад — и в фильтре всё поменяется, как было натыкано. В общем, прикольно, давно просили.

Второе изменение, неразрывно связанное в первым — возможность сброса фильтра. Работает точно так же, как и обычная кнопка reset формы, только с поддержкой History Api и прочих плюшек. Чтобы оно работало, вам нужно просто добавить кнопку с type=reset в форму. Я предлагаю делать это вот так:
<form action="" method="post" id="mse2_filters">
	[[+filters]]
	
	[[+filters:isnot=``:then=`
		<button type="reset" class="btn btn-default">[[%mse2_reset]]</button>
		<button type="submit" class="btn btn-success pull-right hidden">[[%mse2_submit]]</button>
		<div class="clearfix"></div>
	`]]
</form>


Как видно в коде, есть еще и кнопка submit. Зачем она, если страница и так сразу обновляет результаты при изменении любого фильтра? Не знаю, но вопросов об этом было множество, так что сделал.

Чтобы включить кнопку отправки формы, вам нужно добавить в action адрес для отправки формы, не совпадающий с текущей страницей.
<form action="[[~15]]" method="post" id="mse2_filters">
	[[+filters]]
</form>
То есть, если action пустой или равен текущей странице [[~[[*id]]]], то фильтр обновляется сразу, как обычно. Если же action отличается, то при кликах по фильтру ничего не происходит и вам нужно отправлять форму вручную, через появившуюся кнопку. Конечно, suggestions в таком режиме нужно отключить.

Еще добавлена возможность использовать несколько блоков пагинаций. Теперь javascript ищет и не по id #mse2_pagination, а по классу .mse2_pagination.

Ну и на сладкое, я немного изменил процесс инициализации скриптов, и теперь вы можете не просто указывать свой javascript файл вместо родного, а наследовать его и перезагружать какие-то методы.
  1. Очищаем системный параметр mse2_frontend_js
  2. Подключаем /assets/components/msearch2/js/web/default.js где-нибудь вручную
  3. После этого переписываем какой-то из его методов. Например:
    <script type="text/javascript">
    	$(document).ready(function() {
    		if (typeof(mSearch2) != 'undefined') {
    			mSearch2.load = function() { alert() };
    		}
    	})
    </script>
  4. Сам фильтр будет проинициализирован в конце загрузки страницы, после вашей перезаписи.
Всё, теперь при клике на фильтр будет выпрыгивать весёлый alert.

Новая версия уже доступна в магазине, можно обновляться.
Василий Наумкин
12 ноября 2015, 15:33
modx.pro
2
2 852
+10

Комментарии: 6

Максим Кузнецов
12 ноября 2015, 19:20
+1
По наследованию, сбросу и блокам пагинации — очень актуально, большое спасибо)

По поводу history api — можно ли добавить какой-то параметр, позволяющий выключать его? — при использовании своих методов с history api, результат при переключении стрелками браузера порой выдает кашу.

UPD: По поводу кнопки сброса — скорее всего баг: при переходе/обновлении страницы с уже заданным параметром фильтрации в адресной строке, после чего, пощелкав фильтры и последующим нажатии на сброс, сбрасываются не все фильтры в принципе, но остается изначально-введенные при заходе на страницу.
    Василий Наумкин
    12 ноября 2015, 19:30
    0
    можно ли добавить какой-то параметр, позволяющий выключать его?
    Я вроде только что написал, как можно менять родные методы. Просто перепиши методы класса mSearch2.Hash как нужно.

    сбрасываются не все фильтры в принципе, но остается изначально-введенные при заходе на страницу
    Так ведёт себя reset формы в HTML, я решил не нарушать логику.
    Андрей Сухомозгий
    20 ноября 2015, 01:33
    0
    Василий, доброй ночи! Заметил на твоем демо сайте один вот такой момент:
    переходим на страницу каталога, видим, что рядом с чекбоксом «Старая цена», стоит цифра 2 (но на самом деле товаров со старой ценой 4), а когда нажимаем сбросить фильтр и выбираем какой-нибудь из фильтров — цифра формируется верная…


    А на странице поиска (если искать по слову «Товар») когда кликаешь по фильтрам, а потом жмешь сбросить, то фильтр будто зависает:

    Помогает только перезагрузка…
    Это в компоненте такая небольшая беда?
    Григорий Коленько
    04 декабря 2015, 16:35
    0
    Василий, привет, отправка формы по клику кнопки некорректно работает. Если выбираешь в фильтре что-то, то редеректит сразу же, до нажатия на кнопку.
    Проблему вижу тут:
    $(document).on('change', this.options.filters, function (e) {
                    return mSearch2.submit();
                });
    Условия нехватает
    if (this.autoLoad) {
                $(document).on('change', this.options.filters, function (e) {
                    return mSearch2.submit();
                });
            }
      Сергей Шлоков
      08 июля 2016, 09:33
      0
      В некоторых запросах появляется такая строчка.
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        6