人気ブログランキング | 話題のタグを見る
(CakePHP)携帯電話でもセッションを使えるようにする
最近のauやソフトバンクならクッキーを使える(ゲートウェイでクッキーつけてるっぽい?)ので問題ないのですが、厄介なのはドコモです。
ドコモはクッキーも使えませんし、HTMLのほうも、CSSが全く利用できません。
つくづく、独自規格をいくキャリアですね。そんなだから世界の中で孤立してしまうんですよ。
とぼやいてもしかたないので、URLにセッションIDを持たすようにCakePHPを改造します。

参考にさせていただいたのはCakePHPで携帯サイトを作るです。

CakePHPのバージョンは1.2.0.7692 RC3です。

■まず、index.phpと同じディレクトリにある.htaccessに下記を追加します。

php_flag session.use_trans_sid On
php_flag session.use_cookies Off

これにより、クッキーの使用をOFFにして、リンクで移動するところ全てにGETセッションIDを引き継げるようになるらしいですが。。(つまり、リンクに勝手にセッションIDがつくということなんでしょう。)
しかし、なぜか自分の環境だとリンクに勝手にセッションIDがついてくれませんでした。
ということで、リンクや、フォームに全て手動でセッションIDをつけるようにしました。

■app/config/core/phpの設定変更
Security.levelをmidiumにします。
また、Security.levelをmidiumにするとセッションタイムアウトの時間がSession.timeout*100秒になってしまいます。デフォルトの120だと 120秒*100/60=200分ということで、3時間半にもなってしまうので値を小さくします。
なお、Security.levelとSession.timeoutの関係にはこちらを参照のこと。

//Configure::write('Security.level', 'high');
Configure::write('Security.level', 'medium');
//Configure::write('Session.timeout', '120');
Configure::write('Session.timeout', '20');//Security.level=mediumで33分


■cake/libs/controller/app_controller.php redirectメソッドをオーバーライド
リダイレクト時にセッションIDを負荷するよう redirect メソッドを下記のようにオーバーライドします。
class AppController extends Controller {
 
//redirect メソッド書き換え
function redirect($url,$status = null){
//携帯用にリダイレクトのURLの後ろにセッションIDを付けておく
if (strpos($url, "?") === false) {
$url = $url."?".session_name()."=".session_id();
}else{
$url = $url."&".session_name()."=".session_id();
}
parent::redirect($url,$status);
}
}


■cake/libs/router.php function url()の890行目付近を次のように書き換えます。

if (!empty($named)) {
foreach ($named as $name => $value) {
$output .= '/' . $name . $_this->named['separator'] . $value;
}
}

新  ↓
//携帯対応書き直し分
if (!emptyempty($named)) {
$i = 0;
foreach ($named as $name => $value) {
//$output .= '/' . $name . $_this->named['separator'] . $value;
if ($i == 0) {
$output .= '?' . $name . "=" . $value;
}else{
$output .= '&' . $name . "=" . $value;
}
$i++;
}
}



■ビューでリンク時、フォーム送信時にセッションIDをつける
ビューにおいて、リンク時は下記のように最後にセッションIDをつけます。

<?php echo $html->link('リンク', '/links/add?CAKEPHP=' . $_GET["CAKEPHP"] ); ?>

また、フォームのactionにもセッションIDを付与してあげます。

<form action="<?php echo $form->url('/links/add?CAKEPHP=' . $_GET["CAKEPHP"] )?>" method="post">


これでなんとか、URLでセッションを引き回せるようになりました。
ほんとはPCと携帯で振り分けてPCならクッキー、携帯ならGETでという風にしたいのですが、これは時間あるときにやってみたいと思います。
by jehoshaphat | 2008-12-21 01:00 | PHP開発


<< (Firefox)アドオンのイ... (CentOS)MySQLの設... >>