Akelosでケータイ
Akelosでの携帯対応。いつものごとく、文字コードと、セッションのURLリライトと、ビューの切替。
携帯対策。フレームワーク変わるたびに調べなきゃならん。。。
要件は、だいたい決まって3つ。
・携帯のときは、入出力をSJISで(主にKDDI対策)。
通常のPC版は、INTERNALもDBも出力もUTF8で統一。
・クッキーに対応していない場合は、URLリライト(主にDoCoMo対策)。
・携帯向けのViewは、別に用意する(ファイルはUTF8)。
通常のPC版は、INTERNALもDBも出力もUTF8で統一。
・クッキーに対応していない場合は、URLリライト(主にDoCoMo対策)。
・携帯向けのViewは、別に用意する(ファイルはUTF8)。
3ついっぺんに解決します。
まずは、設定の追加。
■config.php
define('AK_URL_REWRITE_ENABLED',true);
define('AK_SESSION_NAME','AK_SESSION');
function is_mobile(){ //テキトー
return strpos( $_SERVER["HTTP_USER_AGENT"], "DoCoMo" );
}
is_mobile() ?
define("AK_CHARSET","SJIS")
: define("AK_CHARSET","UTF-8");
define('AK_URL_REWRITE_ENABLED',true);
define('AK_SESSION_NAME','AK_SESSION');
function is_mobile(){ //テキトー
return strpos( $_SERVER["HTTP_USER_AGENT"], "DoCoMo" );
}
is_mobile() ?
define("AK_CHARSET","SJIS")
: define("AK_CHARSET","UTF-8");
Akelos(0.7.1)の場合、携帯かどうかの判定は、かなり早い段階にやらないといけない。なぜなら、AK_CHARSETを早くdefineしたいから。この値が、レスポンスヘッダーの、Content-Typeにセットされる。
次に、アクションレンダーが終わった後にフックしてもらう独自仕様、afterRenderを作る。
■lib/AkActionController/AkWebRequest::_after
function _after(&$Controller){
:
//++最後に1行追加
if(method_exists($Controller,'afterRender')) $Controller->afterRender();
}
function _after(&$Controller){
:
//++最後に1行追加
if(method_exists($Controller,'afterRender')) $Controller->afterRender();
}
以上でAkelosフレームワーク側の準備は完了。
オオモトのApplicationControllerは、こんな風に定義しておく。
class ApplicationController extends AkActionController {
//クッキーレス対応。Railsと同じ。
function defaultUrlOptions($options){
if( ! $_SERVER["HTTP_COOKIE"] )
return array( session_name() => session_id() );
}
function _mobileIn(){
if( is_mobile() )
//入力パラメータを SJIS→UTF-8変換
mb_convert_variables("UTF-8", "SJIS", $this->params);
}
function _mobileOut(){
if( is_mobile() ){
//モバイル用のレイアウトとViewに切り替える。
$this->setDefaultTemplateName("mobile/".$this->params['action']);
$this->setLayout("mobile_".$this->params['controller']);
}
}
function afterRender(){
if( is_mobile() ){
//レンダリングが終わった後のコンテンツを UTF-8→SJISに変換
if( is_string($this->Response->body) ){
$this->Response->body
= mb_convert_encoding($this->Response->body,"SJIS","UTF-8");
}
}
}
}
//クッキーレス対応。Railsと同じ。
function defaultUrlOptions($options){
if( ! $_SERVER["HTTP_COOKIE"] )
return array( session_name() => session_id() );
}
function _mobileIn(){
if( is_mobile() )
//入力パラメータを SJIS→UTF-8変換
mb_convert_variables("UTF-8", "SJIS", $this->params);
}
function _mobileOut(){
if( is_mobile() ){
//モバイル用のレイアウトとViewに切り替える。
$this->setDefaultTemplateName("mobile/".$this->params['action']);
$this->setLayout("mobile_".$this->params['controller']);
}
}
function afterRender(){
if( is_mobile() ){
//レンダリングが終わった後のコンテンツを UTF-8→SJISに変換
if( is_string($this->Response->body) ){
$this->Response->body
= mb_convert_encoding($this->Response->body,"SJIS","UTF-8");
}
}
}
}
あとは、各コントローラでフィルターをかませば、対策完了です。
class BlogController extends ApplicationController{
function __construct(){
$this->beforeFilter('_mobileIn');
$this->afterFilter('_mobileOut');
}
}
function __construct(){
$this->beforeFilter('_mobileIn');
$this->afterFilter('_mobileOut');
}
}
上記の方法では、
ビュー以外のモデル・コントローラーは完全に再利用します。
その上で気をつける点は、AJAXやJavaScriptに頼ったページ遷移ではなく、オーソドックスなページ遷移で作っておくこと(お金と時間がナイばあい)。
あとは、全てのURLの生成にUrlForを使うようにしておかないと、defaultUrlOptionsは利きません。
$url = array("controller"=>"blog","action"=>"index");
もしそうしていなければ、PHPならdefaultUrlOptionsの代わりに、
リーサルウエポン session.use_trans_sid=on があります。

