라라벨 - 페이지네이션 커스터마이제이션
안녕하세요, 야심 찬 개발자 여러분! 오늘 우리는 라라벨 페이지네이션 커스터마이제이션의 fascinante 세계로 접어들어 볼 거예요. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 저는 이 여정을 안내해 드리게 되어 기쁩니다. 프로그래밍에 새로운 분이라면 걱정 마세요 - 기본부터 차근차근 설명해 나갈 테니까요. 커피(또는 차, 당신이 좋아하는 것이 무엇이든)를 한 잔 손에 들고, 시작해 보세요!
페이지네이션이란?
커스터마이제이션에 뛰어들기 전에, 페이지네이션의 개념을 이해해 보겠습니다. 수백 페이지에 이르는 책을 한 번에 읽는 것은 너무 어렵겠죠? 여기서 페이지네이션이 등장합니다. 웹 개발에서 페이지네이션은 책을 관리 가능한 조각으로 나누어, 페이지마다 제한된 수의 항목을 표시하는 것입니다.
우리의 슈퍼 히어로 프레임워크인 라라벨은 내장된 페이지네이션 기능을 제공하여 우리의 삶을 더 쉽게 만들어 줍니다. 하지만 때로는 페이지네이션 결과에 우리의 독특한 풍격을 더하고 싶어질 때가 있습니다. 이때 커스터마이제이션이 유용하게 쓰입니다!
라라벨에서의 기본 페이지네이션
라라벨에서 페이지네이션을 어떻게 작동하는지 간단한 예제로 시작해 보겠습니다:
$users = User::paginate(15);
이 코드는 데이터베이스에서 사용자를 가져와 페이지네이션을 적용하여, 페이지마다 15명의 사용자를 표시합니다. 마법 같지 않나요? 하지만 이 페이지네이션을 더 예쁘게 보이게 하고 싶다면? 이제 우리의 커스터마이제이션 여정이 시작됩니다!
페이지네이션 뷰 커스터마이제이션
단계 1: 페이지네이션 뷰 배포
먼저, 라라벨의 페이지네이션 뷰를 배포해야 합니다. 걱정 마세요, 이 작업은 간단합니다! 터미널에서 다음 명령어를 실행하세요:
php artisan vendor:publish --tag=laravel-pagination
이 명령어는 라라벨에게 " 페이지네이션 파일을 보여줘, 그래서 조금 고치고 싶어!"라고 말하는 것과 같습니다.
단계 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는 페이지네이션에 깨끗하고 현대적인 모습을 줄 것입니다. 코드에 멋진 정장을 입히는 것과 같습니다!
고급 커스터마이제이션
프레젠터를 사용한 커스터마이제이션
보다 고급의 커스터마이제이션을 원하신다면, 라라벨은 커스터마이제이션 프레젠터를 만들 수 있습니다. 하나 만들어 보겠습니다:
-
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>';
}
}
- 컨트롤러에서 이 커스터마이제이션 프레젠터를 사용합니다:
use App\Http\Presenters\CustomPaginationPresenter;
public function index()
{
$users = User::paginate(15);
$presenter = new CustomPaginationPresenter($users);
return view('users.index', compact('users', 'presenter'));
}
- 뷰에서 커스터마이제이션 프레젠터를 사용합니다:
{!! $presenter->render() !!}
결론
축하합니다! 지금 여러분은 라라벨의 페이지네이션 커스터마이제이션을 배웠습니다. 기본적인 수정에서 고급 프레젠터까지, 여러분은 페이지네이션 결과를 원하는 대로 보이게 만들 수 있는 힘을 가지게 되었습니다.
이 개념을 마스터하려면 연습이 중요합니다. 다양한 스타일을 만들어 보고, 프레젠터를 실험해 보세요. 그리고 가장 중요한 것은, 즐기세요! 페이지네이션은 작은 세부 사항일 수 있지만, 사용자 경험을 크게 향상시킬 수 있습니다.
이제 마무리하며, 우리가 다루었던 메서드를 요약한 표를 제공합니다:
메서드 | 설명 |
---|---|
paginate() |
기본 페이지네이션 메서드 |
vendor:publish |
페이지네이션 뷰 배포 |
hasPages() |
여러 페이지가 있는지 확인 |
onFirstPage() |
첫 페이지인지 확인 |
previousPageUrl() |
이전 페이지 URL 가져오기 |
nextPageUrl() |
다음 페이지 URL 가져오기 |
currentPage() |
현재 페이지 번호 가져오기 |
hasMorePages() |
더 많은 페이지가 있는지 확인 |
계속 코딩하고, 계속 배우세요, 기억하시라 - 모든 위대한 개발자는 초보자로 시작했어요. 여러분도 라라벨 페이지네이션의 달인이 될 수 있습니다!
Credits: Image by storyset