読者です 読者をやめる 読者になる 読者になる

Motomichi Works Blog

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

vagrantその19-30 cakephp入門をやってみる(データを削除する)DELETE

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

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

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

ほぼeditと同じ。

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

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

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

<h1>Edit Page</h1>
<p>MySampleData Delete Form.</p>
<?php
  echo $this->Form->create('MySampleData');
  echo $this->Form->input('id');//name="data[MySampleData][name]"のinput要素
  echo $this->Form->input('name');//name="data[MySampleData][name]"のinput要素
  echo $this->Form->end('Submit');//type="submit"のinput要素(クリックするとpost送信する)
?>
<!--$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に続いて、delアクションを追記した。
自分なりに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);
  }
  public function del($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->delete($this->request->data('MySampleData.id'));
    } 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);
  }
}

生成されるformのhtmlソース

<form accept-charset="utf-8" method="post" id="MySampleDataDelForm" action="/cakephp/my_sample_datas/del/8">
  <div style="display:none;">
    <input type="hidden" value="PUT" name="_method">
  </div>
  <input type="hidden" id="MySampleDataId" value="8" name="data[MySampleData][id]">
  <div class="input text">
    <label for="MySampleDataName">Name</label>
    <input type="text" id="MySampleDataName" value="name8" maxlength="255" name="data[MySampleData][name]">
  </div>
  <div class="submit">
    <input type="submit" value="Submit">
  </div>
</form>

気付いたこと

echo $this->Form->create('MySampleData');

で生成したform要素は以下の通りでmethod="post"accept-charset="utf-8"という属性もついていた。

<form id="MySampleDataDelForm" accept-charset="utf-8" method="post" action="/cakephp/my_sample_datas/del/8">

以下のようなtype="hidden"の要素も生成されていた。

    <div style="display:none;">
      <input type="hidden" value="PUT" name="_method">
    </div>

name="id"の要素はtype="hidden"で以下のように生成されていた。$idとして引数で渡しているからだろうか。

  <input type="hidden" id="MySampleDataId" value="8" name="data[MySampleData][id]">

ヘルパーでnameだけ指定した要素は以下のような感じになる。

  <div class="input text">
    <label for="MySampleDataName">Name</label>
    <input type="text" id="MySampleDataName" value="name8" maxlength="255" name="data[MySampleData][name]">
  </div>

とりあえず今回はここまで。