mSearch2 - сортировка кастомным select 'ом
Возникла необходимость кастомизировать стандартную сортировку компонента mSearch2.
Cортировка имела следующий вид:
Как оказалось компонент не может работать с select, а работает только тегом a. Ну да ладно, попробуем исправить это.
На сайте modx.pro в ветке Вопросы нашел вопрос Как сделать сортировку через select? от пользователя DimenSi. Вопрос частично решен если бы не одно НО
В шаблон вставляем
Элемент еще не может взаимодействовать с компонентом mSearch2.
Cортировка имела следующий вид:
Как оказалось компонент не может работать с select, а работает только тегом a. Ну да ладно, попробуем исправить это.
На сайте modx.pro в ветке Вопросы нашел вопрос Как сделать сортировку через select? от пользователя DimenSi. Вопрос частично решен если бы не одно НО
перестали работать фильтры, фильтрация срабатывает только после сортировки. Т.е. меняешь ценовой диапазон → ничего, после этого меняешь сортировку → срабатывает и сортировка и фильтр.
ПЛАН РАБОТЫ
- Установка кастомного селеста
- Написание скрипта для взаимодействия сортировки с компонентом
Установка кастомного селеста
В качестве select'a будем использовать bootstrap-select. Инструкцию по установке можно посмотреть на сайтеВ шаблон вставляем
<select class="selectpicker pull-right" id="mse2_sort">
<option class="sort" data-sort="ms$price" value="asc" data-icon="glyphicon-sort-by-attributes">По цене</option>
<option class="sort" data-sort="ms$price" value="desc" data-icon="glyphicon-sort-by-attributes-alt">По цене</option>
</select>
Наш select приобрел новый вид:Элемент еще не может взаимодействовать с компонентом mSearch2.
Пишем скрипт взаимодействия сортировки с компонентом
Сам скрипт получился не объемный, я сам конечно не силен в js. Выношу его на обозрение.$(document).ready(function() {
$(document).on('change', '#mse2_sort', function() {
var selected = $(this).find('option:selected');
var sort = selected.data('sort');
sort += mse2Config.method_delimeter + selected.val();
mse2Config.sort = sort;
mSearch2.submit();
});
});
Комментарии: 8
Делал похожую штуку правда пришлось мне править скрипты минишопа. Это решение мне нравится больше
Тут ещё решение есть, проверено
доступ к посту закрыт
Отличное решение, реализовал на своем сайте, спасибо!
Дополню немного)
На случай если вам нужно еще По-умолчанию
Html
На случай если вам нужно еще По-умолчанию
Html
<option class="sort" data-sort="" value="">По умолчанию</option>
JS$(document).ready(function() {
$(document).on('change', '#mse2_sort', function() {
var selected = $(this).find('option:selected');
var sort = selected.data('sort');
if(sort!=""){
sort += mse2Config.method_delimeter + selected.val();
}else{
sort = '';
}
mse2Config.sort = sort;
mSearch2.submit();
});
});
Не хочет работать с сортировкой по названию.
Делаю так
Делаю так
<select class="selectpicker pull-right" id="mse2_sort">
<option class="sort" data-sort="ms|price" value="asc">По цене возр</option>
<option class="sort" data-sort="ms|price" value="desc">По цене убыв</option>
<option class="sort" data-sort="resource|pagetitle" value="asc">Название (А - Я)</option>
<option class="sort" data-sort="resource|pagetitle" value="desc">Название (Я - А)</option>
</select>
Сортирую по названию, а в урле все равно параметр ?sort=ms|price остается.
У меня заработало так:
<select class="selectpicker pull-right" id="mse2_sort">
<option class="sort" data-sort="pagetitle" value="asc">Название (А - Я)</option>
<option class="sort" data-sort="pagetitle" value="desc">Название (Я - А)</option>
</select>
У меня такой способ сортировки убивает выбор страницы.
Выбираешь вторую страницу (в урл добавляется ?page=2)
Меняешь сортировку — открывается 1-я страница, а из урл уходит ?page=2
Вот бы знающий доделал доработку — выбор селектом способа сортирвки довольно обыденная вещь на других движках
Выбираешь вторую страницу (в урл добавляется ?page=2)
Меняешь сортировку — открывается 1-я страница, а из урл уходит ?page=2
Вот бы знающий доделал доработку — выбор селектом способа сортирвки довольно обыденная вещь на других движках
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.