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の中でもこの優れたページングがお気に入りです!
このページングのあたりのことはコピペで使って下さい。
