Laravel 5 中的自定义分页视图
Custom pagination view in Laravel 5
Laravel 4.2 可以选择在 app/config/view.php
中指定自定义视图,例如:
/*
|--------------------------------------------------------------------------
| Pagination View
|--------------------------------------------------------------------------
|
| This view will be used to render the pagination link output, and can
| be easily customized here to show any view you like. A clean view
| compatible with Twitter's Bootstrap is given to you by default.
|
*/
'pagination' => 'pagination_slider-alt'
这在 Laravel 5 至少关于 view.php
.
已经消失了
有没有办法在 Laravel 5 中复制这种行为?
在 Laravel 5 中,自定义分页基于演示者(classes)而不是视图。
假设您在路由代码中有
$users = Users::paginate(15);
在 L4 中,您曾经在视图中做过这样的事情:
$users->appends(['sort' => 'votes'])->links();
在 L5 中,您改为:
$users->appends(['sort' => 'votes'])->render();
render()
方法接受一个 Illuminate\Contracts\Pagination\Presenter
实例。您可以创建一个自定义 class 来实现该协定并将其传递给 render()
方法。请注意 Presenter
是一个 接口 ,而不是 class,因此你必须 实现 它,而不是 扩展它。这就是您收到错误的原因。
或者,您可以扩展 Laravel 分页器(以便使用其分页逻辑),然后将现有的分页实例 ($users->...
) 传递给扩展的 class 构造函数。这确实是我基于 Laravel 提供的 Bootstrap 演示器创建自定义 Zurb Foundation 演示器所做的。它使用所有 Laravel 分页逻辑,仅覆盖渲染方法。
对于我的自定义演示者,我的视图如下所示:
with(new \Stolz\Laravel\Pagination($users->appends(['sort' => 'votes'])))->render();
我的自定义分页展示器是:
<?php namespace Stolz\Laravel;
use Illuminate\Pagination\BootstrapThreePresenter;
class Pagination extends BootstrapThreePresenter
{
/**
* Convert the URL window into Zurb Foundation HTML.
*
* @return string
*/
public function render()
{
if( ! $this->hasPages())
return '';
return sprintf(
'<ul class="pagination" aria-label="Pagination">%s %s %s</ul></div>',
$this->getPreviousButton(),
$this->getLinks(),
$this->getNextButton()
);
}
/**
* Get HTML wrapper for disabled text.
*
* @param string $text
* @return string
*/
protected function getDisabledTextWrapper($text)
{
return '<li class="unavailable" aria-disabled="true"><a href="javascript:void(0)">'.$text.'</a></li>';
}
/**
* Get HTML wrapper for active text.
*
* @param string $text
* @return string
*/
protected function getActivePageWrapper($text)
{
return '<li class="current"><a href="javascript:void(0)">'.$text.'</a></li>';
}
/**
* Get a pagination "dot" element.
*
* @return string
*/
protected function getDots()
{
return $this->getDisabledTextWrapper('…');
}
}
而在 Laravel 4.2 中我会使用:
{{ $users->links('view.name') }}
在 Laravel 5 中,您可以使用以下内容复制上面的内容:
@include('view.name', ['object' => $users])
现在在包含的视图中,$object
将具有可用的分页方法,例如currentPage()
、lastPage()
、perPage()
等
查看所有可用的方法
在Laravel 5.3+中使用
$users->links('view.name')
在Laravel 5.0 - 5.2而不是
$users->render()
使用
@include('pagination.default', ['paginator' => $users])
views/pagination/default.blade.php
@if ($paginator->lastPage() > 1)
<ul class="pagination">
<li class="{{ ($paginator->currentPage() == 1) ? ' disabled' : '' }}">
<a href="{{ $paginator->url(1) }}">Previous</a>
</li>
@for ($i = 1; $i <= $paginator->lastPage(); $i++)
<li class="{{ ($paginator->currentPage() == $i) ? ' active' : '' }}">
<a href="{{ $paginator->url($i) }}">{{ $i }}</a>
</li>
@endfor
<li class="{{ ($paginator->currentPage() == $paginator->lastPage()) ? ' disabled' : '' }}">
<a href="{{ $paginator->url($paginator->currentPage()+1) }}" >Next</a>
</li>
</ul>
@endif
就是这样。
如果您有很多页面,请使用此模板:
views/pagination/limit_links.blade.php
<?php
// config
$link_limit = 7; // maximum number of links (a little bit inaccurate, but will be ok for now)
?>
@if ($paginator->lastPage() > 1)
<ul class="pagination">
<li class="{{ ($paginator->currentPage() == 1) ? ' disabled' : '' }}">
<a href="{{ $paginator->url(1) }}">First</a>
</li>
@for ($i = 1; $i <= $paginator->lastPage(); $i++)
<?php
$half_total_links = floor($link_limit / 2);
$from = $paginator->currentPage() - $half_total_links;
$to = $paginator->currentPage() + $half_total_links;
if ($paginator->currentPage() < $half_total_links) {
$to += $half_total_links - $paginator->currentPage();
}
if ($paginator->lastPage() - $paginator->currentPage() < $half_total_links) {
$from -= $half_total_links - ($paginator->lastPage() - $paginator->currentPage()) - 1;
}
?>
@if ($from < $i && $i < $to)
<li class="{{ ($paginator->currentPage() == $i) ? ' active' : '' }}">
<a href="{{ $paginator->url($i) }}">{{ $i }}</a>
</li>
@endif
@endfor
<li class="{{ ($paginator->currentPage() == $paginator->lastPage()) ? ' disabled' : '' }}">
<a href="{{ $paginator->url($paginator->lastPage()) }}">Last</a>
</li>
</ul>
@endif
你好,这是我的分页代码:在 blade 中使用
@include('pagination.default', ['paginator' => $users])
Views/pagination/default.blade.php
@if ($paginator->lastPage() > 1)
si la pagina actual es distinto a 1 y hay mas de 5 hojas muestro el boton de 1era hoja --> if actual page is not equals 1, and there is more than 5 pages then I show first page button --> @if ($paginator->currentPage() != 1 && $paginator->lastPage() >= 5) << @endif
<!-- si la pagina actual es distinto a 1 muestra el boton de atras -->
@if($paginator->currentPage() != 1)
<li>
<a href="{{ $paginator->url($paginator->currentPage()-1) }}" >
<
</a>
</li>
@endif
<!-- dibuja las hojas... Tomando un rango de 5 hojas, siempre que puede muestra 2 hojas hacia atras y 2 hacia adelante -->
<!-- I draw the pages... I show 2 pages back and 2 pages forward -->
@for($i = max($paginator->currentPage()-2, 1); $i <= min(max($paginator->currentPage()-2, 1)+4,$paginator->lastPage()); $i++)
<li class="{{ ($paginator->currentPage() == $i) ? ' active' : '' }}">
<a href="{{ $paginator->url($i) }}">{{ $i }}</a>
</li>
@endfor
<!-- si la pagina actual es distinto a la ultima muestra el boton de adelante -->
<!-- if actual page is not equal last page then I show the forward button-->
@if ($paginator->currentPage() != $paginator->lastPage())
<li>
<a href="{{ $paginator->url($paginator->currentPage()+1) }}" >
>
</a>
</li>
@endif
<!-- si la pagina actual es distinto a la ultima y hay mas de 5 hojas muestra el boton de ultima hoja -->
<!-- if actual page is not equal last page, and there is more than 5 pages then I show last page button -->
@if ($paginator->currentPage() != $paginator->lastPage() && $paginator->lastPage() >= 5)
<li>
<a href="{{ $paginator->url($paginator->lastPage()) }}" >
>>
</a>
</li>
@endif
</ul>
这是 Laravel 5、Bootstrap 4 且没有 Blade 语法的一个(对于找到它的人 infinitely harder to read)。
使用,而不是:
{!! $users->render() !!}
使用:
@include('partials/pagination', ['paginator' => $users])
其中 partials/pagination
是您的 blade 模板文件,其中粘贴了以下内容。
// Number of links to show. Odd numbers work better
$linkCount = 7;
$pageCount = $paginator->lastPage();
if ($pageCount > 1)
{
$currentPage = $paginator->currentPage();
$pagesEitherWay = floor($linkCount / 2);
$paginationHtml = '<ul class="pagination">';
// Previous item
$previousDisabled = $currentPage == 1 ? 'disabled' : '';
$paginationHtml .= '<li class="page-item '.$previousDisabled.'">
<a class="page-link" href="'.$paginator->url($currentPage - 1).'" aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>';
// Set the first and last pages
$startPage = ($currentPage - $pagesEitherWay) < 1 ? 1 : $currentPage - $pagesEitherWay;
$endPage = ($currentPage + $pagesEitherWay) > $pageCount ? $pageCount : ($currentPage + $pagesEitherWay);
// Alter if the start is too close to the end of the list
if ($startPage > $pageCount - $linkCount)
{
$startPage = ($pageCount - $linkCount) + 1;
$endPage = $pageCount;
}
// Alter if the end is too close to the start of the list
if ($endPage <= $linkCount)
{
$startPage = 1;
$endPage = $linkCount < $pageCount ? $linkCount : $pageCount;
}
// Loop through and collect
for ($i = $startPage; $i <= $endPage; $i++)
{
$disabledClass = $i == $currentPage ? 'disabled' : '';
$paginationHtml .= '<li class="page-item '.$disabledClass.'">
<a class="page-link" href="'.$paginator->url($i).'">'.$i.'</a>
</li>';
}
// Next item
$nextDisabled = $currentPage == $pageCount ? 'disabled' : '';
$paginationHtml .= '<li class="page-item '.$nextDisabled.'">
<a class="page-link" href="'.$paginator->url($currentPage + 1).'" aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>';
$paginationHtml .= '</ul>';
echo $paginationHtml;
}
多亏了 MantisD 的 post,对于 Bootstrap 4 这工作得很好。
<?php
$link_limit = 7; // maximum number of links (a little bit inaccurate, but will be ok for now)
?>
@if ($paginator->lastPage() > 1)
<div id="news_paginate" class="dataTables_paginate paging_simple_numbers">
<ul class="pagination">
<li id="news_previous" class="paginate_button page-item previous {{ ($paginator->currentPage() == 1) ? ' disabled' : '' }}">
<a class="page-link" tabindex="0" href="{{ $paginator->url(1) }}">Previous</a>
</li>
@for ($i = 1; $i <= $paginator->lastPage(); $i++)
<?php
$half_total_links = floor($link_limit / 2);
$from = $paginator->currentPage() - $half_total_links;
$to = $paginator->currentPage() + $half_total_links;
if ($paginator->currentPage() < $half_total_links) {
$to += $half_total_links - $paginator->currentPage();
}
if ($paginator->lastPage() - $paginator->currentPage() < $half_total_links) {
$from -= $half_total_links - ($paginator->lastPage() - $paginator->currentPage()) - 1;
}
?>
@if ($from < $i && $i < $to)
<li class="paginate_button page-item {{ ($paginator->currentPage() == $i) ? ' active' : '' }}">
<a class="page-link" href="{{ $paginator->url($i) }}">{{ $i }}</a>
</li>
@endif
@endfor
<li id="news_next" class="paginate_button page-item {{ ($paginator->currentPage() == $paginator->lastPage()) ? ' disabled' : '' }}">
@if($paginator->currentPage() == $paginator->lastPage())
<a class="page-link" tabindex="0" href="{{ $paginator->url($paginator->currentPage()) }}" >End</a>
@else
<a class="page-link" tabindex="0" href="{{ $paginator->url($paginator->currentPage()+1) }}" >Next</a>
@endif
</li>
</ul>
</div>
@endif
也许为时已晚,但我想分享我制作的另一个自定义分页模板,该模板创建了 first/next 和 last/previous 链接。当用户已经在 first/last 页面时,它还会隐藏链接。
(可选)还可以判断链接的间隔(当前页前后的链接数)
用法示例:
@include('pagination', ['paginator' => $users])
或
@include('pagination', ['paginator' => $users, 'interval' => 5])
这里是要点:https://gist.github.com/carloscarucce/33f6082d009c20f77499252b89c35dea
代码:
@if (isset($paginator) && $paginator->lastPage() > 1)
<ul class="pagination">
<?php
$interval = isset($interval) ? abs(intval($interval)) : 3 ;
$from = $paginator->currentPage() - $interval;
if($from < 1){
$from = 1;
}
$to = $paginator->currentPage() + $interval;
if($to > $paginator->lastPage()){
$to = $paginator->lastPage();
}
?>
<!-- first/previous -->
@if($paginator->currentPage() > 1)
<li>
<a href="{{ $paginator->url(1) }}" aria-label="First">
<span aria-hidden="true">«</span>
</a>
</li>
<li>
<a href="{{ $paginator->url($paginator->currentPage() - 1) }}" aria-label="Previous">
<span aria-hidden="true">‹</span>
</a>
</li>
@endif
<!-- links -->
@for($i = $from; $i <= $to; $i++)
<?php
$isCurrentPage = $paginator->currentPage() == $i;
?>
<li class="{{ $isCurrentPage ? 'active' : '' }}">
<a href="{{ !$isCurrentPage ? $paginator->url($i) : '#' }}">
{{ $i }}
</a>
</li>
@endfor
<!-- next/last -->
@if($paginator->currentPage() < $paginator->lastPage())
<li>
<a href="{{ $paginator->url($paginator->currentPage() + 1) }}" aria-label="Next">
<span aria-hidden="true">›</span>
</a>
</li>
<li>
<a href="{{ $paginator->url($paginator->lastpage()) }}" aria-label="Last">
<span aria-hidden="true">»</span>
</a>
</li>
@endif
</ul>
@endif
如果有人需要,Laravel 5 附带 Bootstrap 4 paginator。
首先创建一个新的服务提供者。
php artisan make:provider PaginationServiceProvider
在 register
方法中,将一个闭包传递给 Laravel 的分页器 class 并 returns 新的演示者。
<?php
namespace App\Providers;
use Illuminate\Pagination\BootstrapFourPresenter;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\ServiceProvider;
class PaginationServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
Paginator::presenter(function($paginator)
{
return new BootstrapFourPresenter($paginator);
});
}
}
在 config/app.php
中注册新提供商
'providers' => [
//....
App\Providers\PaginationServiceProvider::class,
]
找到了这个例子
除了@MantasD 的回答,我还想提供全面的自定义 Laravel 分页。假设使用 Laravel 5.2 和以下包含的视图:
@include('pagination.default', ['pager' => $users])
特点
- 显示上一个和下一个按钮并在不适用时禁用它们
- 仅当上一页和下一页不相同时才显示第一页和最后一页图标
- 生成相关链接例如:(10、100、500 ..等)而不是限制页面
- 使用辅助函数显示每页从 x 到 y 的结果。
default.blade.php
@if($pager->lastPage() != 1)
<ul class="pagination">
@unless($pager->currentPage() < 3)
<li class="paginate_button previous">
<a href="{{ $pager->url(1) }}" title="First Page"><i class="fa fa-angle-double-left"></i></a>
</li>
@endunless
<li class="paginate_button previous @unless($pager->previousPageUrl())disabled @endunless">
<a href="{{ $pager->previousPageUrl() }}"><i class="fa fa-angle-left"></i></a>
</li>
@while($pager->paging++ < $pager->lastPage())
@if (abs($pager->paging - $pager->currentPage()) >= 2)
{{-- Generate relative links (eg. +10,etc) --}}
@if(in_array(abs($pager->paging - $pager->currentPage()), array(10, 50, 100, 500, 1000))
and $pager->paging != 1 and $pager->paging != $pager->lastPage())
<li class="paginate_button @unless($pager->currentPage() != $pager->paging)active @endunless">
<a title="Results from {{ PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['start'] }} to {{ PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['end'] }} of {{ $pager->total() }}" href="{{ $pager->url($pager->paging) }}">
<!-- + {{ $pager->paging - $pager->currentPage() }} -->{{ $pager->paging }}
</a>
</li>
@endif
@else
<li class="paginate_button @unless($pager->currentPage() != $pager->paging)active @endunless">
<a title="Results from {{ PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['start'] }} to {{ PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['end'] }} of {{ $pager->total() }}" href="{{ $pager->url($pager->paging) }}">
{{ $pager->paging }}
</a>
</li>
@endif
@endwhile
<li class="paginate_button next @unless($pager->nextPageUrl())disabled @endunless">
<a href="{{ $pager->nextPageUrl() }}"><i class="fa fa-angle-right"></i></a>
</li>
@unless($pager->lastPage() - $pager->currentPage() < 2)
<li class="paginate_button next">
<a href="{{ $pager->url($pager->lastPage()) }}" title="Last Page"><i class="fa fa-angle-double-right"></i></a>
</li>
@endunless
</ul>
@endif
PaginationStartEnd 函数
if (!function_exists('PaginationStartEnd')) {
function PaginationStartEnd($currentPage, $perPage, $total)
{
$pageStart = number_format( $perPage * ($currentPage - 1));
$pageEnd = $pageStart + $perPage;
if ($pageEnd > $total)
$pageEnd = $total;
$pageStart++;
return array('start' => number_format($pageStart), 'end' => number_format($pageEnd));
}
}
您可以根据需要更多地使用和自定义它。
注意:$pager->paging 变量设置为 0,在控制器操作中声明
在 Laravel 5+
中 Bootstrap 4 分页的快速 JS 修复
只需将以下脚本放在您的页面中:
<script>
$('.pagination li').addClass('page-item');
$('.pagination li a').addClass('page-link');
$('.pagination span').addClass('page-link');
</script>
优点:节省服务器 CPU,无需在您的应用程序中进行调整。
Laravel 5.2 为此使用演示者。您可以创建自定义演示者或使用预定义的演示者。 Laravel 5.2 使用 BootstrapThreePrensenter
out-of-the-box,但使用 BootstrapFroutPresenter
或任何其他自定义演示者也很容易。
public function index()
{
return view('pages.guestbook',['entries'=>GuestbookEntry::paginate(25)]);
}
在您的 blade 模板中,您可以使用以下公式:
{!! $entries->render(new \Illuminate\Pagination\BootstrapFourPresenter($entries)) !!}
关于创建自定义演示者,我建议观看 Codecourse's video。
如果您想更改 url 中的页码而不是获取 /pageNo 之类的数据。前任:
/2。您可以使用 jquery 来更改 url 。我在 url.
的 get 方法中有一些数据
$(function () {
$('.pagination li a').each(function () {
var link = $(this).attr('href');
var pageText = $(this).text();
var activePage = parseInt($('.pagination li.active span').text());
if (pageText.trim() == "«") {
pageText = activePage - 1;
} else if (pageText.trim() == "»") {
pageText = activePage + 1;
}
link = link.replace('?', '/' + pageText + '?');
link = link.replace('&page=' + pageText, '');
$(this).attr('href', link);
console.log(link);
});
})
对于 Laravel 5.3(可能在其他 5.X 版本中)将自定义分页代码放入您的视图文件夹中。
resources/views/pagination/default.blade.php
@if ($paginator->hasPages())
<ul class="pagination">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="disabled"><span>«</span></li>
@else
<li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">«</a></li>
@endif
{{-- Pagination Elements --}}
@foreach ($elements as $element)
{{-- "Three Dots" Separator --}}
@if (is_string($element))
<li class="disabled"><span>{{ $element }}</span></li>
@endif
{{-- Array Of Links --}}
@if (is_array($element))
@foreach ($element as $page => $url)
@if ($page == $paginator->currentPage())
<li class="active"><span>{{ $page }}</span></li>
@else
<li><a href="{{ $url }}">{{ $page }}</a></li>
@endif
@endforeach
@endif
@endforeach
{{-- 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
然后从主视图文件调用这个分页视图文件为
{{ $posts->links('pagination.default') }}
根据需要更新 pagination/default.blade.php
它也适用于 8.x 版本。
如果你想美化一下你的分页,我用bootstrap的class,更简单易行
@if ($students->lastPage() > 1)
<ul class="pagination ml-auto">
<li class="{{ ($students->currentPage() == 1) ? ' disabled' : '' }} page-item">
<a class=" page-link " href="{{ $students->url(1) }}" aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
@for ($i = 1; $i <= $students->lastPage(); $i++)
<li class="{{ ($students->currentPage() == $i) ? ' active' : '' }} page-item">
<a class=" page-link " href="{{ $students->url($i) }}">{{ $i }}</a>
</li>
@endfor
<li class="{{ ($students->currentPage() == $students->lastPage()) ? ' disabled' : '' }} page-item">
<a href="{{ $students->url($students->currentPage()+1) }}" class="page-link" aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
@endif
在 5.5
中,links()
被替换为 render()
,这似乎工作类似。 [Official DOC]
替换
{{ $replies->links() }}
和
{{ $replies->render("pagination::default") }}
以下命令将在resources/views/vendor/pagination
中生成分页模板
artisan vendor:publish --tag=laravel-pagination
artisan vendor:publish
在任何视图文件(blade 文件)中,您可以使用这些模板,例如:
{{ $replies->render("pagination::default") }}
{{ $replies->render("pagination::bootstrap-4") }}
{{ $replies->render("pagination::simple-bootstrap-4") }}
{{ $replies->render("pagination::semantic-ui") }}
在Laravel 5.4
我找到的最简单的方法是使用 vendor:publish
命令将它们导出到您的 resources/views/vendor
目录
php artisan vendor:publish --tag=laravel-pagination
然后去 resources\views\vendor\pagination\default.blade.php
并在那里进行定制。
可以找到关于此的完整文档here
我将此代码与 k7 主题一起使用,并将此代码与它们的内置 class 一起使用。
您还可以根据需要将此代码与您的主题和 class 一起使用..
尝试这样做。
<section class="page-paging pt-0">
<div class="container">
<div class="row">
<div class="col-12">
<nav aria-label="Page navigation example">
@if ($view_post->lastPage() > 1)
<ul class="pager list-inline mb-0 text-center">
<li class="{{ ($view_post->currentPage() == 1) ? ' disabled' : '' }}p-1 list-inline-item float-sm-left">
<a class="active page-link brd-gray px-4 py-3 font-weight-bold" href="{{ $view_post->url(1) }}">
<i class="fa fa-angle-left pr-1"></i> Prev
</a>
</li>
@for ($i = 1; $i <= $view_post->lastPage(); $i++)
<li class=" p-1 list-inline-item d-none d-md-inline-block">
<a class="{{ ($view_post->currentPage() == $i) ? ' active' : '' }} page-link brd-gray px-4 py-3 font-weight-bold" href="{{ $view_post->url($i) }}">{{ $i }}
</a>
</li>
@endfor
<li class="{{ ($view_post->currentPage() == $view_post->lastPage()) ? ' disabled' : '' }} p-1 list-inline-item float-sm-right">
<a class="active page-link brd-gray px-4 py-3 font-weight-bold" href="{{ $view_post->url($view_post->currentPage()+1) }}"> Next
<i class="fa fa-angle-right pl-1"></i>
</a>
</li>
</ul>
@endif
</nav>
</div>
</div>
</div>
</section>
这是自定义 Laravel 分页的简单解决方案,包括服务器端和客户端代码。
假设使用 Laravel 5.2 和以下包含的视图:
@include('pagination.default', ['pager' => $data])
特征
- 显示上一个和下一个按钮并在不适用时将其禁用。
- 显示第一页和最后一页按钮。
- 示例:(上一个|第一个|...|10|11|12|13|14|15|16|17|18|...|最后一个|下一个)
default.blade.php
@if ($paginator->last_page > 1)
<ul class="pagination pg-blue">
<li class="page-item {{($paginator->current_page == 1)?'disabled':''}}">
<a class="page-link" tabindex="-1" href="{{ '/locate-vendor/'}}{{ substr($paginator->prev_page_url,7) }}">
Previous
</a>
</li>
<li class="page-item {{($paginator->current_page == 1)?'disabled':''}}">
<a class="page-link" tabindex="-1" href="{{ '/locate-vendor/1'}}">
First
</a>
</li>
@if ( $paginator->current_page > 5 )
<li class="page-item">
<a class="page-link" tabindex="-1">...</a>
</li>
@endif
@for ($i = 1; $i <= $paginator->last_page; $i++)
@if ( ($i > ($paginator->current_page - 5)) && ($i < ($paginator->current_page + 5)) )
<li class="page-item {{($paginator->current_page == $i)?'active':''}}">
<a class="page-link" href="{{'/locate-vendor/'}}{{$i}}">{{$i}}</a>
</li>
@endif
@endfor
@if ( $paginator->current_page < ($paginator->last_page - 4) )
<li class="page-item">
<a class="page-link" tabindex="-1">...</a>
</li>
@endif
<li class="page-item {{($paginator->current_page==$paginator->last_page)?'disabled':''}}">
<a class="page-link" href="{{'/locate-vendor/'}}{{$paginator->last_page}}">
Last
</a>
</li>
<li class="page-item {{($paginator->current_page==$paginator->last_page)?'disabled':''}}">
<a class="page-link" href="{{'/locate-vendor/'}}{{substr($paginator->next_page_url,7)}}">
Next
</a>
</li>
</ul>
@endif
服务器端控制器函数
public function getVendors (Request $request)
{
$inputs = $request->except('token');
$perPage = (isset($inputs['per_page']) && $inputs['per_page']>0)?$inputs['per_page']:$this->perPage;
$currentPage = (isset($inputs['page']) && $inputs['page']>0)?$inputs['page']:$this->page;
$slice_init = ($currentPage == 1)?0:(($currentPage*$perPage)-$perPage);
$totalVendors = DB::table('client_broker')
->whereIn('client_broker_type_id', [1, 2])
->where('status_id', '1')
->whereNotNull('client_broker_company_name')
->whereNotNull('client_broker_email')
->select('client_broker_id', 'client_broker_company_name','client_broker_email')
->distinct()
->count();
$vendors = DB::table('client_broker')
->whereIn('client_broker_type_id', [1, 2])
->where('status_id', '1')
->whereNotNull('client_broker_company_name')
->whereNotNull('client_broker_email')
->select('client_broker_id', 'client_broker_company_name','client_broker_email')
->distinct()
->skip($slice_init)
->take($perPage)
->get();
$vendors = new LengthAwarePaginator($vendors, $totalVendors, $perPage, $currentPage);
if ($totalVendors) {
$response = ['status' => 1, 'totalVendors' => $totalVendors, 'pageLimit'=>$perPage, 'data' => $vendors, 'Message' => 'Vendors Details Found.'];
} else {
$response = ['status' => 0, 'totalVendors' => 0, 'data' => [], 'pageLimit'=>'', 'Message' => 'Vendors Details not Found.'];
}
return response()->json($response, 200);
}
我正在使用 Laravel 5.8。任务是像 next http://some-url/page-N instead of http://some-url?page=N 这样进行分页。它不能通过编辑 /resources/views/vendor/pagination/blade-name-here.blade.php 模板来完成(它可以通过生成
php artisan vendor:publish --tag=laravel-pagination 命令)。这里我不得不扩展核心类。
我的模型使用了 DB 实例的 paginate 方法,如下所示:
$essays = DB::table($this->table)
->select('essays.*', 'categories.name', 'categories.id as category_id')
->join('categories', 'categories.id', '=', 'essays.category_id')
->where('category_id', $categoryId)
->where('is_published', $isPublished)
->orderBy('h1')
->paginate( // here I need to extend this method
$perPage,
'*',
'page',
$page
);
让我们开始吧。 paginate() 方法放在 \Illuminate\Database\Query\Builder 和 returns Illuminate\Pagination\LengthAwarePaginator[= 中67=] 对象。 LengthAwarePaginator 扩展了 Illuminate\Pagination\AbstractPaginator,它具有 public 函数 url($page) 方法,需要扩展:
/**
* Get the URL for a given page number.
*
* @param int $page
* @return string
*/
public function url($page)
{
if ($page <= 0) {
$page = 1;
}
// If we have any extra query string key / value pairs that need to be added
// onto the URL, we will put them in query string form and then attach it
// to the URL. This allows for extra information like sortings storage.
$parameters = [$this->pageName => $page];
if (count($this->query) > 0) {
$parameters = array_merge($this->query, $parameters);
}
// this part should be overwrited
return $this->path
. (Str::contains($this->path, '?') ? '&' : '?')
. Arr::query($parameters)
. $this->buildFragment();
}
分步指南(我从 this 不错的文章中获取的部分信息):
- 在 app 目录中创建 Extended 文件夹。
- 在 Extended 文件夹中创建 3 个文件 CustomConnection.php, CustomLengthAwarePaginator.php, CustomQueryBuilder.php:
2.1 CustomConnection.php 文件:
namespace App\Extended;
use \Illuminate\Database\MySqlConnection;
/**
* Class CustomConnection
* @package App\Extended
*/
class CustomConnection extends MySqlConnection {
/**
* Get a new query builder instance.
*
* @return \App\Extended\CustomQueryBuilder
*/
public function query() {
// Here core QueryBuilder is overwrited by CustomQueryBuilder
return new CustomQueryBuilder(
$this,
$this->getQueryGrammar(),
$this->getPostProcessor()
);
}
}
2.2 CustomLengthAwarePaginator.php 文件 - 此文件包含需要覆盖的主要信息部分:
namespace App\Extended;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
/**
* Class CustomLengthAwarePaginator
* @package App\Extended
*/
class CustomLengthAwarePaginator extends LengthAwarePaginator
{
/**
* Get the URL for a given page number.
* Overwrited parent class method
*
*
* @param int $page
* @return string
*/
public function url($page)
{
if ($page <= 0) {
$page = 1;
}
// here the MAIN overwrited part of code BEGIN
$parameters = [];
if (count($this->query) > 0) {
$parameters = array_merge($this->query, $parameters);
}
$path = $this->path . "/{$this->pageName}-$page";
// here the MAIN overwrited part of code END
if($parameters) {
$path .= (Str::contains($this->path, '?') ? '&' : '?') . Arr::query($parameters);
}
$path .= $this->buildFragment();
return $path;
}
}
2.3 CustomQueryBuilder.php 文件:
namespace App\Extended;
use Illuminate\Container\Container;
use \Illuminate\Database\Query\Builder;
/**
* Class CustomQueryBuilder
* @package App\Extended
*/
class CustomQueryBuilder extends Builder
{
/**
* Create a new length-aware paginator instance.
* Overwrite paginator's class, which will be used for pagination
*
* @param \Illuminate\Support\Collection $items
* @param int $total
* @param int $perPage
* @param int $currentPage
* @param array $options
* @return \Illuminate\Pagination\LengthAwarePaginator
*/
protected function paginator($items, $total, $perPage, $currentPage, $options)
{
// here changed
// CustomLengthAwarePaginator instead of LengthAwarePaginator
return Container::getInstance()->makeWith(CustomLengthAwarePaginator::class, compact(
'items', 'total', 'perPage', 'currentPage', 'options'
));
}
}
在/config/app.php需要更改数据库提供程序:
'providers' => [
// comment this line
// illuminate\Database\DatabaseServiceProvider::class,
// and add instead:
App\Providers\CustomDatabaseServiceProvider::class,
在您的控制器(或您从数据库接收分页数据的其他地方)中,您需要更改分页设置:
// here are paginated results
$essaysPaginated = $essaysModel->getEssaysByCategoryIdPaginated($id, config('custom.essaysPerPage'), $page);
// init your current page url (without pagination part)
// like http://your-site-url/your-current-page-url
$customUrl = "/my-current-url-here";
// set url part to paginated results before showing to avoid
// pagination like http://your-site-url/your-current-page-url/page-2/page-3 in pagination buttons
$essaysPaginated->withPath($customUrl);
在您的视图中添加分页链接 (/resources/views/your-controller/your-blade-file.blade.php),如下所示:
<nav>
{!!$essays->onEachSide(5)->links('vendor.pagination.bootstrap-4')!!}
</nav>
尽情享受吧! :) 您的自定义分页现在应该可以工作了
如果您想使用 next 和 prev 自定义分页 link。
你可以在 Paginator.php 看到
里面有一些方法
我正在使用 Laravel 7
<a href="{{ $paginator->previousPageUrl() }}" < </a>
<a href="{{ $paginator->nextPageUrl() }}" > </a>
要限制项目,在控制器中使用 paginate()
$paginator = Model::paginate(int);
Laravel 使用其他 api 中写入 Node.js
的数据进行自定义分页
控制器
class BlogController extends Controller
{
$perPage = 20;
$page=1;
if (isset($_GET["page"]))
$page = $_GET["page"];
//Third party api to get records, you can put directly your url , I made a Api class to call third party api
$records = Api::getBlogs($page, $perPage);
$blogs = $records['data'];
$totalRecords = $records['totalRecords'];
return view('blog.all',['blogs'=>$blogs,
'pagination' =>array('totalRecords'=>$totalRecords, 'perPage'=>$perPage)
]);
}
博客浏览量
@foreach($blogs as $blog)
{{$blog->title}}
@endforeach
@include('pagination.pagination', ['pagination'=>$pagination])
在视图“pagination”中创建一个新文件夹并在其中创建一个新文件“pagination.blade.php”,放置此内容
<?php
$page=1;
if (isset($_GET["page"]))
$page = $_GET["page"];
$totalPages = ceil($pagination['totalRecords'] / $pagination['perPage']);
$count = 3;
$startPage = max(1, $page - $count);
$endPage = min( $totalPages, $page + $count);
$prev = $page - 1;
$next = $page + 1;
?>
<nav class="posts-navigation" aria-label="posts">
<ul class="pagination">
<li class="<?php if($page <= 1){ echo 'disabled'; } ?>">
<a href="<?php if($page <= 1){ echo '#'; } else { echo "?page=" . $prev; } ?>" aria-label="Previous" >
<i class="fas fa-angle-left"></i>
</a>
</li>
<?php for($i = $startPage; $i <= $endPage; $i++ ): ?>
<li class="<?php if($page == $i) {echo 'active'; } ?>"><a href="?page=<?= $i; ?>"><?= $i; ?></a></li>
<?php endfor; ?>
<li class="<?php if($page >= $totalPages) { echo 'disabled'; } ?>">
<a href="<?php if($page >= $totalPages){ echo '#'; } else {echo "?page=". $next; } ?>" aria-label="Next">
<i class="fas fa-angle-right"></i>
</a>
</li>
</ul>
</nav>
Laravel 8 自定义分页
我是 Laravel 的新手,除了其他自定义解决方案外,我尝试复制 phpadmin 风格的分页
具有以下特点
- 显示上一个和下一个按钮并在不显示时禁用它们
适用。
- 显示第一页和最后一页按钮并在不显示时禁用它们
适用。
- 页面显示为带有当前选择的可选分页列表。
先运行以下命令发布Laravel分页
php artisan vendor:publish --tag=laravel-pagination
这将在 views/vendor/pagination 中生成文件夹
比
- 转到“resources\views\vendor\pagination\default.blade.php”或
- 在文件夹“views/vendor/pagination”中创建一个新的模板文件“mypagination-selectable.blade.php”
并在那里进行定制。
只要确保你的 AppServiceProvider 中有这个。
use Illuminate\Pagination\Paginator;
public function boot()
{
Paginator::useBootstrap();
}
一切顺利。
默认使用以下代码。blade.php或mypagination-selectable。blade.php
<ul class="pagination pagination mb-0">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.first')">
<span class="page-link" aria-hidden="true">1 «</span>
</li>
<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->Url(1) }}" rel="first"
aria-label="@lang('pagination.previous')">1 «</a>
</li>
<li class="page-item">
<a class="page-link" href="{{ $paginator->previousPageUrl() }} " rel="prev"
aria-label="@lang('pagination.previous')">‹</a>
</li>
@endif
{{-- Link of Pages with dropdown including Previous and Next --}}
{{-- This easily fit in 3-columns --}}
<div class="d-flex justify-content-center mx-1 " style="font-size:small;">
<form action="#" method="get" class="d-flex input-group-sm ">
@csrf
<select name={{ $paginator->getPageName() }} id={{ $paginator->getPageName() }} onchange="return pagesubmit($(this).val())">
@foreach (range(1, $paginator->lastPage()) as $i)
<option value={{ $paginator->url($i) }} @if($paginator->currentPage() == $i) selected @endif >{{ $i }} </option>
@endforeach
</select>
</form>
</div>
{{-- 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>
<li class="page-item">
<a class="page-link" href="{{ $paginator->Url($paginator->lastPage()) }}" rel="last"
aria-label="@lang('pagination.next')">» {{ $paginator->lastPage() }}</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>
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.last')">
<a class="page-link" href="{{ $paginator->Url($paginator->lastPage()) }}" rel="last"
aria-label="@lang('pagination.next')">» {{ $paginator->lastPage() }}</a>
</li>
@endif
</ul>
在你的控制器中
public function index(Request $request)
{
$units_perpage = 10;//Per_Page setting
$current_pageno = request()->input('units_pageno',1);// setting Current page based on input
$sysunits = DB::table('sys_units')
->orderBY('unit_title')
->latest()
->paginate($perPage = $units_perpage, $columns = ['*'], $pageName = 'units_pageno');
}
...
return view('appunits_index',compact('sysunits'))
->with('i',($current_pageno - 1) * $units_perpage);
}
在你的 blade
{{--Application Pagination --}}
<div class="col-3 d-flex justify-content-end">
{!! $sysunits->appends(['sort' => 'unit_title'])
->links('pagination::mypagination-selectable') !!}
</div>
脚本为
<script>
//Called from Custom Pagination select blade
function pagesubmit($page_url) {
window.location = $page_url;
}
</script>
Laravel 4.2 可以选择在 app/config/view.php
中指定自定义视图,例如:
/*
|--------------------------------------------------------------------------
| Pagination View
|--------------------------------------------------------------------------
|
| This view will be used to render the pagination link output, and can
| be easily customized here to show any view you like. A clean view
| compatible with Twitter's Bootstrap is given to you by default.
|
*/
'pagination' => 'pagination_slider-alt'
这在 Laravel 5 至少关于 view.php
.
有没有办法在 Laravel 5 中复制这种行为?
在 Laravel 5 中,自定义分页基于演示者(classes)而不是视图。
假设您在路由代码中有
$users = Users::paginate(15);
在 L4 中,您曾经在视图中做过这样的事情:
$users->appends(['sort' => 'votes'])->links();
在 L5 中,您改为:
$users->appends(['sort' => 'votes'])->render();
render()
方法接受一个 Illuminate\Contracts\Pagination\Presenter
实例。您可以创建一个自定义 class 来实现该协定并将其传递给 render()
方法。请注意 Presenter
是一个 接口 ,而不是 class,因此你必须 实现 它,而不是 扩展它。这就是您收到错误的原因。
或者,您可以扩展 Laravel 分页器(以便使用其分页逻辑),然后将现有的分页实例 ($users->...
) 传递给扩展的 class 构造函数。这确实是我基于 Laravel 提供的 Bootstrap 演示器创建自定义 Zurb Foundation 演示器所做的。它使用所有 Laravel 分页逻辑,仅覆盖渲染方法。
对于我的自定义演示者,我的视图如下所示:
with(new \Stolz\Laravel\Pagination($users->appends(['sort' => 'votes'])))->render();
我的自定义分页展示器是:
<?php namespace Stolz\Laravel;
use Illuminate\Pagination\BootstrapThreePresenter;
class Pagination extends BootstrapThreePresenter
{
/**
* Convert the URL window into Zurb Foundation HTML.
*
* @return string
*/
public function render()
{
if( ! $this->hasPages())
return '';
return sprintf(
'<ul class="pagination" aria-label="Pagination">%s %s %s</ul></div>',
$this->getPreviousButton(),
$this->getLinks(),
$this->getNextButton()
);
}
/**
* Get HTML wrapper for disabled text.
*
* @param string $text
* @return string
*/
protected function getDisabledTextWrapper($text)
{
return '<li class="unavailable" aria-disabled="true"><a href="javascript:void(0)">'.$text.'</a></li>';
}
/**
* Get HTML wrapper for active text.
*
* @param string $text
* @return string
*/
protected function getActivePageWrapper($text)
{
return '<li class="current"><a href="javascript:void(0)">'.$text.'</a></li>';
}
/**
* Get a pagination "dot" element.
*
* @return string
*/
protected function getDots()
{
return $this->getDisabledTextWrapper('…');
}
}
而在 Laravel 4.2 中我会使用:
{{ $users->links('view.name') }}
在 Laravel 5 中,您可以使用以下内容复制上面的内容:
@include('view.name', ['object' => $users])
现在在包含的视图中,$object
将具有可用的分页方法,例如currentPage()
、lastPage()
、perPage()
等
在Laravel 5.3+中使用
$users->links('view.name')
在Laravel 5.0 - 5.2而不是
$users->render()
使用
@include('pagination.default', ['paginator' => $users])
views/pagination/default.blade.php
@if ($paginator->lastPage() > 1)
<ul class="pagination">
<li class="{{ ($paginator->currentPage() == 1) ? ' disabled' : '' }}">
<a href="{{ $paginator->url(1) }}">Previous</a>
</li>
@for ($i = 1; $i <= $paginator->lastPage(); $i++)
<li class="{{ ($paginator->currentPage() == $i) ? ' active' : '' }}">
<a href="{{ $paginator->url($i) }}">{{ $i }}</a>
</li>
@endfor
<li class="{{ ($paginator->currentPage() == $paginator->lastPage()) ? ' disabled' : '' }}">
<a href="{{ $paginator->url($paginator->currentPage()+1) }}" >Next</a>
</li>
</ul>
@endif
就是这样。
如果您有很多页面,请使用此模板:
views/pagination/limit_links.blade.php
<?php
// config
$link_limit = 7; // maximum number of links (a little bit inaccurate, but will be ok for now)
?>
@if ($paginator->lastPage() > 1)
<ul class="pagination">
<li class="{{ ($paginator->currentPage() == 1) ? ' disabled' : '' }}">
<a href="{{ $paginator->url(1) }}">First</a>
</li>
@for ($i = 1; $i <= $paginator->lastPage(); $i++)
<?php
$half_total_links = floor($link_limit / 2);
$from = $paginator->currentPage() - $half_total_links;
$to = $paginator->currentPage() + $half_total_links;
if ($paginator->currentPage() < $half_total_links) {
$to += $half_total_links - $paginator->currentPage();
}
if ($paginator->lastPage() - $paginator->currentPage() < $half_total_links) {
$from -= $half_total_links - ($paginator->lastPage() - $paginator->currentPage()) - 1;
}
?>
@if ($from < $i && $i < $to)
<li class="{{ ($paginator->currentPage() == $i) ? ' active' : '' }}">
<a href="{{ $paginator->url($i) }}">{{ $i }}</a>
</li>
@endif
@endfor
<li class="{{ ($paginator->currentPage() == $paginator->lastPage()) ? ' disabled' : '' }}">
<a href="{{ $paginator->url($paginator->lastPage()) }}">Last</a>
</li>
</ul>
@endif
你好,这是我的分页代码:在 blade 中使用 @include('pagination.default', ['paginator' => $users])
Views/pagination/default.blade.php
@if ($paginator->lastPage() > 1)
si la pagina actual es distinto a 1 y hay mas de 5 hojas muestro el boton de 1era hoja --> if actual page is not equals 1, and there is more than 5 pages then I show first page button --> @if ($paginator->currentPage() != 1 && $paginator->lastPage() >= 5) << @endif
<!-- si la pagina actual es distinto a 1 muestra el boton de atras -->
@if($paginator->currentPage() != 1)
<li>
<a href="{{ $paginator->url($paginator->currentPage()-1) }}" >
<
</a>
</li>
@endif
<!-- dibuja las hojas... Tomando un rango de 5 hojas, siempre que puede muestra 2 hojas hacia atras y 2 hacia adelante -->
<!-- I draw the pages... I show 2 pages back and 2 pages forward -->
@for($i = max($paginator->currentPage()-2, 1); $i <= min(max($paginator->currentPage()-2, 1)+4,$paginator->lastPage()); $i++)
<li class="{{ ($paginator->currentPage() == $i) ? ' active' : '' }}">
<a href="{{ $paginator->url($i) }}">{{ $i }}</a>
</li>
@endfor
<!-- si la pagina actual es distinto a la ultima muestra el boton de adelante -->
<!-- if actual page is not equal last page then I show the forward button-->
@if ($paginator->currentPage() != $paginator->lastPage())
<li>
<a href="{{ $paginator->url($paginator->currentPage()+1) }}" >
>
</a>
</li>
@endif
<!-- si la pagina actual es distinto a la ultima y hay mas de 5 hojas muestra el boton de ultima hoja -->
<!-- if actual page is not equal last page, and there is more than 5 pages then I show last page button -->
@if ($paginator->currentPage() != $paginator->lastPage() && $paginator->lastPage() >= 5)
<li>
<a href="{{ $paginator->url($paginator->lastPage()) }}" >
>>
</a>
</li>
@endif
</ul>
这是 Laravel 5、Bootstrap 4 且没有 Blade 语法的一个(对于找到它的人 infinitely harder to read)。
使用,而不是:
{!! $users->render() !!}
使用:
@include('partials/pagination', ['paginator' => $users])
其中 partials/pagination
是您的 blade 模板文件,其中粘贴了以下内容。
// Number of links to show. Odd numbers work better
$linkCount = 7;
$pageCount = $paginator->lastPage();
if ($pageCount > 1)
{
$currentPage = $paginator->currentPage();
$pagesEitherWay = floor($linkCount / 2);
$paginationHtml = '<ul class="pagination">';
// Previous item
$previousDisabled = $currentPage == 1 ? 'disabled' : '';
$paginationHtml .= '<li class="page-item '.$previousDisabled.'">
<a class="page-link" href="'.$paginator->url($currentPage - 1).'" aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>';
// Set the first and last pages
$startPage = ($currentPage - $pagesEitherWay) < 1 ? 1 : $currentPage - $pagesEitherWay;
$endPage = ($currentPage + $pagesEitherWay) > $pageCount ? $pageCount : ($currentPage + $pagesEitherWay);
// Alter if the start is too close to the end of the list
if ($startPage > $pageCount - $linkCount)
{
$startPage = ($pageCount - $linkCount) + 1;
$endPage = $pageCount;
}
// Alter if the end is too close to the start of the list
if ($endPage <= $linkCount)
{
$startPage = 1;
$endPage = $linkCount < $pageCount ? $linkCount : $pageCount;
}
// Loop through and collect
for ($i = $startPage; $i <= $endPage; $i++)
{
$disabledClass = $i == $currentPage ? 'disabled' : '';
$paginationHtml .= '<li class="page-item '.$disabledClass.'">
<a class="page-link" href="'.$paginator->url($i).'">'.$i.'</a>
</li>';
}
// Next item
$nextDisabled = $currentPage == $pageCount ? 'disabled' : '';
$paginationHtml .= '<li class="page-item '.$nextDisabled.'">
<a class="page-link" href="'.$paginator->url($currentPage + 1).'" aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>';
$paginationHtml .= '</ul>';
echo $paginationHtml;
}
多亏了 MantisD 的 post,对于 Bootstrap 4 这工作得很好。
<?php
$link_limit = 7; // maximum number of links (a little bit inaccurate, but will be ok for now)
?>
@if ($paginator->lastPage() > 1)
<div id="news_paginate" class="dataTables_paginate paging_simple_numbers">
<ul class="pagination">
<li id="news_previous" class="paginate_button page-item previous {{ ($paginator->currentPage() == 1) ? ' disabled' : '' }}">
<a class="page-link" tabindex="0" href="{{ $paginator->url(1) }}">Previous</a>
</li>
@for ($i = 1; $i <= $paginator->lastPage(); $i++)
<?php
$half_total_links = floor($link_limit / 2);
$from = $paginator->currentPage() - $half_total_links;
$to = $paginator->currentPage() + $half_total_links;
if ($paginator->currentPage() < $half_total_links) {
$to += $half_total_links - $paginator->currentPage();
}
if ($paginator->lastPage() - $paginator->currentPage() < $half_total_links) {
$from -= $half_total_links - ($paginator->lastPage() - $paginator->currentPage()) - 1;
}
?>
@if ($from < $i && $i < $to)
<li class="paginate_button page-item {{ ($paginator->currentPage() == $i) ? ' active' : '' }}">
<a class="page-link" href="{{ $paginator->url($i) }}">{{ $i }}</a>
</li>
@endif
@endfor
<li id="news_next" class="paginate_button page-item {{ ($paginator->currentPage() == $paginator->lastPage()) ? ' disabled' : '' }}">
@if($paginator->currentPage() == $paginator->lastPage())
<a class="page-link" tabindex="0" href="{{ $paginator->url($paginator->currentPage()) }}" >End</a>
@else
<a class="page-link" tabindex="0" href="{{ $paginator->url($paginator->currentPage()+1) }}" >Next</a>
@endif
</li>
</ul>
</div>
@endif
也许为时已晚,但我想分享我制作的另一个自定义分页模板,该模板创建了 first/next 和 last/previous 链接。当用户已经在 first/last 页面时,它还会隐藏链接。
(可选)还可以判断链接的间隔(当前页前后的链接数)
用法示例:
@include('pagination', ['paginator' => $users])
或
@include('pagination', ['paginator' => $users, 'interval' => 5])
这里是要点:https://gist.github.com/carloscarucce/33f6082d009c20f77499252b89c35dea
代码:
@if (isset($paginator) && $paginator->lastPage() > 1)
<ul class="pagination">
<?php
$interval = isset($interval) ? abs(intval($interval)) : 3 ;
$from = $paginator->currentPage() - $interval;
if($from < 1){
$from = 1;
}
$to = $paginator->currentPage() + $interval;
if($to > $paginator->lastPage()){
$to = $paginator->lastPage();
}
?>
<!-- first/previous -->
@if($paginator->currentPage() > 1)
<li>
<a href="{{ $paginator->url(1) }}" aria-label="First">
<span aria-hidden="true">«</span>
</a>
</li>
<li>
<a href="{{ $paginator->url($paginator->currentPage() - 1) }}" aria-label="Previous">
<span aria-hidden="true">‹</span>
</a>
</li>
@endif
<!-- links -->
@for($i = $from; $i <= $to; $i++)
<?php
$isCurrentPage = $paginator->currentPage() == $i;
?>
<li class="{{ $isCurrentPage ? 'active' : '' }}">
<a href="{{ !$isCurrentPage ? $paginator->url($i) : '#' }}">
{{ $i }}
</a>
</li>
@endfor
<!-- next/last -->
@if($paginator->currentPage() < $paginator->lastPage())
<li>
<a href="{{ $paginator->url($paginator->currentPage() + 1) }}" aria-label="Next">
<span aria-hidden="true">›</span>
</a>
</li>
<li>
<a href="{{ $paginator->url($paginator->lastpage()) }}" aria-label="Last">
<span aria-hidden="true">»</span>
</a>
</li>
@endif
</ul>
@endif
Laravel 5 附带 Bootstrap 4 paginator。
首先创建一个新的服务提供者。
php artisan make:provider PaginationServiceProvider
在 register
方法中,将一个闭包传递给 Laravel 的分页器 class 并 returns 新的演示者。
<?php
namespace App\Providers;
use Illuminate\Pagination\BootstrapFourPresenter;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\ServiceProvider;
class PaginationServiceProvider extends ServiceProvider
{
/**
* Bootstrap the application services.
*
* @return void
*/
public function boot()
{
//
}
/**
* Register the application services.
*
* @return void
*/
public function register()
{
Paginator::presenter(function($paginator)
{
return new BootstrapFourPresenter($paginator);
});
}
}
在 config/app.php
'providers' => [
//....
App\Providers\PaginationServiceProvider::class,
]
找到了这个例子
除了@MantasD 的回答,我还想提供全面的自定义 Laravel 分页。假设使用 Laravel 5.2 和以下包含的视图:
@include('pagination.default', ['pager' => $users])
特点
- 显示上一个和下一个按钮并在不适用时禁用它们
- 仅当上一页和下一页不相同时才显示第一页和最后一页图标
- 生成相关链接例如:(10、100、500 ..等)而不是限制页面
- 使用辅助函数显示每页从 x 到 y 的结果。
default.blade.php
@if($pager->lastPage() != 1)
<ul class="pagination">
@unless($pager->currentPage() < 3)
<li class="paginate_button previous">
<a href="{{ $pager->url(1) }}" title="First Page"><i class="fa fa-angle-double-left"></i></a>
</li>
@endunless
<li class="paginate_button previous @unless($pager->previousPageUrl())disabled @endunless">
<a href="{{ $pager->previousPageUrl() }}"><i class="fa fa-angle-left"></i></a>
</li>
@while($pager->paging++ < $pager->lastPage())
@if (abs($pager->paging - $pager->currentPage()) >= 2)
{{-- Generate relative links (eg. +10,etc) --}}
@if(in_array(abs($pager->paging - $pager->currentPage()), array(10, 50, 100, 500, 1000))
and $pager->paging != 1 and $pager->paging != $pager->lastPage())
<li class="paginate_button @unless($pager->currentPage() != $pager->paging)active @endunless">
<a title="Results from {{ PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['start'] }} to {{ PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['end'] }} of {{ $pager->total() }}" href="{{ $pager->url($pager->paging) }}">
<!-- + {{ $pager->paging - $pager->currentPage() }} -->{{ $pager->paging }}
</a>
</li>
@endif
@else
<li class="paginate_button @unless($pager->currentPage() != $pager->paging)active @endunless">
<a title="Results from {{ PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['start'] }} to {{ PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['end'] }} of {{ $pager->total() }}" href="{{ $pager->url($pager->paging) }}">
{{ $pager->paging }}
</a>
</li>
@endif
@endwhile
<li class="paginate_button next @unless($pager->nextPageUrl())disabled @endunless">
<a href="{{ $pager->nextPageUrl() }}"><i class="fa fa-angle-right"></i></a>
</li>
@unless($pager->lastPage() - $pager->currentPage() < 2)
<li class="paginate_button next">
<a href="{{ $pager->url($pager->lastPage()) }}" title="Last Page"><i class="fa fa-angle-double-right"></i></a>
</li>
@endunless
</ul>
@endif
PaginationStartEnd 函数
if (!function_exists('PaginationStartEnd')) {
function PaginationStartEnd($currentPage, $perPage, $total)
{
$pageStart = number_format( $perPage * ($currentPage - 1));
$pageEnd = $pageStart + $perPage;
if ($pageEnd > $total)
$pageEnd = $total;
$pageStart++;
return array('start' => number_format($pageStart), 'end' => number_format($pageEnd));
}
}
您可以根据需要更多地使用和自定义它。
注意:$pager->paging 变量设置为 0,在控制器操作中声明
在 Laravel 5+
中 Bootstrap 4 分页的快速 JS 修复只需将以下脚本放在您的页面中:
<script>
$('.pagination li').addClass('page-item');
$('.pagination li a').addClass('page-link');
$('.pagination span').addClass('page-link');
</script>
优点:节省服务器 CPU,无需在您的应用程序中进行调整。
Laravel 5.2 为此使用演示者。您可以创建自定义演示者或使用预定义的演示者。 Laravel 5.2 使用 BootstrapThreePrensenter
out-of-the-box,但使用 BootstrapFroutPresenter
或任何其他自定义演示者也很容易。
public function index()
{
return view('pages.guestbook',['entries'=>GuestbookEntry::paginate(25)]);
}
在您的 blade 模板中,您可以使用以下公式:
{!! $entries->render(new \Illuminate\Pagination\BootstrapFourPresenter($entries)) !!}
关于创建自定义演示者,我建议观看 Codecourse's video。
如果您想更改 url 中的页码而不是获取 /pageNo 之类的数据。前任: /2。您可以使用 jquery 来更改 url 。我在 url.
的 get 方法中有一些数据$(function () {
$('.pagination li a').each(function () {
var link = $(this).attr('href');
var pageText = $(this).text();
var activePage = parseInt($('.pagination li.active span').text());
if (pageText.trim() == "«") {
pageText = activePage - 1;
} else if (pageText.trim() == "»") {
pageText = activePage + 1;
}
link = link.replace('?', '/' + pageText + '?');
link = link.replace('&page=' + pageText, '');
$(this).attr('href', link);
console.log(link);
});
})
对于 Laravel 5.3(可能在其他 5.X 版本中)将自定义分页代码放入您的视图文件夹中。
resources/views/pagination/default.blade.php
@if ($paginator->hasPages())
<ul class="pagination">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="disabled"><span>«</span></li>
@else
<li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">«</a></li>
@endif
{{-- Pagination Elements --}}
@foreach ($elements as $element)
{{-- "Three Dots" Separator --}}
@if (is_string($element))
<li class="disabled"><span>{{ $element }}</span></li>
@endif
{{-- Array Of Links --}}
@if (is_array($element))
@foreach ($element as $page => $url)
@if ($page == $paginator->currentPage())
<li class="active"><span>{{ $page }}</span></li>
@else
<li><a href="{{ $url }}">{{ $page }}</a></li>
@endif
@endforeach
@endif
@endforeach
{{-- 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
然后从主视图文件调用这个分页视图文件为
{{ $posts->links('pagination.default') }}
根据需要更新 pagination/default.blade.php
它也适用于 8.x 版本。
如果你想美化一下你的分页,我用bootstrap的class,更简单易行
@if ($students->lastPage() > 1)
<ul class="pagination ml-auto">
<li class="{{ ($students->currentPage() == 1) ? ' disabled' : '' }} page-item">
<a class=" page-link " href="{{ $students->url(1) }}" aria-label="Previous">
<span aria-hidden="true">«</span>
<span class="sr-only">Previous</span>
</a>
</li>
@for ($i = 1; $i <= $students->lastPage(); $i++)
<li class="{{ ($students->currentPage() == $i) ? ' active' : '' }} page-item">
<a class=" page-link " href="{{ $students->url($i) }}">{{ $i }}</a>
</li>
@endfor
<li class="{{ ($students->currentPage() == $students->lastPage()) ? ' disabled' : '' }} page-item">
<a href="{{ $students->url($students->currentPage()+1) }}" class="page-link" aria-label="Next">
<span aria-hidden="true">»</span>
<span class="sr-only">Next</span>
</a>
</li>
</ul>
@endif
在 5.5
中,links()
被替换为 render()
,这似乎工作类似。 [Official DOC]
替换
{{ $replies->links() }}
和
{{ $replies->render("pagination::default") }}
以下命令将在resources/views/vendor/pagination
artisan vendor:publish --tag=laravel-pagination
artisan vendor:publish
在任何视图文件(blade 文件)中,您可以使用这些模板,例如:
{{ $replies->render("pagination::default") }}
{{ $replies->render("pagination::bootstrap-4") }}
{{ $replies->render("pagination::simple-bootstrap-4") }}
{{ $replies->render("pagination::semantic-ui") }}
在Laravel 5.4
我找到的最简单的方法是使用 vendor:publish
命令将它们导出到您的 resources/views/vendor
目录
php artisan vendor:publish --tag=laravel-pagination
然后去 resources\views\vendor\pagination\default.blade.php
并在那里进行定制。
可以找到关于此的完整文档here
我将此代码与 k7 主题一起使用,并将此代码与它们的内置 class 一起使用。 您还可以根据需要将此代码与您的主题和 class 一起使用..
尝试这样做。
<section class="page-paging pt-0">
<div class="container">
<div class="row">
<div class="col-12">
<nav aria-label="Page navigation example">
@if ($view_post->lastPage() > 1)
<ul class="pager list-inline mb-0 text-center">
<li class="{{ ($view_post->currentPage() == 1) ? ' disabled' : '' }}p-1 list-inline-item float-sm-left">
<a class="active page-link brd-gray px-4 py-3 font-weight-bold" href="{{ $view_post->url(1) }}">
<i class="fa fa-angle-left pr-1"></i> Prev
</a>
</li>
@for ($i = 1; $i <= $view_post->lastPage(); $i++)
<li class=" p-1 list-inline-item d-none d-md-inline-block">
<a class="{{ ($view_post->currentPage() == $i) ? ' active' : '' }} page-link brd-gray px-4 py-3 font-weight-bold" href="{{ $view_post->url($i) }}">{{ $i }}
</a>
</li>
@endfor
<li class="{{ ($view_post->currentPage() == $view_post->lastPage()) ? ' disabled' : '' }} p-1 list-inline-item float-sm-right">
<a class="active page-link brd-gray px-4 py-3 font-weight-bold" href="{{ $view_post->url($view_post->currentPage()+1) }}"> Next
<i class="fa fa-angle-right pl-1"></i>
</a>
</li>
</ul>
@endif
</nav>
</div>
</div>
</div>
</section>
这是自定义 Laravel 分页的简单解决方案,包括服务器端和客户端代码。
假设使用 Laravel 5.2 和以下包含的视图:
@include('pagination.default', ['pager' => $data])
特征
- 显示上一个和下一个按钮并在不适用时将其禁用。
- 显示第一页和最后一页按钮。
- 示例:(上一个|第一个|...|10|11|12|13|14|15|16|17|18|...|最后一个|下一个)
default.blade.php
@if ($paginator->last_page > 1)
<ul class="pagination pg-blue">
<li class="page-item {{($paginator->current_page == 1)?'disabled':''}}">
<a class="page-link" tabindex="-1" href="{{ '/locate-vendor/'}}{{ substr($paginator->prev_page_url,7) }}">
Previous
</a>
</li>
<li class="page-item {{($paginator->current_page == 1)?'disabled':''}}">
<a class="page-link" tabindex="-1" href="{{ '/locate-vendor/1'}}">
First
</a>
</li>
@if ( $paginator->current_page > 5 )
<li class="page-item">
<a class="page-link" tabindex="-1">...</a>
</li>
@endif
@for ($i = 1; $i <= $paginator->last_page; $i++)
@if ( ($i > ($paginator->current_page - 5)) && ($i < ($paginator->current_page + 5)) )
<li class="page-item {{($paginator->current_page == $i)?'active':''}}">
<a class="page-link" href="{{'/locate-vendor/'}}{{$i}}">{{$i}}</a>
</li>
@endif
@endfor
@if ( $paginator->current_page < ($paginator->last_page - 4) )
<li class="page-item">
<a class="page-link" tabindex="-1">...</a>
</li>
@endif
<li class="page-item {{($paginator->current_page==$paginator->last_page)?'disabled':''}}">
<a class="page-link" href="{{'/locate-vendor/'}}{{$paginator->last_page}}">
Last
</a>
</li>
<li class="page-item {{($paginator->current_page==$paginator->last_page)?'disabled':''}}">
<a class="page-link" href="{{'/locate-vendor/'}}{{substr($paginator->next_page_url,7)}}">
Next
</a>
</li>
</ul>
@endif
服务器端控制器函数
public function getVendors (Request $request)
{
$inputs = $request->except('token');
$perPage = (isset($inputs['per_page']) && $inputs['per_page']>0)?$inputs['per_page']:$this->perPage;
$currentPage = (isset($inputs['page']) && $inputs['page']>0)?$inputs['page']:$this->page;
$slice_init = ($currentPage == 1)?0:(($currentPage*$perPage)-$perPage);
$totalVendors = DB::table('client_broker')
->whereIn('client_broker_type_id', [1, 2])
->where('status_id', '1')
->whereNotNull('client_broker_company_name')
->whereNotNull('client_broker_email')
->select('client_broker_id', 'client_broker_company_name','client_broker_email')
->distinct()
->count();
$vendors = DB::table('client_broker')
->whereIn('client_broker_type_id', [1, 2])
->where('status_id', '1')
->whereNotNull('client_broker_company_name')
->whereNotNull('client_broker_email')
->select('client_broker_id', 'client_broker_company_name','client_broker_email')
->distinct()
->skip($slice_init)
->take($perPage)
->get();
$vendors = new LengthAwarePaginator($vendors, $totalVendors, $perPage, $currentPage);
if ($totalVendors) {
$response = ['status' => 1, 'totalVendors' => $totalVendors, 'pageLimit'=>$perPage, 'data' => $vendors, 'Message' => 'Vendors Details Found.'];
} else {
$response = ['status' => 0, 'totalVendors' => 0, 'data' => [], 'pageLimit'=>'', 'Message' => 'Vendors Details not Found.'];
}
return response()->json($response, 200);
}
我正在使用 Laravel 5.8。任务是像 next http://some-url/page-N instead of http://some-url?page=N 这样进行分页。它不能通过编辑 /resources/views/vendor/pagination/blade-name-here.blade.php 模板来完成(它可以通过生成 php artisan vendor:publish --tag=laravel-pagination 命令)。这里我不得不扩展核心类。
我的模型使用了 DB 实例的 paginate 方法,如下所示:
$essays = DB::table($this->table)
->select('essays.*', 'categories.name', 'categories.id as category_id')
->join('categories', 'categories.id', '=', 'essays.category_id')
->where('category_id', $categoryId)
->where('is_published', $isPublished)
->orderBy('h1')
->paginate( // here I need to extend this method
$perPage,
'*',
'page',
$page
);
让我们开始吧。 paginate() 方法放在 \Illuminate\Database\Query\Builder 和 returns Illuminate\Pagination\LengthAwarePaginator[= 中67=] 对象。 LengthAwarePaginator 扩展了 Illuminate\Pagination\AbstractPaginator,它具有 public 函数 url($page) 方法,需要扩展:
/**
* Get the URL for a given page number.
*
* @param int $page
* @return string
*/
public function url($page)
{
if ($page <= 0) {
$page = 1;
}
// If we have any extra query string key / value pairs that need to be added
// onto the URL, we will put them in query string form and then attach it
// to the URL. This allows for extra information like sortings storage.
$parameters = [$this->pageName => $page];
if (count($this->query) > 0) {
$parameters = array_merge($this->query, $parameters);
}
// this part should be overwrited
return $this->path
. (Str::contains($this->path, '?') ? '&' : '?')
. Arr::query($parameters)
. $this->buildFragment();
}
分步指南(我从 this 不错的文章中获取的部分信息):
- 在 app 目录中创建 Extended 文件夹。
- 在 Extended 文件夹中创建 3 个文件 CustomConnection.php, CustomLengthAwarePaginator.php, CustomQueryBuilder.php:
2.1 CustomConnection.php 文件:
namespace App\Extended;
use \Illuminate\Database\MySqlConnection;
/**
* Class CustomConnection
* @package App\Extended
*/
class CustomConnection extends MySqlConnection {
/**
* Get a new query builder instance.
*
* @return \App\Extended\CustomQueryBuilder
*/
public function query() {
// Here core QueryBuilder is overwrited by CustomQueryBuilder
return new CustomQueryBuilder(
$this,
$this->getQueryGrammar(),
$this->getPostProcessor()
);
}
}
2.2 CustomLengthAwarePaginator.php 文件 - 此文件包含需要覆盖的主要信息部分:
namespace App\Extended;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
/**
* Class CustomLengthAwarePaginator
* @package App\Extended
*/
class CustomLengthAwarePaginator extends LengthAwarePaginator
{
/**
* Get the URL for a given page number.
* Overwrited parent class method
*
*
* @param int $page
* @return string
*/
public function url($page)
{
if ($page <= 0) {
$page = 1;
}
// here the MAIN overwrited part of code BEGIN
$parameters = [];
if (count($this->query) > 0) {
$parameters = array_merge($this->query, $parameters);
}
$path = $this->path . "/{$this->pageName}-$page";
// here the MAIN overwrited part of code END
if($parameters) {
$path .= (Str::contains($this->path, '?') ? '&' : '?') . Arr::query($parameters);
}
$path .= $this->buildFragment();
return $path;
}
}
2.3 CustomQueryBuilder.php 文件:
namespace App\Extended;
use Illuminate\Container\Container;
use \Illuminate\Database\Query\Builder;
/**
* Class CustomQueryBuilder
* @package App\Extended
*/
class CustomQueryBuilder extends Builder
{
/**
* Create a new length-aware paginator instance.
* Overwrite paginator's class, which will be used for pagination
*
* @param \Illuminate\Support\Collection $items
* @param int $total
* @param int $perPage
* @param int $currentPage
* @param array $options
* @return \Illuminate\Pagination\LengthAwarePaginator
*/
protected function paginator($items, $total, $perPage, $currentPage, $options)
{
// here changed
// CustomLengthAwarePaginator instead of LengthAwarePaginator
return Container::getInstance()->makeWith(CustomLengthAwarePaginator::class, compact(
'items', 'total', 'perPage', 'currentPage', 'options'
));
}
}
在/config/app.php需要更改数据库提供程序:
'providers' => [ // comment this line // illuminate\Database\DatabaseServiceProvider::class, // and add instead: App\Providers\CustomDatabaseServiceProvider::class,
在您的控制器(或您从数据库接收分页数据的其他地方)中,您需要更改分页设置:
// here are paginated results $essaysPaginated = $essaysModel->getEssaysByCategoryIdPaginated($id, config('custom.essaysPerPage'), $page); // init your current page url (without pagination part) // like http://your-site-url/your-current-page-url $customUrl = "/my-current-url-here"; // set url part to paginated results before showing to avoid // pagination like http://your-site-url/your-current-page-url/page-2/page-3 in pagination buttons $essaysPaginated->withPath($customUrl);
在您的视图中添加分页链接 (/resources/views/your-controller/your-blade-file.blade.php),如下所示:
<nav> {!!$essays->onEachSide(5)->links('vendor.pagination.bootstrap-4')!!} </nav>
尽情享受吧! :) 您的自定义分页现在应该可以工作了
如果您想使用 next 和 prev 自定义分页 link。 你可以在 Paginator.php 看到 里面有一些方法 我正在使用 Laravel 7
<a href="{{ $paginator->previousPageUrl() }}" < </a>
<a href="{{ $paginator->nextPageUrl() }}" > </a>
要限制项目,在控制器中使用 paginate()
$paginator = Model::paginate(int);
Laravel 使用其他 api 中写入 Node.js
的数据进行自定义分页控制器
class BlogController extends Controller
{
$perPage = 20;
$page=1;
if (isset($_GET["page"]))
$page = $_GET["page"];
//Third party api to get records, you can put directly your url , I made a Api class to call third party api
$records = Api::getBlogs($page, $perPage);
$blogs = $records['data'];
$totalRecords = $records['totalRecords'];
return view('blog.all',['blogs'=>$blogs,
'pagination' =>array('totalRecords'=>$totalRecords, 'perPage'=>$perPage)
]);
}
博客浏览量
@foreach($blogs as $blog)
{{$blog->title}}
@endforeach
@include('pagination.pagination', ['pagination'=>$pagination])
在视图“pagination”中创建一个新文件夹并在其中创建一个新文件“pagination.blade.php”,放置此内容
<?php
$page=1;
if (isset($_GET["page"]))
$page = $_GET["page"];
$totalPages = ceil($pagination['totalRecords'] / $pagination['perPage']);
$count = 3;
$startPage = max(1, $page - $count);
$endPage = min( $totalPages, $page + $count);
$prev = $page - 1;
$next = $page + 1;
?>
<nav class="posts-navigation" aria-label="posts">
<ul class="pagination">
<li class="<?php if($page <= 1){ echo 'disabled'; } ?>">
<a href="<?php if($page <= 1){ echo '#'; } else { echo "?page=" . $prev; } ?>" aria-label="Previous" >
<i class="fas fa-angle-left"></i>
</a>
</li>
<?php for($i = $startPage; $i <= $endPage; $i++ ): ?>
<li class="<?php if($page == $i) {echo 'active'; } ?>"><a href="?page=<?= $i; ?>"><?= $i; ?></a></li>
<?php endfor; ?>
<li class="<?php if($page >= $totalPages) { echo 'disabled'; } ?>">
<a href="<?php if($page >= $totalPages){ echo '#'; } else {echo "?page=". $next; } ?>" aria-label="Next">
<i class="fas fa-angle-right"></i>
</a>
</li>
</ul>
</nav>
Laravel 8 自定义分页
我是 Laravel 的新手,除了其他自定义解决方案外,我尝试复制 phpadmin 风格的分页 具有以下特点
- 显示上一个和下一个按钮并在不显示时禁用它们 适用。
- 显示第一页和最后一页按钮并在不显示时禁用它们 适用。
- 页面显示为带有当前选择的可选分页列表。
先运行以下命令发布Laravel分页
php artisan vendor:publish --tag=laravel-pagination
这将在 views/vendor/pagination 中生成文件夹 比
- 转到“resources\views\vendor\pagination\default.blade.php”或
- 在文件夹“views/vendor/pagination”中创建一个新的模板文件“mypagination-selectable.blade.php” 并在那里进行定制。
只要确保你的 AppServiceProvider 中有这个。
use Illuminate\Pagination\Paginator;
public function boot()
{
Paginator::useBootstrap();
}
一切顺利。
默认使用以下代码。blade.php或mypagination-selectable。blade.php
<ul class="pagination pagination mb-0">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.first')">
<span class="page-link" aria-hidden="true">1 «</span>
</li>
<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->Url(1) }}" rel="first"
aria-label="@lang('pagination.previous')">1 «</a>
</li>
<li class="page-item">
<a class="page-link" href="{{ $paginator->previousPageUrl() }} " rel="prev"
aria-label="@lang('pagination.previous')">‹</a>
</li>
@endif
{{-- Link of Pages with dropdown including Previous and Next --}}
{{-- This easily fit in 3-columns --}}
<div class="d-flex justify-content-center mx-1 " style="font-size:small;">
<form action="#" method="get" class="d-flex input-group-sm ">
@csrf
<select name={{ $paginator->getPageName() }} id={{ $paginator->getPageName() }} onchange="return pagesubmit($(this).val())">
@foreach (range(1, $paginator->lastPage()) as $i)
<option value={{ $paginator->url($i) }} @if($paginator->currentPage() == $i) selected @endif >{{ $i }} </option>
@endforeach
</select>
</form>
</div>
{{-- 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>
<li class="page-item">
<a class="page-link" href="{{ $paginator->Url($paginator->lastPage()) }}" rel="last"
aria-label="@lang('pagination.next')">» {{ $paginator->lastPage() }}</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>
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.last')">
<a class="page-link" href="{{ $paginator->Url($paginator->lastPage()) }}" rel="last"
aria-label="@lang('pagination.next')">» {{ $paginator->lastPage() }}</a>
</li>
@endif
</ul>
在你的控制器中
public function index(Request $request)
{
$units_perpage = 10;//Per_Page setting
$current_pageno = request()->input('units_pageno',1);// setting Current page based on input
$sysunits = DB::table('sys_units')
->orderBY('unit_title')
->latest()
->paginate($perPage = $units_perpage, $columns = ['*'], $pageName = 'units_pageno');
}
...
return view('appunits_index',compact('sysunits'))
->with('i',($current_pageno - 1) * $units_perpage);
}
在你的 blade
{{--Application Pagination --}}
<div class="col-3 d-flex justify-content-end">
{!! $sysunits->appends(['sort' => 'unit_title'])
->links('pagination::mypagination-selectable') !!}
</div>
脚本为
<script>
//Called from Custom Pagination select blade
function pagesubmit($page_url) {
window.location = $page_url;
}
</script>