Задать вопрос
@QTnub
Программист , музыкант , филантроп

Как сделать ajax ленту совместно с mFilter2?

Доброго дня, подскажите пожалуйста каким образом вместо пагинации результатов mFilter2 использовать безконечный скролл, как это сделать с getResources или pdoResources я знаю, написать сниппет который обработает результат pdoResources, вывести в формате json, а потом просто дергать нужное количество через post, а вот как это прикрутить к mFilter2 что то не могу понять как, заранее спасибо
  • Вопрос задан
  • 4065 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
Все довольно просто. mFilter пишет значения для фильтрации в url в виде get - параметров, а в качестве сниппета для пагинации используется pdoPage. Запросы при фильтрации и пагинации mFilter шлет на коннектор assets/components/msearch2/action.php.
В итоге вам надо взять любой js - плагин, который реализует бесконечный скролл, или написать его самому. При достижении конца страницы вы берете url разбиваете его на параметры (можно использовать ф-ю mSearch2.Hash.get() она является частью js api mSearch) и скармливаете их скрипту. Вот и все.
Когда-то я писал подобную реализацию для скроллинга использовал свой плагин miniScroll. Для него реализация будет выглядеть так:
var ms = $('.catalog_lattice');
var params = mSearch2.Hash.get();
params['action'] = 'filter';
params['pageId'] = mse2Config.pageId;
params['key'] = mse2Config.key;

ms.miniScroll({
    limit: 5,
    controllerUrl: 'assets/components/msearch2/action.php',
    responceType: 'json',
    dop: params,
    preloderPath: 'assets/templates/ikeds/img/loader.gif',
    success: function (responce, elm) {
        if (responce.data.results) {
            elm.find('.pager').before(responce.data.results);
        }
    }
});

Плагин писался давно и сейчас есть более достойные реализации. Сниппет mSearch вызываете как обычно, только скрываете ссылки с пагинацией.
Ответ написан
Комментировать
@QTnub Автор вопроса
Программист , музыкант , филантроп
большое спасибо за ответ , вопрос задавал давно , и уже сам разобрался , мой вариант выглядит так

(function(){
                var xhr_is_sent = false,        //флаг отправки
                    page_counter = 1,
                    total_node,
                    total = 0,
                    last_page = false,        
                    url = '/assets/components/msearch2/action.php',
                    param_1 = 'tv|area',
                    param_2 = 'tv|price',
                    param_3 = 'tv|metro',
                    area_min,
                    area_max,
                    price_min,
                    price_max,
                    loader,
                    items_per_page = 10,
                    anim_time = 100;
                
                // оборачиваем в jQ для DOM ready
                $(function(){
                    area_min = $('#area_0');
                    area_max = $('#area_1');
                    price_min = $('#price_0');
                    price_max = $('#price_1');
                    total_node = $('#mse2_total')
                    loader = $('.loader-content').css({opacity: '0', height: '0px', overflow: 'hidden'});
                    $('#mse2_results').on('resultsLoaded', function(){
                        page_counter = 1;
                        total = total_node.text()|0;
                        last_page = total > items_per_page ? false : true;
                    });
                    total = total_node.text()|0;
                    last_page = total > items_per_page ? false : true;
                });
                function showLoader(){
                    loader.stop(true).css({height: 'auto'}).animate({opacity: '1'}, anim_time, 'linear');
                }
                function hideLoader(){
                    loader.stop(true).animate({opacity: '0'}, anim_time, 'linear', function(){
                        loader.css({height: '0px'});
                    });
                }
                
                $(window).scroll(function() {
                    var data = {},
                        url_params = window.location.search.slice(1),
                        i, max;
                    if ($(window).scrollTop() == $(document).height() - $(window).height()) {
                        //отправляем запрос только если завершился предыдущий
                        if (!xhr_is_sent && !last_page) {
                            data.action = 'filter';
                            data.pageId = window.mse2Config.pageId;
                            data.key = window.mse2Config.key;
                            data.page = ++page_counter;
                            
                            xhr_is_sent = true;
                            last_page = total > items_per_page * page_counter ? false : true;
                            
                            if (url_params.length > 0) {
                                url_params = url_params.split('&');
                                for(i = 0, max = url_params.length; i < max; i++) {
                                    url_params[i] = url_params[i].split('=');
                                    if (url_params[i][0] === param_1) {
                                        data[param_1] = decodeURIComponent(url_params[i][1]);
                                    }
                                    if (url_params[i][0] === param_2) {
                                        data[param_2] = decodeURIComponent(url_params[i][1]);
                                    }
                                    if (url_params[i][0] === param_3) {
                                        data[param_3] = decodeURIComponent(url_params[i][1]);
                                    }
                                }
                            }
                            
                            showLoader();
                            
                            $.post(url, data, function(data){
                                    $('#mse2_results').append($.parseJSON(data).data.results);
                                    xhr_is_sent = false;
                                    hideLoader();
                                    $(window).trigger('ajax_loaded');
                            });
                        }
                    }
                });
            })();
Ответ написан
Комментировать
@php-include
Добрый день, а можно поподробней? что куда воткнуть
Ответ написан
Комментировать
Всё уже давно есть «из коробки»
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Rocket Смоленск
от 80 000 до 130 000 ₽
div. Ставрополь
от 40 000 до 90 000 ₽
Wanted. Санкт-Петербург
До 220 000 ₽
19 дек. 2024, в 02:11
15000 руб./за проект
19 дек. 2024, в 02:09
11000 руб./за проект
19 дек. 2024, в 00:46
30000 руб./за проект