CakePHP::Pagenation(ページャ、ページング処理)

7月 5th, 2007 admin Posted in CakePHP, PHP |

ページャとかページングとか行うためのコンポーネントの紹介
PHPではよくPEAR::PAGERとか使ったりするのだけど自前でやるのがCake流(多分)

以下はBakeryのPaginationのチュートリアルのエスパー翻訳です。

Pagination  By Andy Dawson aka "AD7six"
http://bakery.cakephp.org/articles/view/pagination

もしあなたのアプリケーションでたくさんのデータを表示したりするなら、ソートできたりページに分けたほうがいいよね。このチュートリアルではそれをどうやってやるかを説明します。あなたはいくつかのファイルをコピーして数行のコードを書くだけでこれらのことができるでしょう。
これをやるのにCakeの知識はほとんどいりません:)

もしあなたがまだページネーションをつけたいと思うテーブルをもってないならhttp://manual.cakephp.org/appendix/blog_tutorial こことかで準備してくださいね。

セッティング

必要なファイルはすべてbakeryで手に入ります。
http://bakery.cakephp.org/articles/view/67 を/app/controllers/components/pagination.phpに
http://bakery.cakephp.org/articles/view/68を/app/views/helpers/pagination.phpに
http://bakery.cakephp.org/articles/view/69を/app/views/elements/pagination.thtmlに

それぞれ保存します。

コントローラの作成と編集

ページネーションを使うのに必要な編集はコンポーネント、ヘルパーのインクルードとコンポーネントのinitメソッドの呼び出しだけです。

PHP:
  1. <?php
  2. class PostsController extends AppController
  3. {
  4.     var $name = 'Posts'; // for PHP4 installs
  5.     var $components = array ('Pagination'); // Added
  6.     var $helpers = array('Pagination'); // Added
  7.  
  8.     function index() {
  9.         $criteria=NULL;
  10.         list($order,$limit,$page) = $this->Pagination->init($criteria); // Added
  11.         $data = $this->Post->findAll($criteria, NULL, $order, $limit, $page); // Extra parameters added
  12.  
  13.         $this->set('data',$data);
  14.     }
  15. }
  16. ?>

ビューの作成と編集

ページネーションを使うにはエレメントのインクルードとオプションとしてソート順を変えるためのテーブルヘッダを指定が必要です。

PHP:
  1. <?php
  2. $pagination->setPaging($paging); // Initialize the pagination variables
  3. $th = array (
  4.             $pagination->sortBy('id'),
  5.             $pagination->sortBy('title'),
  6.             $pagination->sortBy('created')
  7. ); // Generate the pagination sort links
  8. echo $html->tableHeaders($th); // Create the table headers with sort links if desired
  9.  
  10. foreach ($data as $output)
  11. {
  12.     $tr = array (
  13.         $output['Post']['id'],
  14.         $html->link($output['Post']['title'], "/Posts/View/{$output['Post']['id']}"),
  15.         $output['Post']['created']
  16.         );
  17.     echo $html->tableCells($tr,array('class'=>'altRow'),array('class'=>'evenRow'));
  18. }
  19. ?>
  20.  
  21. <?php echo $this->renderElement('pagination'); // Render the pagination element ?>

訳注:ここの段階でページングできてます!便利だなぁ

Ajaxアップデートの追加

もしRequestHandlerコンポーネントとAJAXヘルパーをコントローラにインクルードしていて、prototype.jpもビューに読み込んでいるならajaxアップデートが簡単にできます。デフォルトでは"content"divがアップデートされますが、これはコンポーネントで(そのほかdirectryやrun timeでも)変更可能です。you can disable this automatic behaviour if required.

Prototypeの追加方法

ではどのようにprototypeを追加するのでしょうか?
レイアウトを変更しましょう。

Prototype JavaScriptライブラリはhttp://prototype.conio.net/で入手可能です。
prototype.jsを/app/webroot/js/に入れて
下記のコードをタグ内に入れてください。

PHP:
  1. <?php
  2. if(isset($javascript)):
  3.     echo $javascript->link('prototype.js');
  4. endif;
  5. ?>

追記
additional infoとして追加のページがあるようです。
http://bakery.cakephp.org/leafs/view/7

3 Responses to “CakePHP::Pagenation(ページャ、ページング処理)”

  1. [...] 以前にCakePHP1.1用のPaginationコンポーネントを紹介したんですが、getパラメータに配列を使うと正しくリンクを作ってくれなかったのでそれの補足。 [...]

  2. ほかのサイトにくらべてぬけが少なくわかりやすかったです。
    ひどいところはcomponents, elemtnts, helpersにpagination関係のファイルを入れることすら書いてないのですから。
    ただ、このサイトのコードをそのまま貼り付けると'や"が全角であったり、タグがいるとおもうのですが?

    そして、わからないのがajaxアップデートの部分で、componentsとhelpersの$style='html'を$style='ajax'とし、prototype.jsを/app/webroot/js/に入れて、htmlにprototype.jsを読み込む設定を入れてみました。
    しかし、テーブル項目をクリックするとajaxでソートはかかるが、contentの部分がcontainer+contentに置き換わってしまい、その結果container+container+contentとなってヘッダ、フッダが2重に表示されます。
    この状態でテーブル項目をクリックするとcontentはまた2重化はされずcontainer+container+contentのままです。
    とりあえずdefault.thtmlをcontentのみにすれば2重化は防げますが、非常になぞです。
    ちなみにCakePHP1.1.20.7692を使用し、prototype.jsは1.6.0.1です。

  3. >papi2さん
    コメント有難うございます。
    ソースコードの全角は気になっていたのですが怠けて直していませんでした。このページは僕のブログでは見てくれている人が少なくないのでいま修正しておきました。ご指摘有難うございます。

    ajaxのほうは僕は使っていないのちょっとわかりませんが
    additional infoのほうのコメントが活発なので単純なバグならそちらに修正するコードがあるかもしれません。
    宜しくお願いします。

Leave a Reply