For Want Of A Better Word

【Cake】CakePHP_開発はじめる前に_いつも調べなおすことまとめ

      2017/07/06

Contents

参考リンク集

CakePHP 2.x – ユーザ登録(仮登録・メール・本登録)
【CakePHP】モデルでテーブル名を指定する | CakePHP雑記帳
CakePHP2.x Formヘルパーコピペ用-ITかあさん
CakePHP1.2の.ctpファイルでシンタックスを有効にする.vimrc – めも帖

CakePHP 2.x – コントローラ内でバリデーション処理を呼び出す

set flashのcssクラスを変更する

CakePHP setFlashで出力されるメッセージのスタイルを変える方法

ファイルアップロードサンプル

 

 

CSV→配列にパース

cakeというかphpの話。str_getcsvで囲い文字もOK

バリデーションの設定

view

 

 

ちょっと名前を間違えるととたんに動かないので、ムカムカするときも。

 

 

モデルでのバリデーション

・validationのみ実行

・saveで実行

 

バリデーションとsaveの切り離し

 

CakePHP 2.x – コントローラ内でバリデーション処理を呼び出す

 

validation結果メッセージの取得

validatesやsaveがfalseの場合に、下記変数を参照する。
$this->validationErrors

validateルールの設定(一つの項目に複数の設定例)

 

任意の箇所にvalidateエラーをはく。そのメッセージにclassを追加する。

 

validateのlastについて

デフォルトでは、複数のvalidate項目がある場合、全てのvalidateを実行し、
最後にエラーとなったもののメッセージを返却する。
last => trueとすると、その項目でvalidationが止まる。

validateは一つが帰れば問題ないと思うので、基本はデフォルトでlast項目設定せずで良いかな。
全部を表示したい場合は、1項目に1項目ルールをセットするように、複数のvalidation変数を用意して、
順次実行して結果を蓄積していくことになる。

独自バリデーション

http://www.tailtension.com/cakephp/807/
□チェック用関数の作成

ってな感じでチェック用のfunctionを用意して、

 

ってな感じでruleに該当function名を渡す。
するとfunctionには該当項目値が$dataとして引き渡される。
$dataに複数渡したい時は

public function originall_validate($data、$limit){…

‘rule’ => array(‘originall_validate’, 10);
とかしてあげればよい。

他のフィールドの値を取得したい場合は、「$this->data」でリクエストの中身が取得できる。

 

データの重複チェックについて

isUniqueという組み込みvalidationルールがあるので、それを利用。
→やっぱりきかねぇ!!というわけで、↓

validation:手動での重複チェック作成(項目log_id)

●チェック用関数

 

●validate設定例

 

これなら結構好き勝手にチェックできるね。

 

Cake組み込みのemailバリデーションが何でも弾くので独自設定に変える

emailルールを使うとなんでもかんでも弾かれてしまった。

lib/Cake/Utility/Validation.phpのソースを見る限り、下記の用に正規表現パターンと入力値をpreg_matchしているだけなのだが、マッチしてくれない。

 

これphp5.4環境で実施したらint(1)が帰ってきました。

だめだったのはphp5.2.13環境。(全体的に結構古い)

ちなみにcakeは2.6.12。対応バージョンではあるはずなのだけど….

でも動かないのは事実なので、独自バリデーションに変更する。

 

こんな感じでまあいいかな。

正規表現は下記サイトから拝借しました。
正規表現:メールアドレスかどうか調べる – phpspot

 

Seccurityコンポーネントの利用

CSRF対策として外部サイトとか、想定してないアクションからのPOSTを拒否する。

参考サイト:CakePHP Security コンポーネントのまとめ | Sun Limited Mt.

 

フォームはすでにある前提。

①コントローラーでSecurityコンポーネントを読む。

②beforeFilterでpostを拒否するアクションを設定

該当のviewのフォーム部分にトークン生成用のhiddenコードを埋め込む。⇒cake2.6ではviewに埋め込まなくても問題ない模様。

加えてメモ。こっちが良いかも。

●ワンタイムトークンの代わりにセッション単位のトークンを利用

 

トランザクション設定

・mysqlのストレージエンジンの変更
InnnoDBであればよし。DBレベルでテーブルレベルでストレージエンジン変更も可能。

・コード
Cake2.6だとこんな感じ
http://book.cakephp.org/2.0/ja/models/transactions.html
ここでは、複数のデータ登録時に一つでもvalidateエラーがあったら全部rollbackするタイプ。

# 実際のModel

 

フォームヘルパー周り

  • デフォルトのdivとかlabelをフォームで共通でオフにすることができる。inputDefaults

     
  • 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’]にありました。。

