Laravel - 分页自定义
你好,有抱负的开发者们!今天,我们将深入探讨Laravel分页自定义的精彩世界。作为你友好的计算机科学老师,我很兴奋能引导你完成这次旅程。如果你是编程新手,不用担心——我们将从基础知识开始,逐步深入。那么,拿起一杯咖啡(或者如果你喜欢,一杯茶),让我们开始吧!
什么是分页?
在我们跳入自定义之前,先来了解一下什么是分页。想象你有一本几百页的书。一次性读完整本书会让人不堪重负,对吧?这就是分页的作用。在网页开发中,分页就像把你的书分成可管理的部分,每页显示有限数量的项目。
Laravel,我们强大的超级框架,自带了内置的分页功能,让我们的生活变得更简单。但有时,我们想要给这些分页结果添加自己的风格。这时,自定义就派上用场了!
Laravel中的基本分页
让我们从一个简单的例子开始,了解Laravel中分页是如何工作的:
$users = User::paginate(15);
这行代码从数据库中获取用户并进行分页,每页显示15个用户。这就像魔法一样,不是吗?但如果我们想让这个分页看起来更炫酷呢?这就是我们自定义之旅的开始!
自定义分页视图
步骤1:发布分页视图
首先,我们需要发布Laravel的分页视图。别担心,这比听起来简单!在终端中运行以下命令:
php artisan vendor:publish --tag=laravel-pagination
这个命令就像是告诉Laravel:“嘿,我想看看那些分页文件,这样我就可以调整它们了!”
步骤2:修改视图
现在,导航到resources/views/vendor/pagination
。在这里你会找到几个文件。让我们专注于default.blade.php
。这个文件控制着你的分页链接的外观。
下面是一个简单的自定义示例:
@if ($paginator->hasPages())
<nav>
<ul class="pagination">
{{-- 上一页链接 --}}
@if ($paginator->onFirstPage())
<li class="disabled"><span>«</span></li>
@else
<li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">«</a></li>
@endif
{{-- 分页元素 --}}
@foreach ($elements as $element)
{{-- "三点"分隔符 --}}
@if (is_string($element))
<li class="disabled"><span>{{ $element }}</span></li>
@endif
{{-- 链接数组 --}}
@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
{{-- 下一页链接 --}}
@if ($paginator->hasMorePages())
<li><a href="{{ $paginator->nextPageUrl() }}" rel="next">»</a></li>
@else
<li class="disabled"><span>»</span></li>
@endif
</ul>
</nav>
@endif
这段代码可能一开始看起来令人畏惧,但让我们分解一下:
- 我们检查是否有多个页面(
$paginator->hasPages()
)。 - 我们创建一个导航和一个无序列表。
- 如果我们不在第一页,我们添加一个“上一页”链接。
- 我们循环遍历分页元素,为每个页面添加链接。
- 如果还有更多页面,我们添加一个“下一页”链接。
为你的分页添加样式
现在我们已经自定义了分页结构,让我们让它看起来更漂亮!在你的样式表中添加一些CSS:
.pagination {
display: flex;
list-style: none;
padding: 0;
}
.pagination li {
margin: 0 5px;
}
.pagination li a {
text-decoration: none;
padding: 5px 10px;
border: 1px solid #ddd;
color: #333;
}
.pagination li.active span {
background-color: #007bff;
color: white;
padding: 5px 10px;
border: 1px solid #007bff;
}
.pagination li.disabled span {
color: #ccc;
padding: 5px 10px;
border: 1px solid #ddd;
}
这个CSS将给您的分页一个干净、现代的外观。就像给你的代码穿上一件漂亮的西装!
高级自定义
使用Presenter进行自定义分页
对于更高级的自定义,Laravel允许我们创建一个自定义Presenter。让我们创建一个:
- 创建一个新文件
app/Http/Presenters/CustomPaginationPresenter.php
:
<?php
namespace App\Http\Presenters;
use Illuminate\Pagination\BootstrapPresenter;
class CustomPaginationPresenter extends BootstrapPresenter
{
public function render()
{
if (!$this->hasPages()) {
return '';
}
return sprintf(
'<div class="custom-pagination">%s %s %s</div>',
$this->getPreviousButton(),
$this->getLinks(),
$this->getNextButton()
);
}
protected function getAvailablePageWrapper($url, $page, $rel = null)
{
$rel = is_null($rel) ? '' : ' rel="' . $rel . '"';
return '<span class="page-item"><a class="page-link" href="' . $url . '"' . $rel . '>' . $page . '</a></span>';
}
protected function getDisabledTextWrapper($text)
{
return '<span class="page-item disabled"><span class="page-link">' . $text . '</span></span>';
}
protected function getActivePageWrapper($text)
{
return '<span class="page-item active"><span class="page-link">' . $text . '</span></span>';
}
}
- 在你的控制器中使用这个自定义Presenter:
use App\Http\Presenters\CustomPaginationPresenter;
public function index()
{
$users = User::paginate(15);
$presenter = new CustomPaginationPresenter($users);
return view('users.index', compact('users', 'presenter'));
}
- 在你的视图中使用自定义Presenter:
{!! $presenter->render() !!}
结论
恭喜你!你刚刚学会了如何自定义Laravel的分页。从基本的修改到高级的Presenter,你现在有了让分页结果看起来完全符合你要求的能力。
记住,掌握这些概念的关键是练习。尝试创建不同的样式,尝试使用Presenter,最重要的是,享受这个过程!分页可能看起来是一个小细节,但它可以极大地提升你应用程序的用户体验。
在我们结束之前,这里有一个我们覆盖的方法的总结表:
方法 | 描述 |
---|---|
paginate() |
基本分页方法 |
vendor:publish |
发布分页视图 |
hasPages() |
检查是否有多个页面 |
onFirstPage() |
检查是否在第一页 |
previousPageUrl() |
获取上一页的URL |
nextPageUrl() |
获取下一页的URL |
currentPage() |
获取当前页码 |
hasMorePages() |
检查是否有更多页面 |
继续编码,继续学习,记住——每个伟大的开发者都是从初学者开始的。你正在成为Laravel分页专家的路上!
Credits: Image by storyset