プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
FuelPHP1.6、Paginationクラスを理解する。
FuelPHPではPaginationクラスがあらかじめ用意されているらしい。
Paginationってのは「前 1 2 3 4 5 次」とかなっているページ移動の奴ね。

それを見て行きましょうってのが今回のテーマです。

まず基本的な使い方は……ふむふむ(--)

なんかforgeしないパターンとするパターンがあるみたいですね。

forgeしないパターンは例えばこんな感じφ(--)

■コントローラ
public function action_index()
{
    //データ総件数取得
    $cnt = DB::select()->from('tbl_test01')->execute()->count();

    //設定
    $config = array(
        'pagination_url' => 'hoge2/index',
        'uri_segment' => 3,
        'num_links' => 4,
        'per_page' => 2,
        'total_items' => $cnt,
        'name' => 'pagination',
        'show_first' => true,
        'show_last' => true,
    );
    Pagination::set_config($config);

    //データ取得
    $data = DB::select()->from('tbl_test01')
                            ->limit(Pagination::get('per_page'))
                            ->offset(Pagination::get('offset'))
                            ->execute()
                            ->as_array();

    //view表示
    $view = View::forge('vhogea');
    return $view;
}

■ビュー
<html>
<head>
    <title></title>
</head>
<body>
    <!-- 「<<<< << 1 2 3 4 5 >> >>>>」 -->
    <?php echo Pagination::create_links(); ?>

    <!-- 「1 2 3 4 5」 -->
    <?php echo Pagination::page_links(); ?>

    <!-- << -->
    <?php echo Pagination::prev_link(); ?>

    <!-- >> -->
    <?php echo Pagination::next_link(); ?>
</body>
</html>

基本的な流れはPaginationに設定を喰わせて表示用の部品を呼び出しているだけですね。

//設定
$config = array(
    'pagination_url' => 'hoge2/index',
    'uri_segment' => 3,
    'num_links' => 4,
    'per_page' => 2,
    'total_items' => $cnt,
    'name' => 'pagination',
    'show_first' => true,
    'show_last' => true,
);

が設定部分です。
中身は

pagination_url:リンクに記載するURL部分(コントローラとメソッド)
uri_segment:何個目のセグメントがページ番号かの指定
num_links:自ページに対して前後何ページのページ番号リンクを表示するか
per_page:1ページあたり何件のデータ表示するか
total_items:全部で何件のデータがあるか
name:読み込むテンプレート設定ファイル
show_first':「最初のページに戻る」リンクを表示するか
show_last':「最後のページへ移動」リンクを表示するか

ってな感じ。
コントローラでまず最初にデータ件数を取得しているのは「per_page」を設定するためですね。

「pagination_url」はリンクのURL部分で
「num_links」はURLの何番目の部分がページ番号になるかです。

例えば

'pagination_url' => 'hoge2/index',

と指定した場合、実際のリンクは

http://127.0.0.1/hoge2/index/5

のようなURLになります。
ここでドメイン部分を除外すると「hoge2/」「index/」「5」と分けられますよね?
そして3番目の「5」がリンク先のページ番号です。
そこで

'uri_segment' => 3,

と指定します。
「3番目がページ番号だよ」の意味です。

ちなみに「pagination_url」を未指定にして「uri_segment」に文字列を指定するやり方もあります。
例えば

//設定
$config = array(
//    'pagination_url' => '指定しない',
    'uri_segment' => 'p',

    'num_links' => 4,
    'per_page' => 2,
    'total_items' => $cnt,
    'name' => 'pagination',
    'show_first' => true,
    'show_last' => true,
);

のような設定をすると、リンクのURLは

http://127.0.0.1/hoge2/index?p=5

のようにGETパラメータとして扱われますよ。
「あれ?なんかページ遷移が上手くいかないんだけど?!」とお困りのときは
一度試してみても良いかも知れません。

「name」は読み込むテンプレート設定ファイル……って言われても分からないですよね。
paginationのスタイルは

fuel/core/config/pagination.php

内にあれやこれやと定義されています。
こいつを

fuel/app/config/pagination.php

としてコピーして、見た目をあれやこれやと変更しているのですが、
そのファイル名を指定しているのです。
「'name' => 'pagination',」は「pagination.phpの定義を使うよ」の意味です。
例えば「'name' => 'hoge',」にしたら「hoge.phpの定義を使うよ」の意味になります。

昔のFuelPHPさんでは配列内に直接スタイルを定義できたようですが、
1.4だか1.5から書けなくなったみたいです。

「show_first」「show_last」は最初と最後への移動用リンクの表示有無ですね。
こいつらをtrueにしておかないと最初と最後へのリンクは表示されません。

こんな感じで設定をしたら、後は実際に表示します。
表示に関しては

■(最初に戻る、最後へ進むリンクと)戻る、進むリンクとページ番号のリンクを表示
<!-- 「<<<< << 1 2 3 4 5 >> >>>>」 -->
<?php echo Pagination::create_links(); ?>

■ページ番号のリンクを表示
<!-- 「1 2 3 4 5」 -->
<?php echo Pagination::page_links(); ?>

■戻るリンクを表示
<!-- << -->
<?php echo Pagination::prev_link(); ?>

■進むリンクを表示
<!-- >> -->
<?php echo Pagination::next_link(); ?>

のように指定します。

あれ?
「最初に戻る」と「最後へ進む」は単独で表示できないのですかね?

はい、そのままでは単独で表示できません。
もし単独で表示させたければ

fuel/core/classes/pagination.php

を開いて50行目近辺の

// old pre-1.4 mapping to new instance methods
static $mapping = array(
    'get' => '__get',
    'set' => '__set',
    'set_config' => '__set',
    'create_links' => 'render',
    'page_links' => 'pages_render',
    'prev_link' => 'previous',
    'next_link' => 'next',
);

を、例えば

// old pre-1.4 mapping to new instance methods
static $mapping = array(
    'get' => '__get',
    'set' => '__set',
    'set_config' => '__set',
    'create_links' => 'render',
    'page_links' => 'pages_render',
    'prev_link' => 'previous',
    'next_link' => 'next',
    'first_link' => 'first',
    'last_link' => 'last',

);

に変えてあげた後で

■最初に戻るリンクを表示
<!-- <<<< -->
<?php echo Pagination::first_link(); ?>

■最後に進むリンクを表示
<!-- >>>> -->
<?php echo Pagination::last_link(); ?>

のように記載してあげると単独で使えます。

これがforgeしない版のPaginationクラスの使い方(--)b

forge()する版は例えばこんな感じになりますφ(--)

■コントローラ
public function action_index2()
{
    //データ総件数取得
    $cnt = DB::select()->from('tbl_test01')->execute()->count();

    //設定
    $config = array(
        'pagination_url' => 'hoge2/index2',
        'uri_segment' => 3,
        'num_links' => 4,
        'per_page' => 2,
        'total_items' => $cnt,
        'name' => 'pagination',
        'show_first' => true,
        'show_last' => true,
    );

    //forge
    $pagination = Pagination::forge('mypagination', $config);


    //データ取得
    $data = DB::select()->from('tbl_test01')
                            ->limit($pagination->per_page)
                            ->offset($pagination->offset)
                            ->execute()
                            ->as_array();

    //view表示
    $view = View::forge('vhogeb');
    $view->auto_filter(false);
    $view->set('pagination', $pagination);    //pagination設定
    return $view;
}

■ビュー
<html>
<head>
    <title></title>
</head>
<body>
    <!-- 「<<<< << 1 2 3 4 5 >> >>>>」 -->
    <?php echo $pagination->render(); ?>

    <!-- 「1 2 3 4 5」 -->
    <?php echo $pagination->pages_render(); ?>

    <!-- << -->
    <?php echo $pagination->previous(); ?>

    <!-- >> -->
    <?php echo $pagination->next(); ?>

    <!-- <<<< -->
    <?php echo $pagination->first(); ?>

    <!-- >>>> -->
    <?php echo $pagination->last(); ?>
</body>
</html>

forgeする版は普通に「最初に戻る」と「最後へ進む」を単独表示できます。
その他は基本的にforgeしない版と同じなので省略。

ん~、forge()するようにした方が良いのですかね(--?
どっちが正統派なのかご存知の方がいらっしゃったら教えてください。

それにしてもPaginationクラス、便利と言えば便利ですが、
選択しているページ番号によって表示ページ数が変わるのを何とかしたいカモです。

1ページ目:[1] 2 3 4 5
3ページ目:1 2 [3] 4 5 6 7 8
5ページ目:1 2 3 4 [5] 6 7 8 9 10

のような形じゃなく

1ページ目:[1] 2 3 4 5 6 7 8 9 10
3ページ目:1 2 [3] 4 5 6 7 8 9 10
5ページ目:1 2 3 4 [5] 6 7 8 9 10

のように表示するページ番号の数は一定数で固定したいのですよ。
気が向いたらそのうち調べてみますかね。

取り合えずは、完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:FuelPHP  thema:パソコンな日々 - genre:コンピュータ  Posted by ササキマコト 

  関連記事