パンプキンスパイスラテ

IT系のことが多めの日記帳です

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関数のエイリアス。短い!!!

以上が現状のものです。
続いて、メモの編集機能を追加していくお。