[CakePHP]SplFileInfo::openFileエラーの対応方法

[CakePHP2.2.3]

CakePHP2.xから、app/tmp/cache/modelsやapp/tmp/cache/persistent内のキャッシュファイルが生成される際に、パーミッションの問題で以下のようなエラーが出ることが多いです。

Warning: SplFileInfo::openFile(/www/app/tmp/cache/persistent/cake_core_cake_console_) [splfileinfo.openfile]: failed to open stream: Permission denied in /www/lib/Cake/Cache/Engine/FileEngine.php on line 292

この問題はファイル所有者とアクセスユーザーが違うので発生しているのですが、umaskを設定することで解決できます。
実際のコードは、core.phpの最下部にあるキャッシュ設定にmaskオプション追加するだけです。

[php]
//app/Config/core.php
Cache::config(‘_cake_core_’, array(
‘engine’ => $engine,
‘prefix’ => $prefix . ‘cake_core_’,
‘path’ => CACHE . ‘persistent’ . DS,
‘serialize’ => ($engine === ‘File’),
‘duration’ => $duration,
‘mask’ => 0666,
));
Cache::config(‘_cake_model_’, array(
‘engine’ => $engine,
‘prefix’ => $prefix . ‘cake_model_’,
‘path’ => CACHE . ‘models’ . DS,
‘serialize’ => ($engine === ‘File’),
‘duration’ => $duration,
‘mask’ => 0666,
));
[/php]

追記:Cache:write();を使う方は、以下のように別途、defaultの設定も追加しておいた方がいいでしょう。bootstrapに以下を追加しておきましょう。

[php]
//app/Config/bootstrap.php
Cache::config(‘default’, array(
‘mask’ => 0666,
));
[/php]

[CakePHP]scripts_for_layoutへのmeta(noindex等)の渡し方

[CakePHP1.3.11, 2.1.3]

CakePHPはコンテンツ部分をレイアウトに埋め込む、いわゆるレイアウトテンプレート型のビューなので、scripts_for_layout変数などを使って、コンテンツ部分からレイアウト部分にページ特有のcssやjsファイルなどを読み込ませることが出来るわけですが、このコンテンツ部分からレイアウトへの渡し方がバージョンによって異なるのでお気をつけ下さい、というエントリです。

1.2〜1.3の場合

※コンテンツ部分のビューファイルです。contacts/index.ctp等

[php]
<?php $html->meta(null, null, array(‘name’ => ‘robots’, ‘content’ => ‘noindex,follow’, ‘inline’ => false));?>
[/php]

2.x〜の場合

[php]
<?php $this->Html->meta(null, null, array(‘name’ => ‘robots’, ‘content’ => ‘noindex,nofollow’), false);?>
[/php]

もちろん、layoutファイルには、<head>タグ内に以下を入れるのをお忘れなく。

[php]
<?=$scripts_for_layout?>
[/php]

[CakePHP]Authで2種類のユーザー認証を設定する方法

[CakePHP1.3.11]

今回は、Webサービスによくよくあるパターンである、サイト管理者向けページと、ユーザーページ(いわゆるマイページというやつ)2つの専用ページを持つサイトにおける、Auth設定方法を書いておきます。対象は、CakePHP1.3ですが、2.xでもほぼ同様のコードで動作します。

なお、この記事では、サイト管理者ページ名を、admin、マイページをmemberとして進めていきます。認証方法は、admin:Basic認証、member:ログイン画面にてメールアドレスとパスワードの認証とします。

まず、config/core.phpの、prefix設定のところを、以下のようにします。

[php]
Configure::write(‘Routing.prefixes’, array(‘admin’, ‘member’));
[/php]

そして、app_controller.phpで以下のように設定します。

[php]
class AppController extends Controller {

var $components = array(‘Session’, ‘Auth’);

function beforeFilter() {

$this->Auth->allow(‘*’);

//Auth Settings
if (!empty($this->params[‘prefix’]) && in_array($this->params[‘prefix’], Configure::read(‘Routing.prefixes’))) {

$this->layout = $this->params[‘prefix’];

//for Administrator
if ($this->params[‘prefix’] == ‘admin’) {
$this->Security->loginOptions = array(‘type’ => ‘basic’, ‘realm’ => ‘Admin Area’);
$this->Security->loginUsers = array(‘admin’ => ‘Basic認証のパスワード’);
$this->Security->requireLogin();
}

//for Member
if ($this->params[‘prefix’] == ‘member’) {
$this->Auth->loginAction = ‘member/users/login’;
$this->Auth->loginRedirect = ‘member/users/index’;
$this->Auth->fields = array(‘username’ => ’email’, ‘password’ => ‘password’);
$this->Auth->autoRedirect = true;
$this->Auth->loginError = "IDかパスワードが正しくありません";
$this->Auth->authError = "Authentication Error";
}
}

}

}
[/php]

このように、AppController内の、beforeFilter内で現在のprefixesの値で分岐させて、Authの設定を切り替えます。上記が一番のポイントで、その他ログインなどは、CookBookに書いてある様にすれば大抵問題なく動きます。

[CakePHP]コントローラー内で一時的に一部validateを無効にする方法

[CakePHP1.2.3]

コントローラ内でvalidationをする際に、全てoffにするのは簡単です。

[php]
$this->Model->save($data, false);
[/php]

と、saveの第二引数にfalseをセットします。

しかし、一部のvalidationのみoffにしたい場合もあるでしょう。そういうときはどうすればいいのでしょうか。
実は、単純に以下のようにするだけなのでした。

[php]
//コントローラ内
unset($this->Account->validate[‘crosslink_url’]);
[/php]

他にも、モデル内でsetValidateなどのメソッドを作って切り替える、などの方法も考えられます。