CakePHP3では、バリデーションエラーは以下のように取得する。
$entity = $tableObject->newEntity($request)
// バリデーションエラーの中身確認
$errors = $entity->errors();
この時に、バリデーションで対応していないエラーを
バリデーションエラーに含めたい場合がある。
その場合、以下のようにすると良い。
// バリデーション以外でのエラー追加
$entity->errors(‘エラーを出したい画面項目名’, ‘エラーメッセージ’);
MVC全てで同じ共通クラスなど使いたい場合に
venderに置くのがセオリーなのかよく分からない。
helperからcomponentのメソッドを使いたい場合がある。
//インスタンス変数として定義
private dateUtil = null;
/**
* helperでDateUtilComponentを使用する。
*
*/
public function getWeekNum($y, $m, $d) {
if ($this->dateUtil == null) {
//コンポーネントを読み込む
App::uses('DateUtilComponent', 'Controller/Component');
//インスタンス化する
$this->dateUtil = new DateUtilComponent(new ComponentCollection());
}
return $this->dateUtil->getWeekNum($y, $m, $d);
}
App::usesで使用したいコンポーネントを読み込む。
new XXXComponent でインスタンス化する。
Componentクラスはコンストラクタの引数として、下記のように
ComponentCollectionを渡してあげないといけないので、
new ComponentCollection()を渡してあげる。
public function __construct(ComponentCollection $collection, $settings = array()) {
あとはhelperのprivate変数に格納して置くと
何度もインスタンス化しなくて良い。
cakephp2.0でセッションの保存先をデーターベースにする場合
core.phpを次のようにする。
//初期設定をコメントするか、そのまま変更
// Configure::write('Session', array(
// 'defaults' => 'php'
// ));
Configure::write('Session', array(
'defaults' => 'database',
'handler' => array(
'model' => 'テーブル名',
)
));
参考サイト
どこででも使えるようにするためにAppController内に定義しておく。
cake\libs\controller\app_controller.php
class AppController extends Controller {
//ヘルパーの設定
var $helpers = array(‘Ajax’,’Javascript’);
}
主に致命的なエラーのときなどに、正常処理とは異なるページで
表示したい場合
//コントローラなどで例外ページ呼び出し処理を行う。
$this->cakeError(“error”, array(‘msg’=>’エラーメッセージ’));
——————————————————————-
■エラーハンドハンドラ作成
/app/app_error.phpを作成する
class AppError extends ErrorHandler {
function error($params) {
//呼び出されたのが配列のキー[msg]に入ってくる
$this->controller->set(‘msg’, $params[‘msg’]);
//error.ctpを使用する
$this->_outputMessage(‘error’);
}
}
——————————————————————-
■エラーのview作成
/app/views/errors/error.ctpを作成する
<?php
/**
* エラー発生時のとび先
*/
?>
<p>
<strong><?php echo $msg; ?></strong>
</p>
——————————————————————-
JQueryのloadを使用していると(まあ当然だが)
うまくいかなかったので再リクエストで対応した。
エラー発生時に詰める
$this->ErrorHandle->setError(“登録・更新処理で問題が発生しました。”);
以下をリクエスト
function error() {
//例外ページへ
$this->cakeError(“error”, array(‘msg’=>$this->ErrorHandle->getError()));
}
「Object」クラスで定義されている「log()」関数を呼び出すだけで出来る。
$this->log(“出力内容”);
app/tmp/logs/error.log がデフォルトで出力される。
デバッグログが出したければ以下のようにするのみ。
$this->log(‘出力内容’, LOG_DEBUG);
app/tmp/logs/debug.logが出力される。
しかし、ログのローテトとか出来んし、使いものになるんだろうか。
log4phpを導入すべきか、それも使いものになるのかな。
phpは弱点多い。。
参考URL
http://book.cakephp.org/ja/view/157/Logging
404エラーのviewをカスタマイズしたい場合は
/cake/libs/view/errors/error404.ctpを
/app/views/errors/error404.ctpにコピーして変更する。
debugモードは解除しておく事。
core.phpのConfigure::write(‘debug’, 2);をConfigure::write(‘debug’, 0)にする。
Model.fieldのvalidationメッセージに
「DEDICATED TO THE ONE I LOVE」と設定した場合
1.モデルで設定した文字列をタグとスタイル付きで出力
<?php echo $form->error(“Model.field”) ?>
この場合、囲まれる↓
<div class=”error-message”>DEDICATED TO THE ONE I LOVE</div>
2.divタグで囲まず、モデルで設定した文字だけを出したい場合
<?php echo $form->error(“Model.field”, null , array(“wrap”=>false)) ?>
第1引数にエラーが出るフィールド名
第2引数にエラーのときに出したいメッセージ文字列
第3引数は配列でいろいろ指定できる
この場合、そのまま出力↓
DEDICATED TO THE ONE I LOVE
ちなみにfrom.phpは「cake\libs\view\helpers」にある。
mysqlをちゃんと設定してたつもりだったのだが
cakeで画面に表示したデータが文字化けする。
他のDBはすんなりいくのにmysqlけっこう躓く。
・mysqlに直接文字コードutf-8でデータを流し込む
・sshから見ると文字化けしない。
・CSEでも文字化けしない。
・htmlのcharsetの指定はutf-8でおかしくない
・ファイルの文字コードもutf-8で保存している
findAllした直後のデータを見ると化けている。
ここが問題か。
my.cnfを見直す
これが「skip-character-set-client-handshake」抜けていたのか!
my.cnfの[mysqld] セクションに以下を追加
[mysqld]
default-character-set = utf8
character-set-server = utf8
skip-character-set-client-handshake ← 追加
早々にレンタルサーバでも試さないと。
参考サイト
http://wota.jp/ac/?date=20061011
CakePHP の*.ctpファイル(テンプレートファイル)をeclipseで開くと、
デフォルトではテキストエディタで開かれてしまう。
なので関連付けを行うとよい。
ウインドウ(W) – 設定(P) – 一般 – エディタ – ファイルの関連付けの画面で
①ファイルタイプの追加ボタンを押して、*.ctpを追加する
②追加した*.ctpを選択して、関連付けられたエディターの追加ボタンで
PHPエディターを選択追加する。
また、PHPでビルドするために以下のように設定をしておく。
ウインドウ(W) – 設定(P) – 一般 – コンテンツ・タイプ 画面で
テキストツリー中のPHP コンテンツタイプを選択
ファイルの関連付け(F)の追加ボタンより*.ctpを追加する。
If I wasn't hard, I wouldn't be alive. If I couldn't ever be gentle, I wouldn't deserve to be alive.