「php」カテゴリーアーカイブ

CakePHP3 DateTimeの使い方

毎回忘れるので備忘録

CakePHP3でDateTimeを使用する場合は、namespaceの関係で
エラーとなる。なので、以下のように書くと良い。
例:UTCからJSTへの変換サンプル

CakePHP3 バリデーション以外でのエラーをバリデーションエラーに追加する方法

CakePHP3では、バリデーションエラーは以下のように取得する。
$entity = $tableObject->newEntity($request)
// バリデーションエラーの中身確認
$errors = $entity->errors();

この時に、バリデーションで対応していないエラーを
バリデーションエラーに含めたい場合がある。
その場合、以下のようにすると良い。

// バリデーション以外でのエラー追加
$entity->errors(‘エラーを出したい画面項目名’, ‘エラーメッセージ’);

cakphp2.0でhelperからcomponentを使いたい場合

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変数に格納して置くと
何度もインスタンス化しなくて良い。

CakePHP 例外処理

主に致命的なエラーのときなどに、正常処理とは異なるページで
表示したい場合

//コントローラなどで例外ページ呼び出し処理を行う。
$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()));
}

cakePHP ロギング

「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

CakePHP FormHelper(フォームヘルパー) errorメソッド

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文字化け

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