【Cake】CakePHP_開発はじめる前に_いつも調べなおすことまとめ
2017/07/06
Contents
- 1 参考リンク集
- 2 set flashのcssクラスを変更する
- 3 ファイルアップロードサンプル
- 4 CSV→配列にパース
- 5 バリデーションの設定
- 6 モデルでのバリデーション
- 7 バリデーションとsaveの切り離し
- 8 validation結果メッセージの取得
- 9 validateルールの設定(一つの項目に複数の設定例)
- 10 任意の箇所にvalidateエラーをはく。そのメッセージにclassを追加する。
- 11 validateのlastについて
- 12 独自バリデーション
- 13 データの重複チェックについて
- 14 validation:手動での重複チェック作成(項目log_id)
- 15 Cake組み込みのemailバリデーションが何でも弾くので独自設定に変える
- 16 Seccurityコンポーネントの利用
- 17 トランザクション設定
- 18 フォームヘルパー周り
- 19 paginateのsortキー等の手動でのとり方
- 20 Modelメソッドの中でアクセスするdbを変更する
- 21 [エラー]joinを使ったとき、Undefined offset: 0 [CORE/Cake/Model/Datasource/DboSource.php, line 1918]が出る。(2.6.10)
- 22 queryでプレースホルダーを利用する
- 23 findの結果の整形(モデル名の削除)
- 24 SQLの関数を使ったときのフィールド名まわり(virtual page fields)
- 25 GETリクエストのフォームで値を引き継ぐ
- 26 Formヘルパーのセレクトで値を引き継げない
- 27 users以外のモデルで認証する。特に管理系
- 28 メール送信 Emailの利用サンプル
- 29 検索結果の配列にモデル名が入る問題
- 30 共通設定ファイルの作成
- 31 Authコンポーネントで使うハッシュ値の作成
- 32 dateフォーマットの入力チェック
- 33 セッション・cookie周りの有効期限等設定
- 34 Authコンポーネントの論理削除フラグの利用
- 35 フォームヘルパーでの複数選択可能チェックボックスの実装について
- 36 確認画面の作成
- 37 formヘルパーでradioやselectのoptionに任意のHTMLを入れる。
参考リンク集
・CakePHP 2.x – ユーザ登録(仮登録・メール・本登録)
・【CakePHP】モデルでテーブル名を指定する | CakePHP雑記帳
・CakePHP2.x Formヘルパーコピペ用-ITかあさん
・CakePHP1.2の.ctpファイルでシンタックスを有効にする.vimrc – めも帖
・CakePHP 2.x – コントローラ内でバリデーション処理を呼び出す
set flashのcssクラスを変更する
ファイルアップロードサンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#View <div> <?php echo $this->Form->create('UserLogs',array('action'=>'import','type'=>'file')); ?> <?php echo $this->Form->input('CsvFile',array('label'=>'ファイル選択','type'=>'file', array("class"=>"form-control"))); ?> <?php echo $this->Form->end(array( "label" => "アップロード", "class"=>"btn btn-primary" ) ); ?> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#Controller public function import(){ if( $this->request->is('Post')) { $uploaddir = '/pj/cakephp/app/tmp/upload_files/'; $uploadfile = $uploaddir . basename($this->data['UserLogs']['CsvFile']['name']); // 正式名称設定 $tmpfile = $this->data['UserLogs']['CsvFile']['tmp_name']; //一時ファイル名 if(is_uploaded_file($tmpfile)){ if (move_uploaded_file($tmpfile, $uploadfile)) { $time = date( "Y/m/d H:i:s", time() ); //登録処理 $this->UserLog->loadCSV($uploadfile); // メッセージ $this->Session->SetFlash("{$time}アップロードに成功しました。", 'default', array('class' => 'alert-success')); } else { //アップロード失敗メッセージ $this->Session->SetFlash("アップロードに失敗しました。", 'default', array('class' => 'alert-error')); } } } } |
CSV→配列にパース
cakeというかphpの話。str_getcsvで囲い文字もOK
1 2 3 4 5 6 7 8 |
// csv パース $buf = file_get_contents($filename); $lines = explode("\r\n", $buf); foreach($lines AS $line){ if($line !=""){ $records[] = str_getcsv($line); } } |
バリデーションの設定
view
1 2 3 4 5 6 7 8 9 10 |
## view <div> <?php echo $this->Form->input('User.mail', array( //★model名(単数形)と合致させる 'type' => 'text', 'class' => '', 'placeholder' => array('メールアドレスを入力して下さい。'), )); ?> </div> |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
## controller public function index() { if ($this->request->is('post')) {//postデータがあったら $this->Regist->create(); //モデル名注意 if ($this->Regist->save($this->request->data)) { //入力チェック、登録実行 $this->Session->setFlash('成功'); //validate ok } else { // validationエラー $this->Session->setFlash('エラーがあります'); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
##Model <?php /** * validate */ public $validate = array( 'mail' => array( //★ここでフォームフィールド名とあわせる。 'rule1' => array( 'rule' => 'notEmpty', 'message' => '必須項目です', ), ) ); |
ちょっと名前を間違えるととたんに動かないので、ムカムカするときも。
モデルでのバリデーション
・validationのみ実行
1 2 |
$this->set($data); $bol = $this->validates($data); |
・saveで実行
1 2 |
$this->create(); $this->save($data, true) |
バリデーションとsaveの切り離し
・CakePHP 2.x – コントローラ内でバリデーション処理を呼び出す
validation結果メッセージの取得
validatesやsaveがfalseの場合に、下記変数を参照する。
$this->validationErrors
validateルールの設定(一つの項目に複数の設定例)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public $validate = array( 'id' => array( 'rule1' => array( 'rule' => 'alphaNumeric', 'message' => 'アルファベットと数字だけを使えます', 'last' => false ), 'rule2' => array( 'rule' => array('minLength', 8), 'message' => '8文字以上です' ) ) ); |
任意の箇所にvalidateエラーをはく。そのメッセージにclassを追加する。
1 2 3 4 5 6 |
echo $this->Form->error('モデル名.要素名', array( 'attributes' => array( 'class' => 'alert-danger' ) ) ); |
validateのlastについて
デフォルトでは、複数のvalidate項目がある場合、全てのvalidateを実行し、
最後にエラーとなったもののメッセージを返却する。
last => trueとすると、その項目でvalidationが止まる。
validateは一つが帰れば問題ないと思うので、基本はデフォルトでlast項目設定せずで良いかな。
全部を表示したい場合は、1項目に1項目ルールをセットするように、複数のvalidation変数を用意して、
順次実行して結果を蓄積していくことになる。
独自バリデーション
http://www.tailtension.com/cakephp/807/
□チェック用関数の作成
1 2 3 4 5 6 7 8 9 10 11 |
public function originall_validate($data){ //$dataに対象 var_dump($data); # key(項目名)→value(引数)という感じでわたる #array(1) { # ["log_id"]=> # string(2) "99" #} } |
ってな感じでチェック用のfunctionを用意して、
1 2 3 4 5 6 7 8 9 |
public $validate = array( 'id' => array( 'rule1' => array( 'rule' => 'originall_validate', 'message' => '適当なメッセージ ), ) ); |
ってな感じでruleに該当function名を渡す。
するとfunctionには該当項目値が$dataとして引き渡される。
$dataに複数渡したい時は
public function originall_validate($data、$limit){…
で
‘rule’ => array(‘originall_validate’, 10);
とかしてあげればよい。
他のフィールドの値を取得したい場合は、「$this->data」でリクエストの中身が取得できる。
データの重複チェックについて
isUniqueという組み込みvalidationルールがあるので、それを利用。
→やっぱりきかねぇ!!というわけで、↓
validation:手動での重複チェック作成(項目log_id)
●チェック用関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function isUniqueLogId($data){ $log_id = $data["log_id"]; $param = array('conditions' => array('UserLog.log_id' => $log_id)); $count = $this->find('count', $param); // 結果が0ならtrue = 処理続行 if ($count === 0){ return true; } else{ return false; } } |
●validate設定例
1 2 3 4 5 6 7 8 |
public $validate = array( 'log_id' => array( 'rule3' => array( 'rule' => 'isUniqueLogId', 'message' => 'この値は既に登録されています' ), ) ); |
これなら結構好き勝手にチェックできるね。
Cake組み込みのemailバリデーションが何でも弾くので独自設定に変える
emailルールを使うとなんでもかんでも弾かれてしまった。
lib/Cake/Utility/Validation.phpのソースを見る限り、下記の用に正規表現パターンと入力値をpreg_matchしているだけなのだが、マッチしてくれない。
1 2 3 4 5 6 |
<?php // cakeのemail-validation $regex = "/^[\p{L}0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[\p{L}0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[_\p{L}0-9][-_\p{L}0-9]*\.)*(?:[\p{L}0-9][-\p{L}0-9]{0,62})\.(?:(?:[a-z]{2}\.)?[a-z]{2,})$/ui"; $check = 'test@test.jp'; var_dump( preg_match($regex, $check)); |
これphp5.4環境で実施したらint(1)が帰ってきました。
だめだったのはphp5.2.13環境。(全体的に結構古い)
ちなみにcakeは2.6.12。対応バージョンではあるはずなのだけど….
でも動かないのは事実なので、独自バリデーションに変更する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#model /** * check_email */ public function check_email($data){ $check = array_pop($data); $regex = '/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/ui'; if(preg_match($regex, $check)){ return true; }else{ return false; } } |
こんな感じでまあいいかな。
正規表現は下記サイトから拝借しました。
正規表現:メールアドレスかどうか調べる – phpspot
Seccurityコンポーネントの利用
CSRF対策として外部サイトとか、想定してないアクションからのPOSTを拒否する。
参考サイト:CakePHP Security コンポーネントのまとめ | Sun Limited Mt.
フォームはすでにある前提。
①コントローラーでSecurityコンポーネントを読む。
②beforeFilterでpostを拒否するアクションを設定
③該当のviewのフォーム部分にトークン生成用のhiddenコードを埋め込む。⇒cake2.6ではviewに埋め込まなくても問題ない模様。
加えてメモ。こっちが良いかも。
●ワンタイムトークンの代わりにセッション単位のトークンを利用
1 2 3 4 5 |
public $components = array( 'Security' => array( 'csrfUseOnce' => false ) ); |
トランザクション設定
・mysqlのストレージエンジンの変更
InnnoDBであればよし。DBレベルでテーブルレベルでストレージエンジン変更も可能。
・コード
Cake2.6だとこんな感じ
http://book.cakephp.org/2.0/ja/models/transactions.html
ここでは、複数のデータ登録時に一つでもvalidateエラーがあったら全部rollbackするタイプ。
# 実際のModel
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$ds = $this->getDataSource(); $ds->begin(); try{ $error = true; foreach($records AS $record){ $data = array( "log_id" => $record[0] , ); // バリデート・登録 $this->create(); if($this->save($data, true) === false){ var_dump($this->validationErrors); $error = false; } } if($error === false){ $ds->rollback(); }else{ $ds->commit(); } }catch(Exception $e){ // input errorでroolback $ds->rollback(); var_dump($e); } |
フォームヘルパー周り
- デフォルトのdivとかlabelをフォームで共通でオフにすることができる。inputDefaults
123456789101112echo $this->Form->create('form_name',array('type' =>'get','action' =>'index','inputDefaults' => array('div' => false,'label' => false,'error' => false,'required' => false,)));
- radioは 「$this->Form->input」 でtype=>’radio’としてもだめ。$this->Form->radio()で出力。
- radioボタンを$this->Form->radio()で、オプションに複数渡すと、横に並んで、とかうまく整形されない場合が。
1行ずつ吐き出す場合は、$this->Form->radio(“フィールド名”,$options,$attributes)のフィールド名を共通にしたものを、必要数分書いてあげればよい。
paginateのsortキー等の手動でのとり方
便利なpaginator。$this->Paginator->sort()で項目名を指定すると、その項目でソートできる。
で、ちょっとその値を使いたいシーンがありどこから取得できるのかを確認。
Controllerないで、$this->request[‘named’][‘sort’]にありました。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
["params"]=> array(5) { ["plugin"]=> NULL ["controller"]=> string(13) "コントローラー名" ["action"]=> string(5) "アクション名" ["named"]=> array(2) { ["sort"]=> string(6) "ソートキー" ★ ["direction"]=> string(3) "ソートオーダー"★ } ["pass"]=> array(0) { } } |
Modelメソッドの中でアクセスするdbを変更する
1回の処理でアクセスするdbは一つじゃないよなぁ….
設計が悪いのかなぁ。でもときたまやるのでメモ。
1 2 3 4 5 6 |
$cur_db = $this->useTable; //現在のテーブル名 $this->setSource('変更後テーブル名'); //変更 //変更後処理 $this->setSource($cur_db); //戻す(戻さないと以後の処理も上記変更が有効になるので) |
[エラー]joinを使ったとき、Undefined offset: 0 [CORE/Cake/Model/Datasource/DboSource.php, line 1918]が出る。(2.6.10)
こんな感じでjoinしようとした時に上記エラーが出る。
1 2 3 4 5 6 7 8 9 10 11 12 |
$options = array( 'fields' => array('id', 'b.name') , 'conditions' => '', // 結合条件 'joins' => array( 'type' => 'LEFT JOIN', //INNER JOINとか 'table' => 'member_info', 'alias' => 'b', 'conditions' => 'ON a.id = b.user_id', //idとuser_idでjoin ), ); |
ライブラリを編集するのはいやだけど、なくてよさそうなコードなので、ここをコメントアウト。
1 2 3 4 5 6 7 8 |
1915 if (!empty($query['joins'])) { 1916 $count = count($query['joins']); 1917 for ($i = 0; $i < $count; $i++) { 1918 if (is_array($query['joins'][$i])) { 1919 $query['joins'][$i] = $this->buildJoinStatement($query['joins'][$i]); 1920 } 1921 } 1922 } |
エラーは出ないし、joinも問題なしっと。
queryでプレースホルダーを利用する
意外と知られていない? queryメソッドで値をbindできるってこと – cakephperの日記(CakePHP, Laravel, PHP)
1 2 |
$sql = "SELECT `Post`.`id` FROM `posts` AS `Post` WHERE `Post`.`id` = ? LIMIT ?"; $this-<span class="synError">></span>Model-<span class="synError">></span>query($sql, array(100,1)); |
findの結果の整形(モデル名の削除)
普通にfindすると 結果の1列分ごとに[‘モデル名’]があって、その下に値が入る。
モデル名がソース中に増えるのが気になるので結果に以下の処理をかませる
1 2 3 4 5 6 7 8 9 |
/* result結果の配列から「モデル名」の階層を削除する。 */ private function _format_find_result($arr_find_result){ $arr_result = array(); foreach( $arr_find_result AS $row){ $arr_result[] = $row[$this->name]; } return $arr_result; } |
さらに、
AppModelにおく場合は$this->nameがよろしくないので下記のように。
1 2 3 4 5 6 7 8 9 10 11 |
# app_model protected function _format_find_result_delete_modelname($arr_find_result, $model_name){ $arr_result = array(); foreach( $arr_find_result AS $row){ $arr_result[] = $row[$model_name]; } return $arr_result; } # 利用側モデル $result = $this->_format_find_result_delete_modelname($result, $this->name); |
JOINとかすると、1列ごとの[‘モデル名’]がテーブル数分追加される。
foreachしづらいので、以下の処理をかませる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/* joinして複数テーブルからの取得情報が、別配列になって帰ってくるので、 * 1配列に整形。 */ private function _format_result_join($arr_result){ $arr_merge = array(); foreach( $arr_result AS $row ){ $arr_tmp = array(); foreach($row AS $tbl){ //1配列に結合 $arr_tmp += $tbl; } $arr_merge[] = $arr_tmp; } return $arr_merge; } |
SQLの関数を使ったときのフィールド名まわり(virtual page fields)
SQLの関数sumとか使うと、findの結果がrow[‘モデル名’]の要素配下に入ってこない。
となりに別要素があって、そこに入って、foreachしづらい。
先の複数配列要素をマージする処理をかけてもよいし、
Cakeが用意しているバーチャルページフィールドを指定しても良い。
例) モデルで、
1 2 3 4 5 |
public $virtualFields = array( 'sum_value' => 'sum(value)', 'count' => 'count(*)', ); |
という風に指定すると、findのfield指定をキーのほうで指定でき、
結果もその名前でかえってくる。
GETリクエストのフォームで値を引き継ぐ
入力値をフォームに再表示させたい場合(エラーとか、次画面表示のときとか)、
Formヘルパーを使ったPOSTだと、勝手にやってくれるが、GETだとだめ。
$this->request->dataに連想配列をぶち込んであげる必要がある。
1 2 3 |
$query = $this->request->query; $this->request->data['モデル名'] = $query; |
ちなみに、これで、Modelで定義するvalidateも効かせられる。
Formヘルパーのセレクトで値を引き継げない
上の絡みでちょっとはまり。
1 2 3 4 5 6 7 8 |
echo $this->Form->input('モデル名.name', array( 'type' => 'select', 'options' => $list, //'selected' => '', 'class' => 'form-control', 'required' => 'required', )); |
上記のselectedを”にしていたことにより、デフォルト値が空白と解釈されて、一番上の要素が常に選択されてしまっていた。
不要な要素はちゃんと消すか、コメントしよう。
ということ。
users以外のモデルで認証する。特に管理系
以下参考リンク
CakePHP2系でUserモデル以外を利用して認証する方法 | 株式会社LIG
[CakePHP]adminルーティングの時だけAuth認証を行う | HappyQuality
メール送信 Emailの利用サンプル
設定ファイル:Config/email.php
1 2 3 4 5 6 7 8 9 10 |
public $ask = array( 'transport' => 'Mail', 'from' => 'noreply@example.jp', 'to' => array('to@example.jp'),//(送信先固定部分だけ記載、動的な部分は処理で追加。) 'subject' => 'タイトル', 'sendAs' => 'text', 'template' => 'template', // View/Emails/配下のctpファイル名 'charset' => 'utf-8', 'headerCharset' => 'utf-8', ); |
パスワードが必要だったり、外部のsmtpサーバーを使ったりする場合は、設定追加が必要。
テンプレート: View/Emails/template.ctp(レイアウト:/View/Layouts/Emails/text)
1 2 |
ご入力内容は下記でよがすか? <?php echo $data['name']; ?> //Controllerから通常のViewに渡すのと同じ。 |
コントローラー
1 2 3 4 5 6 7 8 9 10 11 |
//メール送信処理 $email = new CakeEmail(); $email->config('ask'); //Config/email.phpで設定した変数名 // return-path設定 START $config['additionalParameters'] = '-f '.RETUNR_PATH;//Return_PATHはちょっと特殊 $email->transportClass()->config($config); // 宛先追加をする場合 $email->addTo('exmaple@example.jp'); $email->viewVars(array('data' => $this->data[$this->model])); //mailviewに渡す値のセット。 $email->send(); //送信実行 |
以上。
検索結果の配列にモデル名が入る問題
シンプルな検索をしたときにはすごいこれが邪魔。
いちいちモデル名を指定して結果セットしなおすのがいや。
モデル名を作りに依存しないようにするために、Modelから結果配列名に利用される値を取得する場合は下記のクラス変数を参照する。
$this->alias
$result[$this->alias]
共通設定ファイルの作成
http://ameblo.jp/itboy/entry-11407741622.html
Config配下に任意の名前でファイルを作成
設定を書いて
1 |
$config["Dir"] = "/path/to/your/app/" |
bootstrapでロードして
1 |
Configure::load("ファイル名"); |
各プログラムで呼び出す。
1 |
$dir = Configure::read("Dir"); |
コントローラー用、モデル用と沸ける場合は、各クラス、親クラスなどでロードすればよい。はず。
Authコンポーネントで使うハッシュ値の作成
コントローラー中などで
1 |
AuthComponent::password('パスワード値') |
とすれば、値をハッシュ値に変換できる。
ログインできないときのチェックや、処理の流れ上、パスワード値を手動でハッシュ化したいときに使える。
dateフォーマットの入力チェック
http://qiita.com/asahina_dev/items/9480d5be71ffeb0473ea
①クッキータイムアウト・セッションタイムアウト
(セッションのガーベジコレクション設定、cookieのautoregenerate設定)
http://artisanedge.jp/blog/2012/11/21/223145.html
セッションのtimeout値を0にすると一切保存されなくなるので、だめ。
③セッションセキュア属性
④HTTPオンリー属性(js不可)
Authコンポーネントの論理削除フラグの利用
認証にUserモデル
論理削除フラグ項目として、delete_flgを使っている場合
●1系
1 |
<?php $this->Auth->userScope = array('User.delete_flg' => 0); ?> |
参考:http://coban.jp/2010/12/05/cakephpauth%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E3%81%A8%E5%89%8A%E9%99%A4%E3%83%95%E3%83%A9%E3%82%B0/
●2系
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php var $components = array( 'Auth' => array( 'authenticate' => array( 'Form' => array( // 認証されるには、「Userのstatusが0である必要がある」を追加する 'scope' => array( 'User.delete_flg' => 0) ) ) ), ); ?> |
参考:http://kwski.net/cakephp-2-x/1112/
フォームヘルパーでの複数選択可能チェックボックスの実装について
フォームヘルパーでチェックボックスを作成する場合の注意。
①ひとつのチェックボックスを作るなら下記。
1 2 3 4 |
echo $this->Form->input( '名前', array( 'type' => 'checkbox', 'label' => 'ラベル', // チェックボックスのラベル )); |
②複数選択可能なチェックボックスを作成する場合は下記。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php $opt = array( "1" => "val1", "2" => "val2", "3" => "val3", ); $i =0; echo $this->Form->input( '要素名', array( 'type' => 'select', 'multiple'=> 'checkbox', 'options' => $opt, )); |
③複数出力でかつHTMLを工夫したい場合は、上記だと調整が難しい。うまくいくのかも知れないけど。。
なので、一つ一つのチェックボックスをヘルパーで作成し、idを分けて、nameを共通化。
さらに、nameの最後に”[]”を足してあげることで、配列としてデータを受け取れるようにする。
コードで書くとこんな感じ。同じ場所に連続で出すならforeachでよいし、バラバラとだすなら。foreach方式ではないほうが良い。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/*chkbox*/ <ul> <?php $opt = array( "1" => "val1", "2" => "val2", "3" => "val3", ); $i =0; ?> <?php foreach ($opt AS $key => $value): ?> <?php $i++;?> <li> <?php echo $this->Form->input('chkbox_sample', array( 'type' => 'checkbox', 'id' => "chkbox_sample$i", //ID 'value' => $key, 'name' => "data[モデル名][chkbox_sample][]", //末尾の[]が肝 )); ?> <label><?php echo $value; ?></label> </li> <?php endforeach;?> </ul> |
ちなみにdivとかlabelでcreate時にoffしていることが多い。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php //form作成、もろもろdefault off 設定 echo $this->Form->create('XXXXXXX', array( 'type' =>'post', / 'action' =>'index', 'inputDefaults' => array( 'div' => false, 'label' => false, 'error' => false, 'required' => false, ) ) ); ?> |
確認画面の作成
cakeは基本の構造だと、フォームの構造の場合確認画面が無い。
確認画面では、postされた値を引き継がなきゃいけないので、その方法。
一番定番は確認画面のhiddenに持たせること。
シンプルなものは下記でOK
1 2 3 4 5 6 7 8 |
/* form create 省略*/ $model = "XXXXXX"; foreach ($this->request->data[$model] as $name => $val) { echo $this->Form->hidden($name, array('value' => $val)); } /* form end 省略*/ |
複数選択可能のチェックボックスなど、データが配列として渡されるものがある場合は、
その点を考慮しないといけないので、下記のような感じ。
配列が1次元配列限定なので、場合によっては変更必要。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php $model = "Campaign"; foreach ($this->request->data[$model] as $name => $val) { if(is_array($val) ) { //valueが配列形式の場合 foreach($val AS $ch_key => $ch_val){ echo $this->Form->hidden($name, array( 'value' => $ch_val, 'id' => $name.$ch_key, 'name' => "data[$model][$name][]" )); } }else{ //シンプルな方と同じ echo $this->Form->hidden($name, array('value' => $val)); } } ?> |
あと、確認画面を挟んだ場合は、バリデーションは完了画面でも必要よっとね。
確認画面入れるだけで、だいぶ工数増える印象。。
formヘルパーでradioやselectのoptionに任意のHTMLを入れる。
フォントアイコンとかを表示するときに、テキストの直前にHTMLを入れたい。とかそんな場合。
素直に表示側の値にHTMLをぶち込んであげればよい。
1 2 3 4 5 6 7 8 9 10 |
<?php echo $this->Form->input('Regist.sex', array( 'type' => 'radio', 'options' => array( 'female' => '<i clas="fa fa-female"></i>女性', 'male' => '<i clas="fa fa-male"></i>男性', ), 'legend' => false, )); ?> |
こんな感じ。無理やり感がでるなぁ。。
関連記事
-
-
CakePHP コントローラー内でフォーム・モデル名を取得して、ソースをすっきりしたい
こんな感じで自分で設定しちゃうけどいいのかな? こうしないと、ちょっとデフォルト …
-
-
【Cake】一般用テーブルと、管理用テーブルを分ける場合のログイン(Auth)の使い方・整理
まず1つサービス・ログイン機能 これは ①Userテーブル、UserModel、 …
-
-
[Cake]CakePHPで意識の低いトランザクション commit rollback
cakeで複数のテーブルにまたがったトランザクション管理をしたい。 …
-
-
CakePHPでjoinしようとしたときのエラー 【Notice (8): Undefined offset: 0 [CORE/Cake/Model/Datasource/DboSource.php, line 1714]】
Cakeでfind()からjoinしようとしたときに下記Noticeが出て、検索 …