CakePHPで家計簿WEBアプリを作る ブログチュートリアルのおさらい
ControllerとViewファイルを一気に作ります。
まだControllerのfunctionの中身もviewの中身も空なので一気に肉付けをしていくことにします。
function index{}の中身
先にphpmyadminからpurchasesテーブルにデータを数件入れて置いてください。何も表示されないのでは分かり難いので。
INSERT INTO `money`.`purchases` ( `id` , `name` , `money` , `category_id` , `created` , `modified` ) VALUES ( NULL , 'お菓子', '120', NULL , '2012-08-03 14:07:00', '2012-08-03 14:07:00' );
私はさっきコンビニで購入した120円のチョコレートを登録しておきました!
purchases_controller.phpのfunction index
Purchaseモデル(purchasesテーブル)の中身を全て引っ張るには、このようにfind(‘all’)すればよいでしょうか?
function index(){ $Purchase_con = array( //'conditions' => array(),今回WHEREの条件は無いので、何も書かなくてOK 'order' => 'Purchase.id ASC' ); $Purchase = $this->Purchase->find('all',$Purchase_con); }
これでもOKなんですが、
家計簿ということで、データの登録数が何千件にも今後なるかもしれないので
一度に全てのデータを引っ張るfind(‘all’)は適切ではありません。
家計簿ということで、データの登録数が何千件にも今後なるかもしれないので
一度に全てのデータを引っ張るfind(‘all’)は適切ではありません。
paginateを使って、データの分割を行う
CakePHPのpaginateを利用すれば、プラグインを使わなくても、誰でも簡単に大量のデータを○○件ずつ分割させることが出来ます。(素敵!)
paginateを利用したデータの取得
//全ての購入品リストを取得 $this->paginate = array( 'order' => array('Purchase.id desc'), 'limit'=>20,//1ページあたりの表示件数 ); //view側に購入品リストを渡す $this->set('purchases',$this->paginate('Purchase'));//$this->paginate('Model名')
どうでしょう?findと違うのはlimitの意味が、1ページ中に表示されるデータの分割数となるだけですね。
paginateのページ送りをしてくれるHTMLの作成
app/views/elements
elementsディレクトリに、ページ送りするためのpaginator.ctpを作成します。
補足:elementsディレクトリとは?
elementsとは、view上(HTML)のパーツを保存する場所。layoutsフォルダがサイトの大枠のレイアウトを保存するのと違い、
elementsディレクトリにはやれ ヘッダーだの、フッターだの、共通化させたいHTMLを保存するところです。
プログラマーよりWEBデザイナーやコーダーさんがお世話になるフォルダですね
elementsディレクトリにはやれ ヘッダーだの、フッターだの、共通化させたいHTMLを保存するところです。
プログラマーよりWEBデザイナーやコーダーさんがお世話になるフォルダですね
elements/paginator.ctp
paginator.ctpの中身です。私はかれこれ1年くらいこのソースコードを使いまわししているのですが・・
$paginator->numbers()の部分は件数などの表記が出来ます。
<div id='pagination'> <?php echo $paginator->prev('<< '.__('戻る', true), array(), null, array('class'=>'disabled', 'tag' => 'span',) ); ?> | <?php echo $paginator->numbers(). ' | '. $paginator->next(__('次', true).' >>', array(), null, array('tag' => 'span', 'class' => '')); ?> </div>
views/purchases/index.ctp
<?php echo $this->element('paginator');?><?php echo $paginator->counter(array( 'format' => '%start% ~ %end%件(全%count%件)')); ?> <table width="100%" cellspacing="0" cellpadding="0" border="0"> <tr> <td>id</td> <td>カテゴリー</td> <td>購入品</td> <td>金額</td> <td>日時</td> <td>編集</td> </tr> <?php foreach ($purchases as $purchase): ?> <tr> <td><?php echo $purchase['Purchase']['id'];?></td> <td></td> <td><?php echo $purchase['Purchase']['name'];?></td> <td><?php echo $purchase['Purchase']['money'];?></td> <td><?php echo $purchase['Purchase']['created'];?></td> <td><a href="/purchases/edit/<?php echo $purchase['Purchase']['id'];?>">編集</a>|<a href="/purchases/delete/<?php echo $purchase['Purchase']['id'];?>" onclick="return confirm('削除してもよろしいですか?')";>削除</a></td> </tr> <?php endforeach; ?> </table>
ブログチュートリアルの一覧ページを作成する内容とそれほど変わりませんね。ページングもたったこれだけで完了です。
全体の件数も、今何ページ目なのかも表示され、とても優れたページングですね。
私はCakePHPの中でもこの優れたページングがお気に入りです!
このページングのあたりのことはコピペで使って下さい。