では、基本的な仕組みがわかったら、別のアクションも作ってみましょう。今度は、データを追加する「add」アクションを考えてみます。
以下に、コントローラーに追加するアクションメソッドと、新たに用意するテンプレートのリストを掲載しておきます。これらを追加作成し、
http://localhost/cakesample/mydatas/addにアクセスしてみてください。データの追加が行えるようになります。
テンプレートでは、フォームヘルパーを使ってフォームを作成しています。用意するのは、name,mail,tel,commentの項目。idとcreatedは、データ保存時に自動的に値が設定されるので、用意する必要はありません。
アクションクラスでは、実はたった2つのメソッドを呼び出しているだけです。それは以下のようなものです。
・データを追加する$this->Mydata->save($this->data);
・indexにリダイレクトする$this->redirect(".");
データの追加は、モデルの
「save」というメソッドで行います。これは、引数にデータを配列にまとめたものを渡して呼び出すと、その配列をもとにデータを追加する処理を行ってくれます。フォームヘルパーで生成したフォームのデータは、
$this->dataにまとめられていましたから、これをそのままsaveに引数として渡してやるだけです。
保存後、indexに戻るようにしているのが、
$this->redirectです。これにより、redirectの引数に指定したアドレスに移動します。コントローラーで処理を実行後、ページを移動するような場合には、これを用いるのが基本と考えてよいでしょう。
※リダイレクト時の例外発生について
環境によっては、addから送信した際に「既にヘッダーが送られている」といったエラーが出て、うまくindexにリダイレクトできない場合もあるでしょう。PHPプログラマなら誰もがピンとくるはず。そう、
「output_buffering」の問題です。出力バッファがOFFになっているため、事前にヘッダーが送られてしまい、リダイレクトに失敗しているのです。
php.iniを開いて
「output_buffering」を検索し、
「output_buffering = On」に設定してください。CakePHPなどのフレームワーク系では、output_bufferingがOnでないとリダイレクト関係がうまく機能しないものが多いようです。
※MydatasControllerクラスに追加するアクションメソッド
function add(){
$this->set("page_title","Sample Add Page");
$this->set("content_header","Sample Add Page.");
$this->set("content_footer","copyright SYODA-Tuyano. 2010.");
if (!empty($this->data)){
$this->Mydata->save($this->data);
$this->redirect(".");
}
}
※「views」「mydatas」内に新たに作る「add.ctp」ファイル
<h1>データの追加</h1>
<?php echo $form->create("Mydata",array("type"=>"post","action"=>"./add")); ?>
<?php echo $form->input("name"); ?>
<?php echo $form->input("mail"); ?>
<?php echo $form->input("tel"); ?>
<?php echo $form->textarea("comment"); ?>
<?php echo $form->end("送信"); ?>
