Motomichi Works Blog

その日学習したことについて書いている日記です。誰かの役に立ったらそれはそれで嬉しいです。

vagrantその19-29 cakephp入門をやってみる(データを更新する)UPDATE

参考にさせて頂いたページ

データの追加・更新・削除(2/3):初心者のためのCakePHP2.0 プログラミング入門

POSTとPUTの使い分け : アジャイル株式会社

データを取得する — CakePHP Cookbook 2.x ドキュメント

edit.ctpの作成とその記述内容

参考ページにならって以下の通りですが、

  • $this->request->dataの中も確認したい
  • データベースに入っているデータの表示もしたい

ので、今回も自分なりに追記しています。

<h1>Add Page</h1>
<p>MySampleData Add Form.</p>
<?php
  echo $this->Form->create('MySampleData');
  echo $this->Form->input('id');//name="data[MySampleData][id]"のinput要素
  echo $this->Form->input('name');//name="data[MySampleData][name]"のinput要素
  echo $this->Form->input('mail');//name="data[MySampleData][mail]"のinput要素
  echo $this->Form->input('tel');//name="data[MySampleData][tel]"のinput要素
  echo $this->Form->end('Submit');
?>
<!--$this->request->dataに何が入っているのか表示してみる-->
<pre>
<?php print_r($this->request->data); ?>
</pre>
<!--MySampleDataテーブルの内容を全て表示-->
<table>
<?php foreach ($datas as $data): ?>
  <tr>
    <td><?php echo $data['MySampleData']['id']; ?></td>
    <td><?php echo $data['MySampleData']['name']; ?></td>
    <td><?php echo $data['MySampleData']['mail']; ?></td>
    <td><?php echo $data['MySampleData']['tel']; ?></td>
  </tr>
<?php endforeach; ?>
</table>

MySampleDatasController.phpの記述内容

参考ページにならって以下の通り。
ここまでやってきたindex,find,addに続いて、editアクションを追記した。
自分なりにViewに追記したテーブル表示のために、データ取得処理も記述している。

<?php
App::uses('AppController', 'Controller');

class MySampleDatasController extends AppController {
  function index(){
    // レイアウト関係
    $this->layout = "Sample";
    $this->set("header_for_layout","Sample Application");
    $this->set("footer_for_layout","copyright by SYODA-Tuyano. 2011.");
    // 以下がデータベース関係
    $datas = $this->MySampleData->find('all');
    $this->set('datas',$datas);
  }
  function find(){
    $this->set("header_for_layout","Sample Application");
    $this->set("footer_for_layout","copyright by SYODA-Tuyano. 2011.");
    if (isset($this->data['id'])){
      //find.tplでsubmitした文字列を$idに格納
      $id = $this->data['id'];
      //MySampleDataモデルクラスのレコードのうち、idが$idと等しいレコードを$statusに格納
      $status = array(
        'conditions' => array(
          'MySampleData.id' => $id
        )
      );
      //$statusに入っている最初の要素を$dataに格納
      $data = $this->MySampleData->find('first', $status);
    } else {
      $data = null;
    }
    //$dataをset
    $this->set('data',$data);
  }
  public function add() {
    // レイアウト関係
    $this->layout = "Sample";
    $this->set("header_for_layout", "Sample Application");
    $this->set("footer_for_layout", 
        "copyright by SYODA-Tuyano. 2011.");
    // post時の処理
    if ($this->request->is('post')) {
      $this->MySampleData->save($this->request->data);
    }
    // 表示用にテーブルのデータを取得してset
    // Model/MySampleData.phpの中の、MySampleDataクラスを実行してると思う。find('all')はextendされたメソッド。
    $datas = $this->MySampleData->find('all');
    $this->set('datas',$datas);
  }
  public function edit($id) {
    // レイアウト関係
    $this->layout = "Sample";
    $this->set("header_for_layout", "Sample Application");
    $this->set("footer_for_layout", 
        "copyright by SYODA-Tuyano. 2011.");

    $this->MySampleData->id = $id;
    if ($this->request->is('post') || $this->request->is('put')) {
      //postまたはputでこのURLにアクセスした場合(データベースの更新とリダイレクト)
      $this->MySampleData->save($this->request->data);
      $this->redirect(array('action' => 'index'));
    } else {
      // それ以外のアクセスの場合(データベースから値を取得して"$this->request->data"に格納)
      $this->request->data = 
          $this->MySampleData->read(null, $id);
    }
    // 表示用にテーブルのデータを取得してset
    // Model/MySampleData.phpの中の、MySampleDataクラスを実行してると思う。find('all')はextendされたメソッド。
    $datas = $this->MySampleData->find('all');
    $this->set('datas',$datas);
  }
}

このコードについて

以下のような感じで処理を振り分けています。

    if ($this->request->is('post') || $this->request->is('put')) {
      //postまたはputでこのURLにアクセスした場合(データベースの更新とリダイレクト)
      $this->MySampleData->save($this->request->data);
      $this->redirect(array('action' => 'index'));
    } else {
      // それ以外のアクセスの場合(データベースから値を取得して"$this->request->data"に格納)
      $this->request->data = 
          $this->MySampleData->read(null, $id);
    }

たとえば

http://192.168.33.10/cakephp/my_sample_datas/edit/1

にアクセスして、elseの中が実行されるとき、$this->request->dataの中の配列構造とキーは
(配列要素として入っている文字列は自分で適当に挿入したものです)

    Array
(
    [MySampleData] => Array
        (
            [id] => 1
            [name] => name1
            [mail] => mail1
            [tel] => tel1
        )

)

であり、どうやら

  • name="data[MySampleData][id]"
  • name="data[MySampleData][name]"
  • name="data[MySampleData][mail]"
  • name="data[MySampleData][tel]"

のinput要素のvalue属性にそれぞれ対応した配列要素が自動的に挿入されるみたい。

すごい。

今回はここまで。