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="#">« 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 »</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
, которые могут перезаписать файлы в каталоге поставщика.