CakePHPのBakeでは確認画面が作られません。
確認画面を作るのはかなり面倒なので何か良いツールがないかと探していたところ「XformHelper」に出会いました。
設定から利用までさほど苦労する所もなく簡単に使うことができました。
都道府県を登録するテーブルを使った例を記載します。
Bakeで作成したファイルを改造していきます。
新規追加「add」に確認画面をつけてみましょう。
テーブル名:prefecture
カラム名:id(主キー・AI),name
フォームをエレメント化する。
/views/elements/ の下に
「controller名_function名.ctp」ファイルを作る。
今回の場合は/views/elements/prefectures_add.ctp
「prefectures_add.ctp」の内容
1 2 3 4 |
<?php echo $this->Xformjp->input('name'); echo $this->form->error('Prefecture.name'); ?> |
フォームはXformjpにし、エラー表示はformにするのがポイント。
エラーはXformではなく、CakePHPのデフォルトのformで処理するので。
/views/prefectures/ の下に
「add_confirm.ctp」ファイルを作る。
「add.ctp」を以下のように変更する。(Bakeで作られたものを変更)
1 2 3 4 5 6 7 8 9 10 |
<div class="prefectures form"> <?php echo $this->Xformjp->create('Prefecture',array('action' => 'add_confirm'));?> <fieldset> <legend><?php __('Add Prefecture'); ?></legend> <?php echo $this->element("prefectures_add"); //★ ?> </fieldset> <?php echo $this->Xformjp->end(__('Submit', true));?> </div> |
フォーム項目をelementから呼び出します。上記★の部分。
「add_confirm.ctp」ファイルの内容。
下記のように記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php echo $this->Xformjp->create('Prefecture', array('action' => 'add_finish')); ?> <?php echo $this->element("prefectures_add"); //エレメントを読み込み ?> <?php echo $this->Xformjp->hidden('name'); //項目が複数ある場合は同様に項目数分を記載 echo $vali; ?> <?php //バリデーションが失敗した時に送信ボタンを表示しない為の処理(戻るボタンのみが表示される) if($variError=='失敗'){ }else{ echo $this->Xformjp->submit('送信', array('name' => 'add_finish')); } ?> <?php echo $this->Xformjp->submit('戻る', array('name' => 'back', 'onClick' => 'history.back(); return false;')); echo $this->Xformjp->end(); ?> |
「モデルの変更」
1 2 3 4 5 6 7 8 9 10 11 |
<?php class Prefecture extends AppModel { var $name = 'Prefecture'; var $displayField = 'name'; public $validate =array( 'name'=>array( 'rule'=>'notEmpty', 'message'=>'都道府県名を入力してください' ) ); } |
バリデーションでmessage項目を追加しておくと、確認画面でエラー時にメッセージが表示される。
「コントローラーの変更」
Bakeで作った時には function add()でdataが存在する場合はDBに登録する処理になっているが、confirm確認後にDB登録する流れに変更するのでfunction add()の中身は削除する。
function add_confirm()を追加する。
ここではバリデーション関連のやり取りをしています。バリデーションがOKであればDBへの登録ボタンを表示させる(データ登録・戻るの2つのボタンを表示)。バリデーション失敗の場合は戻るボタンのみを表示。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function add_confirm(){ $this->Prefecture->set( $this->data ); if ($this->Prefecture->validates()) { // バリデーション成功 $this->set('vali','データが正しく入力されています。登録へ進んで下さい'); $this->set('variError','成功');//View側で登録ボタンの表示に利用 } else { // バリデーション失敗 $this->set('vali','データが正しくない、または空白があります、戻って修正して下さい'); $this->set('variError','失敗');//View側で登録ボタンの非表示に利用 } $this->params['xformHelperConfirmFlag'] = true; //確認画面の宣言 } |
「function add_finish()」の内容
ここでは、Bakeで作られていたaddの内容(DBへデータ登録)を記載するだけです。(ほぼコピペでOK)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
function add_finish() { //「戻る」Javascriptで制御の為、下記は利用しない。 if (isset($this->request->data['back'])) { $this->redirect(array('action' => 'add')); } if (!empty($this->data)) { $this->Prefecture->create(); if ($this->Prefecture->save($this->data)) { $this->Session->setFlash(__('The prefecture has been saved', true)); $this->redirect(array('action' => 'index')); } else { $this->Session->setFlash(__('The prefecture could not be saved. Please, try again.', true)); } } |
※XformHelperの設定などは下記参考元に詳しく記載されています。
[参考元]
とても参考になりました。Xformを使うと確認画面が本当に楽に作れます。感謝!
フォーム入力画面と確認画面で共通で使えるXformHelper
[追記] hiddenデータの持ち回りの例。
「prefecture_add.ctp」(エレメント)
1 |
echo $this->form->error('Prefecture.test'); |
「add.ctp」
1 |
echo $this->Xformjp->hidden('test',array('value'=>'abc'); |
※value部分はコントローラーで値をセットして変数を設定する形で使える。
「add_confirm.ctp」
1 |
echo $this->Xformjp->hidden('photo_file_name'); |
人気記事一覧
- MySQL 最大の値・最新の日付データを1つ抽出する方法(MAX)
- [CakePHP] XformHelperの使い方
- Linux: スワップファイル(swp)の削除方法
- HTMLのForm methodとactionについて
- PHPでカンマ区切りデータを配列に入れる方法 (explode)
- [エラー対処] failed to open stream: No such file or directory
- [CSS]ブロック要素(div)の高さを、内部のfloat要素に合わせて自動調整する
- [vsftp] FileZillaから接続できない場合の対処法
- PHP5.1→PHP5.3へバージョンアップする方法(CentOS)
- PHPでテキストを1行ずつ読み込む方法(file_get_contents,explode)
関連記事一覧
- [CakePHP2]SaveAllがうまくいかないときの確認点
- [CakePHP2]Formのバリデーションを切る(HTML5)
- [CakePHP]Bakeでモデルを作る
- テーブルの全データを表示 PHPとMySQL
- Yahoo!の電力使用状況APIを使ってみる
- [CakePHP] paginateの使い方
- [CakePHP] Bakeの起動
- Google Analytics レポートトップ
- [CakePHP2] Bakeの起動
- [Twitter API]You must add your mobile phone to your Twitter profile before creating an application.