3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(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をつけます。

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

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

"url('/links/add?CAKEPHP=' . $_GET["CAKEPHP"] )?>" method="post">

これでなんとか、URLでセッションを引き回せるようになりました。

ほんとはPCと携帯で振り分けてPCならクッキー、携帯ならGETでという風にしたいのですが、これは時間あるときにやってみたいと思います。