参考にさせて頂いたページ
データの追加・更新・削除(1/3):初心者のためのCakePHP2.0 プログラミング入門
add.ctpの作成とその記述内容
参考ページにならって以下の通りですが、データベースに入っているデータの表示もしたいので、自分なりに追記しています。
<h1>Add Page</h1>
<p>MySampleData Add Form.</p>
<?php
echo $this->Form->create('MySampleData');
echo $this->Form->input('name');
echo $this->Form->input('mail');
echo $this->Form->input('tel');
echo $this->Form->end('Submit');
?>
<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アクションを追記した。
自分なりに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);
}
}
このコードについて
以下の記述でform要素の開始タグを生成
//echo $this->Form->create(Model名の指定);
echo $this->Form->create('MySampleData');
以下の記述で、input要素を生成
echo $this->Form->input('name');
echo $this->Form->input('mail');
echo $this->Form->input('tel');
以下の記述で、ボタンとformの終了タグを生成
echo $this->Form->end('Submit');
参考ページによると、echo $this->Form->create('');
の記述でform開始タグを生成した場合は、このページ(アクション)自身にデータが送信されるとのこと。action属性の設定の仕方もあるんだろうけど、今日はいいや。
参考ページによるとif ($this->request->is('post'))
の記述で、このページへのアクセスがGETかPOSTかを判定しています。
以下の記述で、テーブルにデータをINSERTしています。
$this->MySampleData->save($this->request->data);
INSERT文とか自分で書かなくていいし簡単。
参考ページによると
コントローラーでは、$thisにModelクラスと同名のプロパティが用意され、そこにModelが設定されていました。この「save」を呼び出すと、新しいデータを保存します。引数には、$this->request->dataを指定します。このdataには、送信されたフォームの情報がまとめられています。たったこれだけで、送信したデータをデータベースに保存することができてしまうのです。
とのことです。
モデルのこと
いまのところあまり理解していないけど、今ある事実だけまとめると以下の通り。
- app/Model/
MySampleData
.php - その中のクラス名も
MySampleData
- アンダースコア区切りだけどテーブル名も
my_sample_data
モデルファイル名と、クラス名と、テーブル名、このあたりのルールと使い方をきちんと理解するのは今後の課題。
3つ揃えるのが基本的なルールなのかな?
データベース名は参考ページにならってMySampleData
としているけど、たぶん何かに揃える必要はなくて、database.phpに任意のデータベース名を書けば良さそう。
今日のこのままの実装だと、ページ更新するたびにINSERTされてしまうし、問題はあるんだけど、練習なのでとりあえず良い。
とりあえずINSERTとSELECTできるような感じになってきたので、今回はここまで。
次回はUPDATEかな。