Laravel - 分页自定义

你好,有抱负的开发者们!今天,我们将深入探讨Laravel分页自定义的精彩世界。作为你友好的计算机科学老师,我很兴奋能引导你完成这次旅程。如果你是编程新手,不用担心——我们将从基础知识开始,逐步深入。那么,拿起一杯咖啡(或者如果你喜欢,一杯茶),让我们开始吧!

Laravel - Pagination Customizations

什么是分页?

在我们跳入自定义之前,先来了解一下什么是分页。想象你有一本几百页的书。一次性读完整本书会让人不堪重负,对吧?这就是分页的作用。在网页开发中,分页就像把你的书分成可管理的部分,每页显示有限数量的项目。

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>&laquo;</span></li>
@else
<li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">&laquo;</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">&raquo;</a></li>
@else
<li class="disabled"><span>&raquo;</span></li>
@endif
</ul>
</nav>
@endif

这段代码可能一开始看起来令人畏惧,但让我们分解一下:

  1. 我们检查是否有多个页面($paginator->hasPages())。
  2. 我们创建一个导航和一个无序列表。
  3. 如果我们不在第一页,我们添加一个“上一页”链接。
  4. 我们循环遍历分页元素,为每个页面添加链接。
  5. 如果还有更多页面,我们添加一个“下一页”链接。

为你的分页添加样式

现在我们已经自定义了分页结构,让我们让它看起来更漂亮!在你的样式表中添加一些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。让我们创建一个:

  1. 创建一个新文件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>';
}
}
  1. 在你的控制器中使用这个自定义Presenter:
use App\Http\Presenters\CustomPaginationPresenter;

public function index()
{
$users = User::paginate(15);
$presenter = new CustomPaginationPresenter($users);

return view('users.index', compact('users', 'presenter'));
}
  1. 在你的视图中使用自定义Presenter:
{!! $presenter->render() !!}

结论

恭喜你!你刚刚学会了如何自定义Laravel的分页。从基本的修改到高级的Presenter,你现在有了让分页结果看起来完全符合你要求的能力。

记住,掌握这些概念的关键是练习。尝试创建不同的样式,尝试使用Presenter,最重要的是,享受这个过程!分页可能看起来是一个小细节,但它可以极大地提升你应用程序的用户体验。

在我们结束之前,这里有一个我们覆盖的方法的总结表:

方法 描述
paginate() 基本分页方法
vendor:publish 发布分页视图
hasPages() 检查是否有多个页面
onFirstPage() 检查是否在第一页
previousPageUrl() 获取上一页的URL
nextPageUrl() 获取下一页的URL
currentPage() 获取当前页码
hasMorePages() 检查是否有更多页面

继续编码,继续学习,记住——每个伟大的开发者都是从初学者开始的。你正在成为Laravel分页专家的路上!

Credits: Image by storyset