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

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

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

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

Похожие вопросы
15 нояб. 2024, в 23:11
1000 руб./за проект
15 нояб. 2024, в 23:07
8000 руб./за проект
15 нояб. 2024, в 22:54
2000 руб./за проект