Ext JS に関しては,新しい記事は Sunvisor Lab. ExtJS 別館 にあります。そちらもよろしくお願いいたします。
xFrameworkPXを使って見る(2) データベース操作
引き続き 「データベースの基本的な操作」のチュートリアルを順番にやってみます。
テーブルとリンクしたモジュールの作成
その通りやってもエラーが出るわけではないが,メッセージがちゃんと表示されないので,.index.php の9行目を
$this->set('module_data', $this->sample->testMethod());
のように()をつけたら動作した。
pxでは,モジュール名にtbl_ というプレフィックスをつけたテーブル名がデフォルトになるようです。モジュール名とは別に設定する場合は,usetable にテーブル名を代入すればいい。このプレフィックス自体もdatabase.pxmlの設定で変更できるような気配がします。既出ですがfalseを代入しておけば,テーブルは使わないモジュールになる。ここのサンプルでは単にテーブルがあるかどうか見ているだけ。
基本的なデータベース操作(1)
ここらへんから具体的な例が出てくる。複数行のデータ取得もある。
モジュールでは,$this->row メソッドの戻り値は1行のみで,$this-rowAll メソッドの戻り値は全行ということでしょうか。
コントローラーでは,モデルからの戻り値をそのまま,$this->set してます。たぶんどちらも連想配列なんじゃないかと思います。
単行データの方では,コントローラーでは $rowdata に値をセットしています。それをビューの方では,
<!--{$rowdata.id}-->
という書式で,フィールドを取り出しています。なるほど。
複数行の場合は,コントローラーでは, $alldata に値をセットしています。それをビューでは,
<!--{foreach from=$alldata item=item key=key}-->
<tr>
<td><!--{$item.id}--></td>
<td><!--{$item.title}--></td>
<td><!--{$item.note}--></td>
<td><!--{$item.modified}--></td>
</tr>
<!--{/foreach}-->
ほぉ。こうしてループが書けるのか。これはSmartyの機能なんだろうか。なるほど。
「基本的なデータベース操作(2)」は,モジュールの $this->count でレコード数が取り出せるということですので飛ばします。
基本的なデータベース操作(3)
データの挿入。データの挿入は, モジュールの$this->insert()メソッドをつかうのですね。
フォームが出てきて,Webアプリらしくなってきます。
- ビューのフォームは,自分自身に対してpostメソッドでデータを投函します。
- コントローラーでは,$this->post プロパティを使ってデータを取り出して,それらがちゃんとセットされていたらモデルのindertData()メソッドでデータを挿入する。
サンプルをコピペしても動作はするのですが,.index.php のモジュールの参照が間違っていて,自分で作ったモジュールを読んでいません。
5行目の
public $modules = array('Docs_Tutorial_Database_Db3_sample');
は
public $modules = array('sample');
です。19行目と27行目
$this->Docs_Tutorial_Database_Db3_sample->insertData(
$alldata = $this->Docs_Tutorial_Database_Db3_sample->getDataAll();
それぞれ
$this->sample->insertData(
$alldata = $this->sample->getDataAll();
という風にするのが正しいです。
面白いのは,モジュールのinsertDataメソッド。
public function insertData($id, $title, $note)
{
$this->insert(
array(
'field' => array(
'id',
'title',
'note',
),
'value' => array(
':id',
':title',
':note',
),
'bind' => array(
'id' => $id,
'title' => $title,
'note' => $note,
)
)
);
}
$this->insert に渡している field と value は,
INSERT INTO () VALUES ()
のINSERT INTO 句のパラメータとVALUES句のパラメータですよね。そしてVALUES句にはコロンで始まるパラメータが設定されているので,bind のところで,それぞれのパラメータと値をひもつけている。という感じかな。
試しに,value のところを次のようにして bind の部分をなくしてしまっても動作しました。
'value' => array(
$id,
"'".$title."'",
"'".$note."'",
)
このやり方では,上のようにちゃんと引用符でくくってやる必要があるようです。
このフォームでは,ID欄に次の値がセットされていますが,コントローラーで全行取得後,最終行のIDプラス1をビューに渡しています。
