라라벨 - 페이지네이션 커스터마이제이션

안녕하세요, 야심 찬 개발자 여러분! 오늘 우리는 라라벨 페이지네이션 커스터마이제이션의 fascinante 세계로 접어들어 볼 거예요. 여러분의 친절한 이웃 컴퓨터 과학 교사로서, 저는 이 여정을 안내해 드리게 되어 기쁩니다. 프로그래밍에 새로운 분이라면 걱정 마세요 - 기본부터 차근차근 설명해 나갈 테니까요. 커피(또는 차, 당신이 좋아하는 것이 무엇이든)를 한 잔 손에 들고, 시작해 보세요!

Laravel - Pagination Customizations

페이지네이션이란?

커스터마이제이션에 뛰어들기 전에, 페이지네이션의 개념을 이해해 보겠습니다. 수백 페이지에 이르는 책을 한 번에 읽는 것은 너무 어렵겠죠? 여기서 페이지네이션이 등장합니다. 웹 개발에서 페이지네이션은 책을 관리 가능한 조각으로 나누어, 페이지마다 제한된 수의 항목을 표시하는 것입니다.

우리의 슈퍼 히어로 프레임워크인 라라벨은 내장된 페이지네이션 기능을 제공하여 우리의 삶을 더 쉽게 만들어 줍니다. 하지만 때로는 페이지네이션 결과에 우리의 독특한 풍격을 더하고 싶어질 때가 있습니다. 이때 커스터마이제이션이 유용하게 쓰입니다!

라라벨에서의 기본 페이지네이션

라라벨에서 페이지네이션을 어떻게 작동하는지 간단한 예제로 시작해 보겠습니다:

$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>&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는 페이지네이션에 깨끗하고 현대적인 모습을 줄 것입니다. 코드에 멋진 정장을 입히는 것과 같습니다!

고급 커스터마이제이션

프레젠터를 사용한 커스터마이제이션

보다 고급의 커스터마이제이션을 원하신다면, 라라벨은 커스터마이제이션 프레젠터를 만들 수 있습니다. 하나 만들어 보겠습니다:

  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. 컨트롤러에서 이 커스터마이제이션 프레젠터를 사용합니다:
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->render() !!}

결론

축하합니다! 지금 여러분은 라라벨의 페이지네이션 커스터마이제이션을 배웠습니다. 기본적인 수정에서 고급 프레젠터까지, 여러분은 페이지네이션 결과를 원하는 대로 보이게 만들 수 있는 힘을 가지게 되었습니다.

이 개념을 마스터하려면 연습이 중요합니다. 다양한 스타일을 만들어 보고, 프레젠터를 실험해 보세요. 그리고 가장 중요한 것은, 즐기세요! 페이지네이션은 작은 세부 사항일 수 있지만, 사용자 경험을 크게 향상시킬 수 있습니다.

이제 마무리하며, 우리가 다루었던 메서드를 요약한 표를 제공합니다:

메서드 설명
paginate() 기본 페이지네이션 메서드
vendor:publish 페이지네이션 뷰 배포
hasPages() 여러 페이지가 있는지 확인
onFirstPage() 첫 페이지인지 확인
previousPageUrl() 이전 페이지 URL 가져오기
nextPageUrl() 다음 페이지 URL 가져오기
currentPage() 현재 페이지 번호 가져오기
hasMorePages() 더 많은 페이지가 있는지 확인

계속 코딩하고, 계속 배우세요, 기억하시라 - 모든 위대한 개발자는 초보자로 시작했어요. 여러분도 라라벨 페이지네이션의 달인이 될 수 있습니다!

Credits: Image by storyset