AuthComponentでセッション切れが発生する

CakePHPのアプリケーションでAuthコンポーネントを利用して認証システムを作っていると時々セッション切れになってログイン画面に誘導されることがある。
こづかいつけーる for WebではOpenIDによる認証システムを使っていることもあるのかなぜかしらセッション切れが多いと感じていたところ、スパイスラボのブログにて有益な情報を発見した。
Security.level が high のときに起きるいろいろなことということで事例が紹介がされており、なかでもリダイレクトが書き換えられるというところが気になった。実際、こづかいつけーる for Webでのcore.phpのSecurity.levelがhighになっていたところ、mediumにしたらセッション切れは起こらなくなった。
おそらくセッションの保持範囲が設定レベルに応じて変わってくるところがポイントになっていると考えられる。

複数の入力項目をチェックする

モデルに実装するバリデーションの例には、メールアドレスを2回入力して、一致しているかどうかを比較したりするような複数の入力項目をチェックする例が残念ながら記載されていない。
モデルの中で何とかやってみた例なので、クレバーな方法ではないかもしれないが、DBへデータを登録する前のチェックをコントローラーで実装しようとすると面倒なので、困っている方がいらっしゃれば参考にしていただきたいと思う。
var $validate = array(
 ’mailaddrss1′ => array(
  ’rule’ => array(‘checkAddrss’),
  ’message’ => ‘メールアドレス1とメールアドレス2の入力内容が異なります’,
 ),
);
//$dataはmailaddress1の内容がセットされる
function checkAddrss($data){
 $check_data= $this->data;
 return $data != $check_data[‘ModelName’][‘mailaddress2’];
}

debugレベルに応じてエラー表示が変わってしまう

app/config/core.phpの
Configure::write(‘debug’, N);
のN=0とN>0では、コントローラーもしくはアクションなどが存在しない場合に表示されるエラーメッセージが変わってしまう。
具体的には、N>0ならば、app/views/missing_controller.ctp、app/views/missing_action.ctpが呼ばれるのに対して、N=0ならば、app/views/error404.ctpが呼ばれる仕組みだ。
これは、cake/libs/error.phpの110行目あたりにある
if ($method !== ‘error’) {
 if (Configure::read() == 0) {
  $method = ‘error404’;
  if (isset($code) && $code == 500) {
   $method = ‘error500’;
  }
 }
}
によるものである。
debugレベルを0にしてリリースする場合には、意図したエラーメッセージが出るか確認したほうがよさそうだ。

CakePHPで作成したアプリケーション

CakePHPで作成したWebアプリケーション「こづかいつけーる for Web」をリリースしました。
アカウントの作成が不要で、mixi、Yahoo、Googleのアカウントがあればすぐ利用ができる家計簿サービスです。
CakePHPと携帯ライブラリ「lib3gk」&CakePHP1.2用ヘルパー/コンポーネントのおかげでコーディング量を大幅に減らすことができました。

flushをするとメッセージの後に1が出力される

iphloxの情報整理ノートに対処方法が紹介されている。今回の対処の方法に従い、
cake/libs/view/helpers/session.phpをapp/view/helpers/session.phpにコピーし、
echo($out);
parent::del(‘Message.’ . $key);
return true;

//echo($out);
parent::del(‘Message.’ . $key);
//return true;
return $out;
とすると表示されなくなる。不具合なのかどうかはまた別の機会に検証してみたい。

携帯に対応させる

cakePHPで作成したサイトを携帯に対応させるためには、文字コードの問題に対応していかなければならないし、また、デフォルトのレイアウトも変更する必要ある。
CakePHPクッキングのページに有用な情報が掲載されていたので紹介したい。
CakePHPガイドブックでは、ヘルパーを使って対応していたが、うまくいかなかったので、紹介されている情報のようにappControllerで対応するとうまくいった。バージョンが1.1から1.2になって実装が一部異なっていることが原因だろうと思う。
cakePHPでPCと携帯で出力文字コードを変更する方法は1.1対応のサイトになっているが、入力データの文字変換の点は参考になる。1.2では次の通りとなる。
function beforeFilter(){
 if (isset($this->params[‘prefix’]) && $this->params[‘prefix’] == ‘mobile’){
  if (!empty($this->data)){
   mb_convert_variables(‘UTF-8’, ‘Shift_JIS’, $this->data);
  }
 }
}
※ソースコードのスペースは全角スペースになっています。

tagErrorMsgに相当するバリデーション

cakePHP 1.1ではバリデーションの結果に対するエラーメッセージをhtmlヘルパーのtagErrorMsgメソッドにて場所を指定することができた。
cakePHP 1.2ではtagErrorMsgメソッドが利用できなくなっている代わりに、formヘルパーのerrorメソッドを利用して、エラー出力場所を定義できるようになった。ただし、inputメソッドの場所にデフォルトで出力されるため、errorメソッドでエラーを出力する場合には、メッセージを抑止するようにしなければならない。
詳しくは、CakePHP 1.2 Form ヘルパーで input タグとエラーメッセージを別々に表示する方法に詳しいので、参照してみてください。

ajaxのAutoCompleteを実現する

とりぷる ぷぅさんのサイトが参考になりましたので、紹介しておきます。
cakePHPだとさほどコードを書かなくてもオートコンプリートが割と簡単に実現できるのがすごいですね。
それにしてもAjaxのヘルパーに関する情報やバリデーションに関する情報がまだまだ少ないように感じるのは気のせいでしょうか??このブログでどんどん有用なサイトをご紹介していきたいと思います。

CakePHPガイドブック

cakePHPの少ない書籍のうちの一つです。基本的な部分から押さえていきたい場合には、お勧めの一冊になると思います。cakephp.jpg