CakePHP」タグアーカイブ

Pleskでつくるユーザの謎

Pleskでつくるドメイン毎のユーザでは、CakePHPのshellをうまく実行できない。こういうエラーが出てしまう。

PHP Fatal error:  Class 'AppModel' not found in /var/www/vhosts/...

普通に、adduserなどで作ったユーザはうまく行くのだが。おそらく、PATHの関係なのだと思うが、未だ原因がわからない。

CakePHPで静的ページへのユーザ認証を除去

CakePHPで認証付きの静的ページを作る | Web活メモ帳を参考に、CakePHPでの静的ページへのユーザ認証を解除したのメモを。

なぜ、こんな処理が必要になったかというと、AppController内で、Authコンポーネントを有効にしたため。Controller全体にユーザ認証が効くようになったが、ユーザ認証無しでの公開を前提としている静的ページまでも、ユーザ認証が求められるようになったため、ユーザ認証を無効化する必要性が発生した。

AppControllerのbeforeFilterで、以下のように記述する。

function beforeFilter()
{
        // pages controllerかどうかをチェック
        // Pagesだったら、ユーザ認証は行わない
        if ($this->name == 'Pages')
        {
            $this->Auth->allow('*');
        }
}

CakePHPのタイムゾーンをローカル設定にする方法

PHP5.3対応とかで、初期設定のタイムゾーンが勝手にUTCになっている。これを解決するには、
app/config/core.phpの以下の部分をコメントアウトすれば、php.iniの設定が読み込まれる。特に、php.iniでタイムゾーンを設定していなければ、ローカルのタイムゾーン設定が反映される。

/**
 * If you are on PHP 5.3 uncomment this line and correct your server timezone
 * to fix the date & time related errors.
 */
//	date_default_timezone_set('UTC');

mod_chxjは便利だ

CakePHPでケータイサイトを作っているのだが、一番手こずっているのがセッション管理。ケータイのブラウザのほとんどは、Cookieを持てないので独自にセッションを管理する必要があるのだが、タグのリンクにセッションIDを埋め込んだりと面倒くさい。

mod_chxjを使うと、cookieをシミュレートしてくれるようになるので、これはかなり便利。PHPのデフォルトのセッションID埋め込み機能よりも、セッション切れが発生しづらい。

CakePHP1.2でエラー表示を消す方法

/app/config/core.phpを以下のように修正

Configure::write('debug', 0);

CakePHPでは、php.iniでエラーレベルを変えても、core.phpの設定が優先されてしまう。この設定を変えることで、ErrorやNoticeの表示を制限できる。デプロイの時に便利。

参考
【CakePHP】1.2でNoticeエラーを表示させない : 地方で活動するweb制作者の日々を綴るblog

CakePHP1.2でケータイ向けセッション管理

ケータイではCookieを使えないので、通常のセッション管理ができない。URLにセッションIDを埋め込むなどの対策が必要になる。1.2での設定方法をまとめてみる。

/m/以下をケータイ用に振り分けことを前提に。

app/config/core.php

//Configure::write('Session.save', 'php');
Configure::write('Session.save', 'usersession'); //こちらに修正

セッションを扱う箇所を独自コードに置き換えることができる。コードは、app/config/usersession.phpに記述する。

app/config/usersession.php

新規で作成。

<?php
if (!isset($_SESSION)) {
	if (function_exists('ini_set')) {
		if(defined('MOBILE')){ //ケータイ用だったら
			ini_set('session.use_trans_sid', 1); //GETリクエストにセッションIDを自動的に埋め込む設定を有効
			ini_set('session.use_cookies', 0);   //Cookieの使用を無効
		}else{
			ini_set('session.use_trans_sid', 0);  //無効
			ini_set('session.use_cookies', 1);    //有効
		}
	}
}
?>

MOBILEという変数は、別クラスで設定する

app_controller.php

<?php
class AppController extends Controller {
	var $needAuth = false;
	var $helpers = array('html', 'form', 'time');

	function beforeFilter()
	{
	//ケータイ用の振り分け
	if(isset($this->params['prefix'])){
		$this->layout = 'mobile_'.$this->layout;
	}
	$auth = $this->Session->read( 'auth' );
	$this->set( "auth", $auth );

	if( $this->needAuth ){
		if( empty( $auth ) ){
			if(defined('MOBILE')){ //ケータイへの振り分けがされていたら、ケータイ向けのログイン画面へ
				$this->redirect( "/m/users/login" );
			}else{
				$this->redirect( "/users/login" );
			}
			return ;
		}
	}
	if(defined('MOBILE')){ //ケータイ用にSJISに文字コード変換
		mb_convert_variables('UTF-8','SJIS-win',$this->data);
	}

	ob_start(); //文字コード変換用の処理開始
	parent::beforeFilter();
}

function __construct()
{
// /m/がURLの中にあった場合、MOBILE変数を設定。このフラグを各クラスで判別
	if(ereg("^/m/",$_SERVER['REQUEST_URI'])){ // もし、URLが/<em>servicename</em>/m/だったら、"^/<em>servicename</em>/m/"
		define('MOBILE',1);
	}

	parent::__construct();
}

function afterFilter()
{
	parent::afterFilter();
	$out = ob_get_clean();

	if(defined('MOBILE')){
		$out = mb_convert_encoding($out,'SJIS-win','UTF-8'); //ケータイからの入力をSJISからUTF-8に変換
	}

	echo $out;
}

//redirect メソッド書き換え
function redirect($url,$status = null)
{
	if(defined('MOBILE')){
		$url = $url."?".session_name()."=".session_id(); //転送先URLにセッションIDを自動付加
	}

		parent::redirect($url,$status);
	}
}
?>

POSTのフォーム

GETでは、自動的にセッションIDが埋め込まれるが、POSTではセッションIDの埋め込みを明示的に行う必要がある。<form>で以下のように記述する。

<form action="foo?<?php session_name()."=".session_id();?>" method="POST">

参考サイト: