肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

KnpPaginatorBundle で Twitter Bootstrap でうまいこといくやつを出す

小ネタ。

Symfony2 つかってるとページング処理どうしようかってのに KnpLabs が公開してる KnpPaginatorBundle を使うことが多い。KnpPaginatorBundle は 2.0 系から Zend_Paginator に依存しなくなって使いやすくなりましたね。 *1

そして、最近特に管理画面系をサクっと仕上げるのに欠かせないのが Twitter Bootstrap なわけだけど、つまり、KnpPaginatorBundle が吐き出すページング用の HTML を、Twitter Bootstrap の、navigation でうまくいくやつを出力したいと思うわけです。

これね:

テンプレートファイルを用意して parameters.ini に設定

Twitter Bootstrap 用に変更している点は、現在のページを active ってクラスにしている点とかその他なんだっけもろもろです。

これを自分で作ってるアプリの適当な Bundle の Resouces/views な場所に入れます。(今回は、 Pagination:pagination.html.twig にいれた。)
で、KnpPaginatorBundle が使うテンプレートを指定するのが parameters.ini で:

[parameters]
...
    knp_paginator.template.pagination=MyAppBundle:Pagination:pagination.html.twig

的なかんじ。

追記: なぜ parameters.ini なのか質問されたので追記。こういう設定は普通 config.yml 的なところで knp_paginator: template: pagination ... なんじゃ?とも思ったんですけど、ソース読んだら parameters から取ってたので、parameters.ini に書きました。勘違いしてたりして...!

追記の追記。 parameters.ini → config.yml に設定変わってた。

この内容つくったとき、最新のソースでソース読んでつくったんだけど、今度ブログ書こー、とおもって1ヶ月くらい経過してたせいで、その後テンプレート指定の方法が変わってたw
32c5c3c 時点では、parameters.ini でOKです。最新のソースでは 06dc809d で設定方法がかわってるので、 config.yml に書けば良いっぽいですね。

と、いうことで多分 config.yml に以下のように記述すればいいとおもいます。

knp_paginator: template: pagination: MyAppBundle:Pagination:pagination.html.twig

※ブログ書く前に最新版で確認しましょうという話。

でなんかする

なんちゃら Controller:

<?php
// in some action

        $qb = $this->get('doctrine')->getEntityManager()->createQuery('...');
        $paginator = $this->get('knp_paginator');
        $posts = $paginator->paginate(
            $qb,
            $this->getRequest()->query->get($pageQueryName, 1), # page number
            $itemCount # items per page
        );

        return $this->render('MyAppBundle:Internal:Hoge/fuga.html.twig', array(
            'posts' => $posts
        )); 

なんちゃら .html.twig

{{ posts.render()|raw }}
  • それだけなのでとくにオチとかもないです
  • KnpPaginatorBundle 使うと 各 column での sort とかも簡単に実装できるので楽ですね

*1:というか KnpLabs は謎の日本語サイトがあったりして面白いですね。日本でもがんばるつもりなんですかね?