閲覧総計:2807  (本日:1  昨日:0)

CakePHPの入門者トレーニングとして、gihyo.jpサイトの「CakePHPで高速Webアプリ開発」
がすばらしい。しかし、このサンプル例題はCakePHP1.1で解説されている為、CakePHP1.2
では少し異なるコード表現になりそうな所がある。
サンプル例題「ToDoアプリ」をCakePHP1.2でトレースしてみた。 09/01/02

【目次】(項目をクリックすると、そこに飛べます)


コントローラへのアクションの追加

(原典)http://gihyo.jp/dev/serial/01/cakephp/0006?page=1

tasks_controller.phpのindexアクションの修正とdone, edit, delアクションの追加。

/cakephp/app/controllers/tasks_controller.php

<?php
// app/controllers/tasks_controller.php
class TasksController extends AppController { //AppControllerを継承
  var $name = 'Tasks'; //controller名を定義(頭が大文字を覚える)
  var $uses = array('Task'); //使用するmodel名を定義
  
  function index() { //indexアクションの定義
    $this->set('yet_tasks', $this->Task->findAllByStatus('yet', null, 'Task.created ASC'));
    $this->set('done_tasks', $this->Task->findAllByStatus('done', null, 'Task.modified DESC'));
  }
  function add() {
    if (!empty($this->data)) { //モデルへの値が渡されてきているかチェック
      if ($this->Task->save($this->data, true, array('content', 'created', 'modified'))) {
        //DBへのレコード追加、saveの第3引数でホワイトリスト設定をした
        $this->flash('タスクが追加されました', '/tasks');
        //flashで簡易な完了メッセージ表示
        return;
      }
    }
    $this->redirect('/tasks'); //$this->dataに値がないか,saveに失敗したときはtasksへリダイレクト
  }
  function done($id) {
    if ($this->Task->findById($id)) {
      $this->Task->id = $id;
      $this->Task->save(array('status' => 'done'));
    }
    $this->redirect('/tasks');
  }
  function edit($id) {
    $task = $this->Task->findById($id);
    if (!$task) {
      $this->redirect('/tasks');
      return;
    }
    if (!empty($this->data)) {
      $task['Task']['content'] = $this->data['Task']['content'];
      $this->Task->save($task);
      $this->redirect('/tasks'); //saveが完了したらtasksへリダイレクト
    }
    $this->set('task', $task);
  }
  function del($id) {
    $this->Task->del($id);
    $this->redirect('/tasks');
  }

}

indexビューの修正

index.ctpを修正します。

/cakephp/app/views/tasks/index.ctp

<form action="<?php echo h($html->url('/tasks/add')) ?>" method="post" style="margin-bottom:1em">
<p><?php echo $form->input('Task.content', array('type'=>"text", 'label'=>"")) ?>
<?php echo $form->submit('タスクを追加') ?></p>
</form>

<h2>未完了タスク</h2>

<table>
  <tr>
    <th>Id</th>
    <th>タスク内容</th>
    <th>状態</th>
    <th>操作</th>
    <th>作成日</th>
  </tr>
  <?php foreach ($yet_tasks as $task) { ?>
    <tr>
      <td><?php echo h($task['Task']['id']) ?></td>
      <td><?php echo h($task['Task']['content']) ?></td>
      <td><?php echo h($task['Task']['status']) ?></td>
      <td>
        <?php echo $html->link('完了', '/tasks/done/' . $task['Task']['id'], null, '完了してもよろしいで すか?') ?>
        <?php echo $html->link('編集', '/tasks/edit/' . $task['Task']['id']) ?>
        <?php echo $html->link('削除',  '/tasks/del/'  . $task['Task']['id'], null, '削除してもよろしい ですか?') ?>
      </td>
      <td><?php echo h($task['Task']['created']) ?></td>
    </tr>
  <?php } ?>
</table>


<h2>完了タスク</h2>

<table>
  <tr>
    <th>Id</th>
    <th>タスク内容</th>
    <th>状態</th>
    <th>操作</th>
    <th>作成日</th>
  </tr>
  <?php foreach ($done_tasks as $task) { ?>
    <tr>
      <td><?php echo h($task['Task']['id']) ?></td>
      <td><?php echo h($task['Task']['content']) ?></td>
      <td><?php echo h($task['Task']['status']) ?></td>
      <td><?php echo $html->link('削除', '/tasks/del/' . $task['Task']['id'], null, '削除してもよろしい ですか?') ?></td>
      <td><?php echo h($task['Task']['created']) ?></td>
    </tr>
  <?php } ?>
</table>

editビューの作成

edit.ctpを作成します。

/cakephp/app/views/tasks/edit.ctp

<h1>タスクの編集</h1>
<p><a href="<?php echo h($html->url('/tasks')); ?>">タスク一覧へ戻る</a></p>

<form action="<?php echo h($html->url('/tasks/edit/' . $task['Task']['id'])) ?>" method="post">
<?php echo $form->hidden('Task.id', array('value' => $task['Task']['id'])) ?>

<h2>内容</h2>
<p><?php echo $form->textarea('Task.content', array('cols' => '60', 'rows' => '3', 'value' => $task['Task']['content'])) ?></p>
<p><input type="submit" value="保存"></p>
</form>

●CakePHP1.2では、<form>タグ周りのメソッドがHtmlヘルパーから、新設のFormヘルパー
に移動となり、書式も少し変更になっています。

<1.1書式>

<form action="<?php echo h($html->url('/tasks/edit/' . $task['Task']['id'])) ?>" method="post">
<?php echo $html->hidden('Task/id', $task['Task']['id']) ?>

<h2>内容</h2>
<p><?php echo $html->textarea('Task/content', array('cols' => '60', 'rows' => '3', 'value' => $task['Task']['content'])) ?></p>
<p><input type="submit" value="保存"></p>
</form>

<1.2書式>

<form action="<?php echo h($html->url('/tasks/edit/' . $task['Task']['id'])) ?>" method="post">
<?php echo $form->hidden('Task.id', array('value' => $task['Task']['id'])) ?>

<h2>内容</h2>
<p><?php echo $form->textarea('Task.content', array('cols' => '60', 'rows' => '3', 'value' => $task['Task']['content'])) ?></p>
<p><input type="submit" value="保存"></p>
</form>

修正したアプリケーションの動作を確認する

(原典)http://gihyo.jp/dev/serial/01/cakephp/0006?page=3

●完了と未完了タスクが分離された一覧表示
LH_cake_tasks2段表示画面.JPG

●完了と削除のリンク選択時に確認メッセージが表示される
LH_cake_tasks確認メッセージ画面.JPG

●Edit(編集)アクションのビュー
LH_cake_tasks編集画面.JPG


選択肢 投票
参考になった 11  
ふつう 0  
参考にならなかった 0  

添付ファイル: fileLH_cake_tasks編集画面.JPG 606件 [詳細] fileLH_cake_tasks確認メッセージ画面.JPG 585件 [詳細] fileLH_cake_tasks2段表示画面.JPG 594件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-12-26 (土) 17:09:31 (3037d)