CakePHPでメモ帳:その4
前回のコントローラ、モデル、ビューを詳しくみていくよ。
まずはコントローラ
ファイル名は、コントローラ名_controllerなので、
/app/controllers/memos_controller.php となる。
ソース一覧は下記の通り。
<?php class MemosController extends AppController { var $name = 'Memos'; var $uses = array('Memo'); function index() { $this->set('memos', $this->Memo->findAll(array( 'Memo.delflg'=>'0'), null, 'Memo.created ASC')); $this->pageTitle = 'メモ帳'; } function add() { if (!empty($this->data)) { if ($this->Memo->save($this->data, array( 'body','created', 'modified'))) { $this->flash('登録しました。', '/memos'); return; } } $this->redirect('/memos'); } } ?>
- class MemosController extends AppController
MemosController を AppController から継承。
- var $name = 'Memos';
コントローラ名を定義。
- var $uses = array('Memo');
読み込むモデルを指定(省略時はコントローラの単数形のモデルを自動読み込み)
- function index()
indexアクションメソッド。
- $this->set('memos', $this->Memo->findAll(array('Memo.delflg'=>'0'), null, 'Memo.created ASC'));
$this->set() がビューに値を渡すメソッドで、
$this->Memo->findAll() がMemoモデルからデータを取得。
findAllの引数は(検索条件、取得フィールド、ソート条件、etc...)なので、この場合は、delflgが0の条件で、全ての(nullなので)フィールドを取得し、createdで昇順にソート、となる。
- $this->pageTitle = 'メモ帳';
タイトルを「メモ帳」に。(レイアウトファイルに指定したタイトルに追記される)
- function add()
addアクションメソッド。
- if (!empty($this->data))
モデルへデータが渡されているかチェック。
- if ($this->Memo->save($this->data, array('body','created', 'modified')))
$this->Memo->save() でDBへ追加や変更。
第一引数は値。$this->data にはsaveメソッドに合う形で値が格納されているらしい。
第二引数はモデルのバリデーション機能を使用するかどうか。デフォルトのtrue。
第三引数は第一引数に渡された値から使用するカラムを限定。
- $this->flash('登録しました。', '/memos');
簡易なリンク付きメッセージを表示。
- $this->redirect('/memos');
値がないか、saveに失敗したらリダイレクト。
続いてモデル
/app/models/memo.php
<?php class Memo extends AppModel { var $name = 'Memo'; } ?>
ひとまずこれだけ。
- class Memo extends AppModel
AppModelを継承。
- var $name = 'Memo';
DBはMemosテーブルを指定。
最後にビュー
/app/views/memos/index.thtml
/app/views/コントローラ名/自由なファイル名.thtml という命名。ファイル名をアクション名と同じにしておくと、コントローラ側で明示しなくてもいいので、アクション名=テンプレート名にしておくといいらしい。
<form action="<?php echo h($html->url('/memos/add')) ?>" method="post" style="margin-bottom:1em;"> <p><?php echo $html->input('Memo/body') ?> <?php echo $html->submit('メモの追加') ?></p> </form> <table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <th>ID</th> <th>body</th> <th>created</th> </tr> <?php foreach ($memos as $memo) { ?> <tr> <td><?php echo h($memo['Memo']['id']) ?></td> <td><?php echo h($memo['Memo']['body']) ?></td> <td><?php echo h($memo['Memo']['created']) ?></td> </tr> <?php } ?> </table>
- <form action="<?php echo h($html->url('/memos/add')) ?>" method="post" style="margin-bottom:1em;">
フォームタグ生成。$html->url() でURLを自動でCakePHPを設置したディレクトリに応じて書き換えてくれるらしい。
- <?php echo $html->input('Memo/body') ?>
input type="text"タグ生成。引数は、モデル名/カラム名。
- <?php echo $html->submit('メモの追加') ?>
input type="submit"タグ生成。引数はvalueの値。
- <?php foreach ($memos as $memo) { ?>
$memosにはコントローラから渡された$this->set()の値が配列で代入されているので、foreachでループして表示。
- <?php echo h($memo['Memo']['id']) ?>
h()はhtmlspecialchars関数のエイリアス。短い!!!
以上が現状のものです。
続いて、メモの編集機能を追加していくお。