どうもそういう動きをしているようなので・・・。
cakephp:1.2.3.8166&Ktai-Library:0.1.1で確認しました。
僕はコレで解決できた。
<?php class MembersController extends AppController { var $name ="members"; var $helpers = array('Ktai'); var $components= array("Ktai"); var $ktai = array( 'output_auto_encoding'=>true, 'input_encoding' => 'UTF-8', 'output_encoding' => 'SJIS-Win', );
という感じでコントローラー内でKtaiComponentを使っている。
携帯のページはこれでよかったのだが、PCページからログインする時にセッションが開始されていないことが分かった。
試しにKtaiComponentを使っていない($components変数でセットしていない)ページだと、ふつーにセッションが動いてくれたので、どうもそこだけセッションの設定が違うことが分かった。
余談だけどini_set関係はPHPはスクリプトの実行から終了までしか保持してくれないようなので、Javaみたいにアプリ全体で色々保持してくれないらしいので、毎回.htaccessでphp_valueとかやらざるをいけないようだ。貧弱と言うかお手軽と言うか・・・。これに起因するPHP独自の環境的問題でかなり苦しんでいるので、正直めんどくせぇぇぇぇと叫びたくなる!
原因は、KtaiComponentが初期化される時にSession.saveの値を書き換えることにあるみたい。
<?php function initialize(&$controller){ //about line 63 if($this->_options['enable_ktai_session']){ Configure::write('Session.save', 'ktai_session'); } }
このktai_sessionが有効になっているようなので、config/ktai_session.phpで定義されているSwitch文を通るときに'ktai_session'というKeyになっているため、iMode携帯以外セッション関連の設定が初期化されていないようです。
とりあえず手っ取り早く解決したければ、config/ktai_session.phpでこんな感じでdefaultを通させればいい。cakeのセッション設定でよければこれでおk。
<?php default: if (empty($_SESSION)) { if ($iniSet) { ini_set('session.use_trans_sid', 0); ini_set('url_rewriter.tags', ''); ini_set('session.serialize_handler', 'php'); ini_set('session.use_cookies', 1); ini_set('session.name', Configure::read('Session.cookie')); ini_set('session.cookie_lifetime', $this->cookieLifeTime); ini_set('session.cookie_path', $this->path); ini_set('session.auto_start', 0); ini_set('session.save_path', TMP . 'sessions'); } } break;
いじょ。
Ktai-LibraryのHelperを使う場合のおまけtips
helperで文字コードを指定するとページ全体をバッファしてエンコードしてくれるのですが、コントローラー内にPCサイトと携帯サイトのロジックが混在している場合(prefixとかで)別にやんなくてもいいよ!って時があります。そんなときはこう。
<?php class HogeController extends AppController { var $ktai = array( 'output_auto_encoding'=>true, 'input_encoding' => 'UTF-8', 'output_encoding' => 'SJIS-Win', ); function index() { $this->ktai['output_auto_encoding'] = false; }
いじょ。