mFilter2 и пункт "Все"

Здравствуйте!
Подскажите, как добавить к фильтру типа радио пункт «Все». Видел доку docs.modx.pro/components/msearch2/extension/components/msearch2/the-extension/example-of-filtering-products, но не соображу, что прописать в моем случае.
Александр Суркин
26 июня 2018, 11:13
modx.pro
1
1 620
+1

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

Баха Волков
27 июня 2018, 21:13
0
Можно же с помощью js, вроде как костыль, но решить можно
    Максим Кузнецов
    27 июня 2018, 22:03
    +1
    Указываем для нужного фильтра outer-чанк, в котором до плейсхолдера {$rows} дописываем:
    <label for="mse2_resource|{$название поля}_all" class="">
    	<input type="radio" name="{$название алиаса поля}" id="mse2_resource|{$название поля}_all" value=""{$.get.название_гет_параметра | length == 0 ? 'checked' : ''} /> Все
    </label>

    Суть: поскольку используется radio-инпут, достаточно передавать в value пустое значение, чтобы сбросить гет-параметр.

    Пример реализации.
      Баха Волков
      28 июня 2018, 08:06
      0
      Вот я муйню сморозил :) Я то думаю что нужно все значения передать :)
        Александр Суркин
        28 июня 2018, 08:58
        0
        Просто текст
          Максим Кузнецов
          28 июня 2018, 09:05
          0
          Если вы используете checkbox + старый mFilter2, я бы посоветовал сделать так:
          1. Подключаете любую js-библиотеку, взаимодействующую с get-параметрами или написать свои функции для их получения и изменения. Например, такие:

          function getURLParam(name) {
          	return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.search)||[,""])[1].replace(/\+/g, '%20'))||null;
          }
          
          
          function changeUrlParam(key, value, url) {
          	if (!url) {
          		url = window.location.href;
          	}
          
          	var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi"), hash;
          
          	if (re.test(url)) {
          		if (typeof value !== 'undefined' && value !== null) {
          			url = url.replace(re, '$1' + key + "=" + value + '$2$3');
          		}
          		else {
          			hash = url.split('#');
          			url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
          			if (typeof hash[1] !== 'undefined' && hash[1] !== null)  {
          				url += '#' + hash[1];
          			}
          		}
          	}
          	else {
          		if (typeof value !== 'undefined' && value !== null) {
          			var separator = url.indexOf('?') !== -1 ? '&' : '?';
          			hash = url.split('#');
          			url = hash[0] + separator + key + '=' + value;
          			if (typeof hash[1] !== 'undefined' && hash[1] !== null) {
          				url += '#' + hash[1];
          			}
          		}
          	}
          	
          	if (key && (value == '' || value === null)) {
          		//Присмотреться за работой - может стоит заменить на более обширную регулярку ([^&;]+?)(&|#|;|$)
          		var regular = new RegExp('[?|&]' + key + '=');
          		
          		url = url.replace(regular, "");
          	}
          	
          	window.history.replaceState('', '', url);
          }

          2. Добавляете в нужном месте кнопку сброса:
          <a onclick="changeUrlParam('category', ''); mSearch2.submit();">Сбросить поле 'category'</a>
          Александр Суркин
          28 июня 2018, 08:59
          0
          Благодарю вас за ответ! Прошу прощения, оказывается, я использую не радио, а чекбокс)). Просто разработка сайта была остановлена на некоторое время, и я позабыл, что и как.

          Подскажите, пожалуйста, как мне переделать под старый mfilter2 ваш код. Я сделал:

          <label for="mse2_[[+table]][[+delimeter]][[+filter]]_all" class="mse2_label all-items">
                  	<input type="checkbox" id="mse2_[[+table]][[+delimeter]][[+filter]]_all" name="[[+filter_key]]" class="check-all" value="" checked /> Все
                  	<span class="checkmark"></span>
                  </label>
          Что мне нужно написать в поле value?
            Максим Кузнецов
            28 июня 2018, 09:13
            0
            Если речь все еще о radio-кнопке, то примерно так:

            //Допустим, мы хотим добавить кнопку для родного поля ресурса parent, указав ему псевдоним category
            
            //'filters' => '
            //	resource|parent:default
            //',
            //'aliases' => '
            //	resource|parent==category
            //'
            
            //Код чанка будет следующим:
            <label for="mse2_resource|parent_all" class="">
            	<input type="radio" name="category" id="mse2_resource|parent_all" value=""{$.get.category | length == 0 ? 'checked' : ''} /> 
            	<span>Сбросить фильтр category</span> 
            </label>

            Расшифровка:
            — суффикс _all нужен исключительно для наглядности, вы можете заменить содержимое for и id на любое другое уникальное для фильтров данной категории значение.
            — в name передается название псевдонима фильтра. Если псевдоним отсутствует, указывается значение из filters (resource|parent)
            — в value ничего не указывается, он остается пустым (чтобы при нажатии функция mFilter2 сбросила значение требуемого фильтра)
            — обработка гет-параметра ($.get.category) нужна для проставления checked-состояния при первой загрузке страницы
            Александр Суркин
            28 июня 2018, 09:08
            0
            Разобрался! Спасибо вам большое!
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            8