初心者向け。Laravel8系・10系でページネーションをカスタムする方法
2194 回閲覧されました
みなさんこんにちは、jonioです。
Laravelのページネーションですがデフォルトでは下記になっています。
「誰が使うんだろう?」って言う位酷いデザインですがこれを下記に変更する方法を説明します。
簡単に実装できるのでLaravel初心者の方でも問題なく実装できると思います。
この記事で知ることができること
ページネーションのカスタムです。
Laravelのバージョン
8系・10系で説明します。
10系は一部やり方が変わるのでその説明もします。
default.blade.phpを探す
default.blade.phpを編集します。
10系はデフォルトでは存在しないので先に説明します。
ターミナルで下記のコマンドを叩きます。
xxxxxx@MacBook-Pro legener % php artisan vendor:publish --tag=laravel-pagination
下記の表示になればコマンドは成功しています。
INFO Publishing [laravel-pagination] assets.
Copying directory [vendor/laravel/framework/src/Illuminate/Pagination/resources/views] to [resources/views/vendor/pagination] ............... DONE
3行目にも記載されていますが「Laravelのプロジェクト > resources > views > vendor > pagination」の直下に下記のファイルがあります。
- bootstrap-4.blade.php
- bootstrap-5.blade.php
- default.blade.php
- semantic-ui.blade.php
- simple-bootstrap-4.blade.php
- simple-bootstrap-5.blade.php
- simple-default.blade.php
- simple-tailwind.blade.php
この中にdefault.blade.phpがあるのを確認できます。
8系の場合は最初から入っていると思うのですが下記で検索すれば見つかります。
@if ($paginator->hasPages())
default.blade.phpを編集
default.blade.phpの中身は下記になっています。
@if ($paginator->hasPages())
<nav>
<ul class="pagination">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
<span aria-hidden="true">‹</span>
</li>
@else
<li>
<a href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">‹</a>
</li>
@endif
{{-- Pagination Elements --}}
@foreach ($elements as $element)
{{-- "Three Dots" Separator --}}
@if (is_string($element))
<li class="disabled" aria-disabled="true"><span>{{ $element }}</span></li>
@endif
{{-- Array Of Links --}}
@if (is_array($element))
@foreach ($element as $page => $url)
@if ($page == $paginator->currentPage())
<li class="active" aria-current="page"><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" aria-label="@lang('pagination.next')">›</a>
</li>
@else
<li class="disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
<span aria-hidden="true">›</span>
</li>
@endif
</ul>
</nav>
@endif
class(css)で見た目を作っているのでcssを編集する為にクラス名だけを変えた下記に丸ごと変えます。
@if ($paginator->hasPages())
<div class="paginationWrap">
<ul class="pagination" role="navigation">
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li aria-disabled="true" aria-label="@lang('pagination.previous')">
«
</li>
@else
<li>
<a href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">«</a>
</li>
@endif
{{-- Pagination Elements --}}
@foreach ($elements as $element)
{{-- "Three Dots" Separator --}}
@if (is_string($element))
<li aria-disabled="true">{{ $element }}</li>
@endif
{{-- Array Of Links --}}
@if (is_array($element))
@foreach ($element as $page => $url)
@if ($page == $paginator->currentPage())
<li aria-current="page"><a class="active" href="#">{{ $page }}</a></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" aria-label="@lang('pagination.next')">»</a>
</li>
@else
<li aria-disabled="true" aria-label="@lang('pagination.next')">
»
</li>
@endif
</ul>
</div>
@endif
scss
scssを↓にします。
.paginationWrap {
display: flex;
justify-content: center;
margin-top: 38px;
margin-bottom: 40px;
}
.paginationWrap ul.pagination {
display: inline-block;
padding: 0;
margin: 0;
}
.paginationWrap ul.pagination li {
display: inline;
margin-right: 4px;
}
.paginationWrap ul.pagination li a {
color: #2f3859;
padding: 8px 14px;
text-decoration: none;
}
.paginationWrap ul.pagination li a.active {
background-color: #4b90f6;
color: white;
border-radius: 40px;
width: 38px;
height: 38px;
}
.paginationWrap ul.pagination li a:hover:not(.active) {
background-color: #e1e7f0;
border-radius: 40px;
}
Laravel-mixを使ってscssを導入していますが導入方法が分からない方は↓を読んで下さい。
scssじゃなくてcssでやりたい方もいると思います。
その場合はChatGPTにscssのコードをcssに変換してもらって下さい。
ページネーションの導入
ページネーションを表示する時のコントローラーを一応掲載します。
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class ShopController extends Controller
{
public function index()
{
$stocks = Stock::Paginate(6); //←この行
return view('shop',compact('stocks'));
}
}
「::Paginate(6)」の6が1ページに表示する数です。
ページネーションを使うテンプレートのコードを下記にします。
{{ $stocks->links('pagination::default') }}
「’pagination::default’」があることでカスタムしたページネーションを使う事ができます。
これで完成です。
cssを変える事で簡単にページネーションの見た目を変える事ができるので他のデザインにしたかったらcssを変えて下さい。