Modelメソッドの中でアクセスするdbを変更する

1回の処理でアクセスするdbは一つじゃないよなぁ….

設計が悪いのかなぁ。でもときたまやるのでメモ。

 

[エラー]joinを使ったとき、Undefined offset: 0 [CORE/Cake/Model/Datasource/DboSource.php, line 1918]が出る。(2.6.10)

こんな感じでjoinしようとした時に上記エラーが出る。

 

ライブラリを編集するのはいやだけど、なくてよさそうなコードなので、ここをコメントアウト。

エラーは出ないし、joinも問題なしっと。

 

queryでプレースホルダーを利用する

意外と知られていない? queryメソッドで値をbindできるってこと – cakephperの日記(CakePHP, Laravel, PHP)

 

findの結果の整形(モデル名の削除)

普通にfindすると 結果の1列分ごとに[‘モデル名’]があって、その下に値が入る。

モデル名がソース中に増えるのが気になるので結果に以下の処理をかませる

さらに、

AppModelにおく場合は$this->nameがよろしくないので下記のように。

 

 

 

JOINとかすると、1列ごとの[‘モデル名’]がテーブル数分追加される。

foreachしづらいので、以下の処理をかませる。

 

SQLの関数を使ったときのフィールド名まわり(virtual page fields)

SQLの関数sumとか使うと、findの結果がrow[‘モデル名’]の要素配下に入ってこない。

となりに別要素があって、そこに入って、foreachしづらい。

先の複数配列要素をマージする処理をかけてもよいし、

Cakeが用意しているバーチャルページフィールドを指定しても良い。

 

例) モデルで、

という風に指定すると、findのfield指定をキーのほうで指定でき、

結果もその名前でかえってくる。

 

GETリクエストのフォームで値を引き継ぐ

入力値をフォームに再表示させたい場合(エラーとか、次画面表示のときとか)、

Formヘルパーを使ったPOSTだと、勝手にやってくれるが、GETだとだめ。

$this->request->dataに連想配列をぶち込んであげる必要がある。

 

 

ちなみに、これで、Modelで定義するvalidateも効かせられる。

 

Formヘルパーのセレクトで値を引き継げない

上の絡みでちょっとはまり。

 

上記のselectedを”にしていたことにより、デフォルト値が空白と解釈されて、一番上の要素が常に選択されてしまっていた。

不要な要素はちゃんと消すか、コメントしよう。

ということ。

 

users以外のモデルで認証する。特に管理系

以下参考リンク
CakePHP2系でUserモデル以外を利用して認証する方法 | 株式会社LIG

[CakePHP]adminルーティングの時だけAuth認証を行う | HappyQuality

 

メール送信 Emailの利用サンプル

設定ファイル:Config/email.php

パスワードが必要だったり、外部のsmtpサーバーを使ったりする場合は、設定追加が必要。

 

テンプレート: View/Emails/template.ctp(レイアウト:/View/Layouts/Emails/text)

 

コントローラー

以上。

 

検索結果の配列にモデル名が入る問題

 

シンプルな検索をしたときにはすごいこれが邪魔。

いちいちモデル名を指定して結果セットしなおすのがいや。

モデル名を作りに依存しないようにするために、Modelから結果配列名に利用される値を取得する場合は下記のクラス変数を参照する。

$this->alias

$result[$this->alias]

 

