Laravel4、ペギネーションリンクを取り替える
タグ: Laravel4
これは、Laravel Advent Calendar 2013 の6日目の記事です。
前日に引き続き、Laravelに巣食う悪の権化、悪魔博士改め、川瀬が担当します。
ペギネーションの表示形式は、手を加えなくても切り替えられます。Laravelが用意している3種類は、app/coinfig/view.phpの中の設定を変更し、切り替えます。
しかし、これらはCSSフレームワークのTwitter Bootstrapを利用しています。じゃあ、Bootstrap以外に切り替えられるのかと言えば、そのままでは無理で、多少工夫をしなくてはなりません。
今回、Foundationが新しいバージョンをリリースしたので、Foundation5に対応する実例をご覧ください。
ビューファイルの切り替え
Laravel4が用意しているビューファイルは、vendor/laravel/framework/src/Illuminate/Pagination/views/に存在しています。
もちろん、これらはFoundation5に対応していませんので、そのまま使えません。
通常のビューのように、app/viewsフォルダー下にビューを作成します。今回はapp/views/pagination/foundation5.phpファイルを作成します。
- <?php $presenter = new Foundation5Presenter( $paginator ); ?>
- <?php if( $paginator->getLastPage() > 1 ): ?>
- <ul class="pagination">
- <?php echo $presenter->render(); ?>
- </ul>
- <?php endif; ?>
ペギネーションのビューファイルは、似たような構成になります。最初にプレゼンタークラスのインスタンスを取得し、そのrenderメソッドを呼び出しています。
今回作成したのは、Foundation5Presenterクラスです。このクラスは本来PSR-0に基づきローディングさせたほうが良いと思いますが、指定の手間を省くため、modelsディレクトリー下に作成しましょう。app/models/Foundation5Presenter.phpです。
- <?php
- use Illuminate\Pagination\BootstrapPresenter;
- /**
- * Foundation 5 presenter
- *
- * Override methods include hard coded html tags.
- */
- class Foundation5Presenter extends BootstrapPresenter{
- /**
- * Create a range of pagination links.
- *
- * @param int $start
- * @param int $end
- * @return string
- */
- public function getPageRange($start, $end)
- {
- $pages = array();
- for ($page = $start; $page <= $end; $page++)
- {
- // If the current page is equal to the page we're iterating on, we will create a
- // disabled link for that page. Otherwise, we can create a typical active one
- // for the link. These views use the "Twitter Bootstrap" styles by default.
- if ($this->currentPage == $page)
- {
- $pages[] = '<li class="current"><span>'.$page.'</span></li>';
- }
- else
- {
- $pages[] = $this->getLink($page);
- }
- }
- return implode('', $pages);
- }
- /**
- * Get the previous page pagination element.
- *
- * @param string $text
- * @return string
- */
- public function getPrevious($text = '«')
- {
- // If the current page is less than or equal to one, it means we can't go any
- // further back in the pages, so we will render a disabled previous button
- // when that is the case. Otherwise, we will give it an active "status".
- if ($this->currentPage <= 1)
- {
- return '<li class="allow unavailable"><span>'.$text.'</span></li>';
- }
- else
- {
- $url = $this->paginator->getUrl($this->currentPage - 1);
- return '<li class="allow"><a href="'.$url.'">'.$text.'</a></li>';
- }
- }
- /**
- * Get the next page pagination element.
- *
- * @param string $text
- * @return string
- */
- public function getNext($text = '»')
- {
- // If the current page is greater than or equal to the last page, it means we
- // can't go any further into the pages, as we're already on this last page
- // that is available, so we will make it the "next" link style disabled.
- if ($this->currentPage >= $this->lastPage)
- {
- return '<li class="allow unavailable"><span>'.$text.'</span></li>';
- }
- else
- {
- $url = $this->paginator->getUrl($this->currentPage + 1);
- return '<li class="allow"><a href="'.$url.'">'.$text.'</a></li>';
- }
- }
- /**
- * Get a pagination "dot" element.
- *
- * @return string
- */
- public function getDots()
- {
- return '<li class="unavailable"><span>...</span></li>';
- }
- /**
- * Create a pagination slider link.
- *
- * @param mixed $page
- * @return string
- */
- public function getLink($page)
- {
- $url = $this->paginator->getUrl($page);
- return '<li><a href="'.$url.'">'.$page.'</a></li>';
- }
- }
Illuminate\Pagination\BootstrapPresenterを拡張していますが、実際、このクラス内にハードコードされている、HTMLのclass指定をFoundation5用に書き換えているだけです。
このプレゼンテーターにはインターフェイスが定義されていません。ですから、自由に自分の好きなように作成してもかまいません。要は、ペジネーション用のコードを生成できれば良いわけです。(ですから、自作する場合は、別段renderというメソッド名にこだわる必要もありません。)
これで準備が整いました。app/config/view.phpを変更し、最初に作成した'pagination.foundation5`をビューとして指定してください。Laravel4が提供しているビューを利用する場合は'pagination::...'と書きますが、自前のビューを利用する場合は、いつもビューを指定している通りに指定します。
これで、ペギネーションを利用すれば、Foundation5用に表示されます。(実際は、Bootstrapと大して違いが出ないのですけど。:D)
注意
多分、Foundation5はリリースされたばかりで、結構バグがあるようです。例えばcssにはペジネーションのactiveクラスの属性指定がないため、現在のページがデモのように表示されません。
対応されるまで、自分で指定する必要があります。
- ul.pagination li.current {
- background: none repeat scroll 0 0 #008CBA;
- color: #FFFFFF;
- cursor: default;
- font-weight: bold;
- padding: 0.05556rem 0.55556rem;
- border-radius: 3px;
- }
ペギネーションはとても難しい問題を含んでいます。それは、ペギネーションと書くとペジネーション派の人から揶揄され、ペジネーションと書くとペギネーション派の人からブーブー言われます。願わくば、こんなことで突っ込まれないように…(最初のぺは、あの英語の時間に習ったアとエの中間という音です。その後はじぇじぇじぇのジェですから、ペジェネイションかパジェネイションが正しいと、自分で突っ込んでおきましょう。ペァジェネイションかな?)
明日の担当も、私です。明後日はまだ誰も予約していません。この程度、これより簡単でも、使用感の感想でも良いので、書きたい方はどうぞ。