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

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

Доброго дня, подскажите пожалуйста каким образом вместо пагинации результатов mFilter2 использовать безконечный скролл, как это сделать с getResources или pdoResources я знаю, написать сниппет который обработает результат pdoResources, вывести в формате json, а потом просто дергать нужное количество через post, а вот как это прикрутить к mFilter2 что то не могу понять как, заранее спасибо
  • Вопрос задан
  • 3873 просмотра
Пригласить эксперта
Ответы на вопрос 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
Добрый день, а можно поподробней? что куда воткнуть
Ответ написан
Комментировать
Всё уже давно есть «из коробки»
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы