dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

kohanaのテスト9・・・Zendフレームワークのページネーションを利用する

 懸案だったページネーションについては、ZF(Zend FrameWork)のページネーター Zend_Paginator を利用することにしました。ZF のリファレンスガイドを読むと、Zend_View や Zend_Db とセットで使うと良いように書いてあります。しかし、kohana を基盤にしているのに ZF のビューやモデルを使うのでは本末転倒になるので、ページネーターだけ利用させてもらうことにします。それでもかなり楽ができるように思います。

 

ページネーションのサンプルコード

・kohana への ZF の統合については4月27日の日記に書いています。
・モデルについては kohanaのテスト5 で作ったモデルを利用します。
・テスト5のモデルをループで回してやれば、長~いテーブルを簡単に作れます。
・コントローラ kohana/application/classes/controller/test9.php

<?php defined('SYSPATH') OR die('No direct access allowed.');

class Controller_Test9 extends Controller {

    public function action_index() {

        $dat = Model::factory('test5');
        $select = $dat->selectData();

        $paginator = Zend_Paginator::factory($select);

        if (isset($_GET['page'])) {
            $page = $_GET['page'];
        } else {
            $page = 1;
        }

        $paginator->setCurrentPageNumber($page);

        $pagecount = $paginator->count();
        
        $hp = 'test9';
        $firstpage = "$hp?page=1";
        $beforepage = "$hp?page=" . ($page - 1);
        $nextpage = "$hp?page=" . ($page + 1);
        $lastpage = "$hp?page=" . $pagecount;
        if ($page == 1)
            $beforepage = "$hp?page=1";
        if ($page == $pagecount)
            $nextpage = "$hp?page=" . $pagecount;

        // ビュー
        $message = "ページネーションの試験";
        $view = View::factory('test9');
        $view->message = $message;
        $view->data = $paginator;
        $view->firstpage = $firstpage;
        $view->beforepage = $beforepage;
        $view->nextpage = $nextpage;
        $view->lastpage = $lastpage;
        $this->response->body($view);
    }

}

?>

・ビュー kohana/application/views/test9.php

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>kohanaのテスト</title>
    </head>
    <body>
        <h1><?php echo $message ?></h1>
        <table border="1"><tr>
                <?PHP
                foreach ($data as $d) {
                    $id = HTML::chars($d['id']);
                    $name = HTML::chars($d['name']);
                    $address = HTML::chars($d['address']);
                    $tel = HTML::chars($d['tel']);
                    print "<tr><td>$id</td> <td>$name</td> <td>$address</td> <td>$tel</td></tr>";
                }
                ?>
            </tr></table>
        <?php
        echo '<br />';
        echo '<a href='.$firstpage.'>&lt;&lt;</a>';
        echo '<a href='.$beforepage.'>&nbsp;&lt;</a>';
        echo '<a> 前のページ     後のページ </a>';
        echo '<a href='.$nextpage.'>&gt;&nbsp;</a>';
        echo '<a href='.$lastpage.'>&gt;&gt;</a>';
        ?>
    </body>
</html>

 ZF の助けを借りて結構簡単に出来ちゃいました。簡単タイプのページネーションですが、ZF のリファレンスガイドのコントロールなんかより余程簡単で分かりやすいと思います。