Laravel и Infinite Scroll

У меня есть вопрос о разметке страницы и бесконечном прокрутке:

Прежде всего, у меня есть это:

<div class="row">   

<div id="boxes">

    @forelse($duels->results as $d)

        <div class="col-span-4 box notizy">

            @include('versus.versus')

        </div>



    @empty



    @endforelse

</div>

<div class="col-span-12">
    <div class="paginate text-center">
        {{$duels->links()}}
    </div>
</div>

Как мы видим, у меня есть div #boxes, которые содержат divs .box. Пагинация задана Laravel и выглядит следующим образом:

<div class="col-span-12">
    <div class="paginate text-center">
        <div class="pagination">
            <ul>
                <li class="previous_page disabled"><a href="#">&laquo; Previous</a></li>
                <li class="active"><a href="#">1</a></li> <li><a href="index.php?page=2">2</a></li>
                <li class="next_page"><a href="index.php?page=2">Next &raquo;</a></li>
            </ul>
            </div>      
      </div>
</div>

Итак, теперь я хочу поместить бесконечный свиток вместо разбивки на страницы. Как мне сделать, используя https://github.com/paulirish/infinite-scroll?

Я остаюсь здесь, если у вас есть вопросы!

PS: Я пробовал несколько вещей, но никто не работал:

    $('#boxes').infinitescroll({
    loading: {
        finished: undefined,
        finishedMsg: "<em>Congratulations, you've reached the end of the internet.</em>",
        msg: null,
        msgText: "<em>Loading the next set of posts...</em>",
        selector: null,
        speed: 'fast',
        start: undefined
    },
    state: {
        isDuringAjax: false,
        isInvalidPage: false,
        isDestroyed: false,
        isDone: false, // For when it goes all the way through the archive.
        isPaused: false,
        currPage: 1
    },
    debug: false,
    behavior: undefined,
    binder: $(window), // used to cache the selector for the element that will be scrolling
    nextSelector: "div.paginate li.active a",
    navSelector: "div.paginate",
    contentSelector: null, // rename to pageFragment
    extraScrollPx: 0,
    itemSelector: "div.notizy",
    animate: false,
    pathParse: undefined,
    dataType: 'html',
    appendCallback: true,
    bufferPx: 40,
    errorCallback: function () { },
    infid: 0, //Instance ID
    pixelsFromNavToBottom: undefined,
    path: undefined, // Can either be an array of URL parts (e.g. ["/page/", "/"]) or a function that accepts the page number and returns a URL
    prefill: false, // When the document is smaller than the window, load data until the document is larger or links are exhausted
    maxPage:undefined // to manually control maximum page (when maxPage is undefined, maximum page limitation is not work)
});

На основе страницы github (и замены того, что должно быть заменено), но нет никакого эффекта.

Ответ 1

Я нашел решение (для вас, людей будущего):

$('#boxes').infinitescroll({
    navSelector     : ".paginate",
    nextSelector    : ".paginate a:last",
    itemSelector    : ".box",
    debug           : false,
    dataType        : 'html',
    path: function(index) {
        return "?page=" + index;
    }
}, function(newElements, data, url){

    var $newElems = $( newElements );
    $('#boxes').masonry( 'appended', $newElems, true);

});

Это работает, потому что:

  • Очертание, данное laravel 4, похоже на то, что мы видели раньше
  • Разбиение страницы в laravel дает URL-адрес, например....? page = x

ВАЖНО

Ошибка, с которой вы столкнетесь:

Когда вы прокрутите страницу вниз, чем последняя страница, вы, вероятно, обнаружите, что продолжаете получать последнюю страницу заново и снова, вызывая истинную бесконечную прокрутку.

чтобы исправить это, перейдите к paginator.php(в папке laravel) и измените его следующим образом:

if (is_numeric($page) and $page > $last = ceil($total / $per_page))
    {
        return Response::error('404');
    }

Надеюсь, это когда-нибудь поможет кому-нибудь!

Ответ 2

Существует также способ реализовать это с помощью другого бесконечного плагина прокрутки https://github.com/pklauzinski/jscroll.

Предполагая, что у вас есть простой вид Blade:

<div class="scroll">
<ol>
    @foreach($media as $m)
        <li>{{$m->title}}</li>
    @endforeach
</ol>

{{$media->links()}}
</div>

Мы можем добиться бесконечной прокрутки со следующим JS-кодом

<?=HTML::script('<YOUR PATH HERE>jquery.jscroll/jquery.jscroll.min.js');?>
<script type="text/javascript">
$(function() {
    $('.scroll').jscroll({
        autoTrigger: true,
        nextSelector: '.pagination li.active + li a', 
        contentSelector: 'div.scroll',
        callback: function() {
            $('ul.pagination:visible:first').hide();
        }
    });
});
</script>

Свойство nextSelector выберет ссылку следующей страницы в вашем пейджинге по умолчанию Laravel, contentSelector выбирает только необходимый контент, а функция обратного вызова скрывает содержимое подкачки (мне пришлось вручную скрыть ее, потому что их атрибут pagingSelector для меня недействителен). Сведения о режиме можно найти на домашней странице плагина.

Ответ 3

Благодарим Pretty Good Blanc за это решение, он работает хорошо. Однако, как мне кажется, в Laravel 4 у Response Facade больше нет метода error(), поэтому что-то вроде App::abort('404', '...') или Response::make('...', 404) будет работать. Просто не забудьте добавить use Illuminate\Support\Facades\.. в файл, так как файл находится в пространстве имен.

Я думаю, что более чистый способ сделать это - это, вероятно, расширить класс Paginator и реализовать функцию getCurrentPage. Таким образом, изменения не будут уничтожены, если вы выполните php composer.phar update, которые могут перезаписать файлы в каталоге поставщика.