共通設定ファイルの作成

http://ameblo.jp/itboy/entry-11407741622.html

Config配下に任意の名前でファイルを作成

設定を書いて

 

bootstrapでロードして

 

各プログラムで呼び出す。

 

コントローラー用、モデル用と沸ける場合は、各クラス、親クラスなどでロードすればよい。はず。

 

 

Authコンポーネントで使うハッシュ値の作成

 

コントローラー中などで

 

とすれば、値をハッシュ値に変換できる。

ログインできないときのチェックや、処理の流れ上、パスワード値を手動でハッシュ化したいときに使える。

 

dateフォーマットの入力チェック

http://qiita.com/asahina_dev/items/9480d5be71ffeb0473ea

 

セッション・cookie周りの有効期限等設定

①クッキータイムアウト・セッションタイムアウト

CakePHPでセッションとクッキーの有効期限を設定する

(セッションのガーベジコレクション設定、cookieのautoregenerate設定)
http://artisanedge.jp/blog/2012/11/21/223145.html
セッションのtimeout値を0にすると一切保存されなくなるので、だめ。

③セッションセキュア属性

④HTTPオンリー属性(js不可)

 

 

Authコンポーネントの論理削除フラグの利用

認証にUserモデル

論理削除フラグ項目として、delete_flgを使っている場合

●1系

 

参考: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系

参考:http://kwski.net/cakephp-2-x/1112/

フォームヘルパーでの複数選択可能チェックボックスの実装について

フォームヘルパーでチェックボックスを作成する場合の注意。

①ひとつのチェックボックスを作るなら下記。

 

②複数選択可能なチェックボックスを作成する場合は下記。

 

③複数出力でかつHTMLを工夫したい場合は、上記だと調整が難しい。うまくいくのかも知れないけど。。

なので、一つ一つのチェックボックスをヘルパーで作成し、idを分けて、nameを共通化。

さらに、nameの最後に”[]”を足してあげることで、配列としてデータを受け取れるようにする。

コードで書くとこんな感じ。同じ場所に連続で出すならforeachでよいし、バラバラとだすなら。foreach方式ではないほうが良い。

 

 

ちなみにdivとかlabelでcreate時にoffしていることが多い。

 

 

 

確認画面の作成

cakeは基本の構造だと、フォームの構造の場合確認画面が無い。

確認画面では、postされた値を引き継がなきゃいけないので、その方法。

一番定番は確認画面のhiddenに持たせること。

シンプルなものは下記でOK

 

 

複数選択可能のチェックボックスなど、データが配列として渡されるものがある場合は、

その点を考慮しないといけないので、下記のような感じ。

配列が1次元配列限定なので、場合によっては変更必要。

あと、確認画面を挟んだ場合は、バリデーションは完了画面でも必要よっとね。

確認画面入れるだけで、だいぶ工数増える印象。。

 

formヘルパーでradioやselectのoptionに任意のHTMLを入れる。

フォントアイコンとかを表示するときに、テキストの直前にHTMLを入れたい。とかそんな場合。

素直に表示側の値にHTMLをぶち込んであげればよい。

 

こんな感じ。無理やり感がでるなぁ。。

 

 

 

 

 

 

 - cake

  関連記事

CakePHPでjoinしようとしたときのエラー 【Notice (8): Undefined offset: 0 [CORE/Cake/Model/Datasource/DboSource.php, line 1714]】

Cakeでfind()からjoinしようとしたときに下記Noticeが出て、検索 …

[Cake]CakePHPで意識の低いトランザクション commit rollback

cakeで複数のテーブルにまたがったトランザクション管理をしたい。   …

【Cake】一般用テーブルと、管理用テーブルを分ける場合のログイン(Auth)の使い方・整理

まず1つサービス・ログイン機能 これは ①Userテーブル、UserModel、 …

CakePHP コントローラー内でフォーム・モデル名を取得して、ソースをすっきりしたい

こんな感じで自分で設定しちゃうけどいいのかな? こうしないと、ちょっとデフォルト …