Ограничить количество ссылок, показанных с разбиением на страницы Laravel
Любой простой способ ограничить, сколько ссылок показано с разбивкой по страницам Laravels?
В настоящее время он показывает не более 13 ссылок (Prev, 1 2 3 4 5 7 8.. 78 79 следующий)
Однако это слишком много для мобильных устройств и становится двухлинейной навигацией... есть ли способ установить ссылки, например. только показать 10?
Я столкнулся с презентатором, но ничего действительно не работало.
Спасибо
Ответы
Ответ 1
Старый способ определения пользовательского презентатора не работает с Laravel 5.3+, количество отображаемых ссылок кажется жестко закодированным в параметре $onEachSide
Illuminate/Pagination/UrlWindow::make()
:
public static function make(PaginatorContract $paginator, $onEachSide = 3)
В итоге я просто написал свою собственную функцию render(), украв какой-то код из LengthAwarePaginator
/**
* Stole come code from LengthAwarePaginator::render() and ::elements() to allow for a smaller UrlWindow
*
* @param LengthAwarePaginator $paginator
* @param int $onEachSide
* @return string
*/
public static function render(LengthAwarePaginator $paginator, $onEachSide = 2)
{
$window = UrlWindow::make($paginator, $onEachSide);
$elements = array_filter([
$window['first'],
is_array($window['slider']) ? '...' : null,
$window['slider'],
is_array($window['last']) ? '...' : null,
$window['last'],
]);
return LengthAwarePaginator::viewFactory()->make(LengthAwarePaginator::$defaultView, [
'paginator' => $paginator,
'elements' => $elements,
])->render();
}
}
Мы используем Twig, поэтому я зарегистрировал это как фильтр Twig, я предполагаю, что для Blade можно сделать что-то подобное.
Ответ 2
Я создал новый пользовательский презентатор, чтобы показать только 10 ссылок. Он включает в себя 3 этапа:
Создайте собственный пользовательский презентатор
use Illuminate\Pagination\BootstrapPresenter;
class CustomPresenter extends BootstrapPresenter{
protected function getPageSlider()
{
// Changing the original value from 6 to 3 to reduce the link count
$window = 3;
// If the current page is very close to the beginning of the page range, we will
// just render the beginning of the page range, followed by the last 2 of the
// links in this list, since we will not have room to create a full slider.
if ($this->currentPage <= $window)
{
$ending = $this->getFinish();
return $this->getPageRange(1, $window + 2).$ending;
}
// If the current page is close to the ending of the page range we will just get
// this first couple pages, followed by a larger window of these ending pages
// since we're too close to the end of the list to create a full on slider.
elseif ($this->currentPage >= $this->lastPage - $window)
{
$start = $this->lastPage - 8;
$content = $this->getPageRange($start, $this->lastPage);
return $this->getStart().$content;
}
// If we have enough room on both sides of the current page to build a slider we
// will surround it with both the beginning and ending caps, with this window
// of pages in the middle providing a Google style sliding paginator setup.
else
{
$content = $this->getAdjacentRange();
return $this->getStart().$content.$this->getFinish();
}
}
}
Создайте свой собственный просмотр страниц (например, custom-paginator.php), поместите в папку views
<ul class="pagination">
<?php echo with(new CustomPresenter($paginator))->render(); ?>
</ul>
Обновите приложение /config.view.php
'pagination' => 'custom-paginator',
Сделав следующие изменения, вы сможете получить 10 ссылок на страницы.
Надеюсь, что эта помощь: D
Ответ 3
Я знаю, это старый вопрос, но до сих пор нет возможности установить параметры функции links(). Я сделал простой код jQuery, возможно, это поможет кому-то. Это намного проще, чем ответ Зески. Я не имею в виду лучше, просто проще:)
JavaScript:
(function($) {
$('ul.pagination li.active')
.prev().addClass('show-mobile')
.prev().addClass('show-mobile');
$('ul.pagination li.active')
.next().addClass('show-mobile')
.next().addClass('show-mobile');
$('ul.pagination')
.find('li:first-child, li:last-child, li.active')
.addClass('show-mobile');
})(jQuery);
CSS
@media (max-width: /* write what you need, for me it 560px */) {
ul.pagination li:not(.show-mobile) {
display: none;
}
}
Этот код отображает только несколько элементов li. Активен, два перед, два после, предыдущие/следующие стрелки. Это делает только 7 видимых элементов больше, чем 15.
Ответ 4
Есть много способов сделать это в зависимости от того, как именно вы хотите, чтобы он вел себя.
Для моих нужд я хотел быстрое решение, чтобы сократить его, чтобы оно не нарушало мои мобильные макеты.
Ларавел 5.3
Отредактируйте этот файл: (или тот, который вы используете в своих вызовах paginator)
/vendor/pagination/bootstrap-4.blade.php
Я добавляю одну строку, чтобы выйти из цикла рендеринга ссылок после 2 ссылок.
{{-- Array Of Links --}}
@if (is_array($element))
@foreach ($element as $page => $url)
@if ($page == $paginator->currentPage())
<li class="page-item active"><span class="page-link">{{ $page }}</span></li>
@else
<li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
{{--Add the line below to limit rendered links--}}
<?php if($loop->count > 2) break; ?>
@endif
@endforeach
@endif
Ответ 5
Для Laravel 5. 6+
Опубликовать шаблон поставщика:
php artisan vendor:publish --tag=laravel-pagination
Отредактируйте bootstrap-4.blade.php
следующим образом:
@if ($paginator->hasPages())
<ul class="pagination" role="navigation">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
<span class="page-link" aria-hidden="true">‹</span>
</li>
@else
<li class="page-item">
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">‹</a>
</li>
@endif
<?php
$start = $paginator->currentPage() - 2; // show 3 pagination links before current
$end = $paginator->currentPage() + 2; // show 3 pagination links after current
if($start < 1) {
$start = 1; // reset start to 1
$end += 1;
}
if($end >= $paginator->lastPage() ) $end = $paginator->lastPage(); // reset end to last page
?>
@if($start > 1)
<li class="page-item">
<a class="page-link" href="{{ $paginator->url(1) }}">{{1}}</a>
</li>
@if($paginator->currentPage() != 4)
{{-- "Three Dots" Separator --}}
<li class="page-item disabled" aria-disabled="true"><span class="page-link">...</span></li>
@endif
@endif
@for ($i = $start; $i <= $end; $i++)
<li class="page-item {{ ($paginator->currentPage() == $i) ? ' active' : '' }}">
<a class="page-link" href="{{ $paginator->url($i) }}">{{$i}}</a>
</li>
@endfor
@if($end < $paginator->lastPage())
@if($paginator->currentPage() + 3 != $paginator->lastPage())
{{-- "Three Dots" Separator --}}
<li class="page-item disabled" aria-disabled="true"><span class="page-link">...</span></li>
@endif
<li class="page-item">
<a class="page-link" href="{{ $paginator->url($paginator->lastPage()) }}">{{$paginator->lastPage()}}</a>
</li>
@endif
{{-- Next Page Link --}}
@if ($paginator->hasMorePages())
<li class="page-item">
<a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">›</a>
</li>
@else
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
<span class="page-link" aria-hidden="true">›</span>
</li>
@endif
</ul>
@endif
Этот пример корректно обрабатывает новые классы CSS, активную ссылку, три точки (правильно, а не 1..2 3 4) и настраивается ли он (количество страниц, которые вы хотите показать).
пример
Три точки обрабатываются правильно
Ответ 6
Моя таблица была слишком узкой, поэтому я решил показать только первую и последнюю ли (стрелки Next и Back) разбивки на страницы с помощью jQuery filter(). Вы можете настроить это далее.
$('ul.pagination li').hide().filter(':lt(1), :nth-last-child(1)').show();
Обязательно добавьте его до конца тега тела.
Ответ 7
Это старый вопрос, но я подумал, что поделился бы тем, как я недавно добился сокращения количества ссылок на страницы в приложении Laravel 5.2:
Внутри ViewServiceProvider
:
\Illuminate\Pagination\AbstractPaginator::presenter(function($paginator) {
return new \App\Pagination\BootstrapPresenter($paginator);
});
App\Разбивка\BootstrapPresenter.php
<?php namespace App\Pagination;
use Illuminate\Pagination\UrlWindow;
use Illuminate\Contracts\Pagination\Paginator as PaginatorContract;
use Illuminate\Pagination\BootstrapThreePresenter as LaravelBootstrapThreePresenter;
class BootstrapPresenter extends LaravelBootstrapThreePresenter
{
/**
* Create a new Bootstrap presenter instance.
*
* @param \Illuminate\Contracts\Pagination\Paginator $paginator
* @param \Illuminate\Pagination\UrlWindow|null $window
* @return void
*/
public function __construct(PaginatorContract $paginator, UrlWindow $window = null)
{
$this->paginator = $paginator;
// Make the pagination window smaller (default is 3).
$this->window = UrlWindow::make($paginator, 1);
}
}
From:
![введите описание изображения здесь]()
To:
![введите описание изображения здесь]()
Ответ 8
Создайте один файл default.blade.php в новой папке пагинации в папке просмотра с кодом ниже. Это означает, что вы изменили файл пагинации ядра с помощью нашего нового файла пагинации. Это установит некоторый предел в ссылке на страницы.
@if ($paginator->hasPages())
<ul class="pagination pagination">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="disabled"><span>«</span></li>
@else
<li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">«</a></li>
@endif
@if($paginator->currentPage() > 3)
<li class="hidden-xs"><a href="{{ $paginator->url(1) }}">1</a></li>
@endif
@if($paginator->currentPage() > 4)
<li><span>...</span></li>
@endif
@foreach(range(1, $paginator->lastPage()) as $i)
@if($i >= $paginator->currentPage() - 2 && $i <= $paginator->currentPage() + 2)
@if ($i == $paginator->currentPage())
<li class="active"><span>{{ $i }}</span></li>
@else
<li><a href="{{ $paginator->url($i) }}">{{ $i }}</a></li>
@endif
@endif
@endforeach
@if($paginator->currentPage() < $paginator->lastPage() - 3)
<li><span>...</span></li>
@endif
@if($paginator->currentPage() < $paginator->lastPage() - 2)
<li class="hidden-xs"><a href="{{ $paginator->url($paginator->lastPage()) }}">{{ $paginator->lastPage() }}</a></li>
@endif
{{-- Next Page Link --}}
@if ($paginator->hasMorePages())
<li><a href="{{ $paginator->nextPageUrl() }}" rel="next">»</a></li>
@else
<li class="disabled"><span>»</span></li>
@endif
</ul>
@endif
Затем, где вы хотите получить нумерацию страниц, вы должны вызвать функцию пагинации laravel с этим параметром файла представления.
$data->links('pagination.default')
Ответ 9
Теперь в Laravel 5.7 появился новый метод разбиения на страницы, чтобы настроить количество ссылок на каждой стороне пагинатора. Благодаря новому методу в некоторых случаях вам больше не нужен настраиваемый вид нумерации страниц. Вот API, который вы можете использовать для определения количества ссылок на каждой стороне текущей страницы:
User::paginate(10)->onEachSide(2);
напишите этот код на вашем контроллере.
вы можете увидеть более подробную информацию на https://laravel-news.com/laravel-5-7-pagination-link-customizations
Ответ 10
Это более старый вопрос, но ни один из ответов не соответствует последней документации Laravel. В более новых версиях Laravel (Laravel 5. 6+) эта проблема может быть несколько легко решена, но для этого необходимо опубликовать представления разбиения на страницы поставщика в соответствии с документацией Laravel. Предполагая, что вы еще не опубликовали или не изменили представление разбиения на страницы по умолчанию, вы выполните следующую команду:
php artisan vendor:publish --tag=laravel-pagination
Как только представления будут опубликованы, вы найдете bootstrap-4.blade.php в каталоге resources/views/vendor/pagination. Вы можете отредактировать этот файл и сделать так, чтобы ссылки на страницы отображались так, как вы хотите. Чтобы уменьшить количество ссылок, отображаемых по умолчанию, я просто использовал немного встроенного php, чтобы установить индекс и ограничить количество отображаемых ссылок, как показано ниже:
{{-- Array Of Links --}}
@if (is_array($element))
<?php $index = 0; ?>
@foreach ($element as $page => $url)
@if($index<4)
@if ($page == $paginator->currentPage())
<li class="page-item active" aria-current="page"><span class="page-link">{{ $page }}</span></li>
@else
<li class="page-item"><a class="page-link" href="{{ $url }}">{{ $page }}</a></li>
@endif
@endif
<?php $index++ ?>
@endforeach
@endif
Большая часть этого кода находится в блейд-представлении по умолчанию для bootstrap-4.blade.php, но я добавил код $ index = 0, $ index <4, $index++, чтобы ОГРАНИЧИТЬ число ссылок в левой части страницы до 4.
Это правильный способ решения этой проблемы в соответствии с документацией Laravel, без редактирования файлов вендора компоновщика или попытки взлома системы каким-либо другим способом. Я понимаю, что JR Lawhorne опубликовал аналогичный ответ, но он не включает весь процесс публикации файла поставщика перед публикацией. Надеюсь, что это помогает другим.
Ответ 11
Я использовал css, чтобы ограничить ссылки, которые я позволил. Действительно просто.. это может быть расширено, чтобы показать любое количество страниц при любом количестве точек останова
@media screen and ( max-width: 400px ){
li.page-item {
display: none;
}
.page-item:first-child,
.page-item:nth-child( 2 ),
.page-item:nth-last-child( 2 ),
.page-item:last-child,
.page-item.active,
.page-item.disabled {
display: block;
}
}
эта конкретная реализация допускает стрелки, "...", первую страницу, активную страницу и последнюю страницу