Drupalを携帯に無理矢理対応させる
昨日に引き続き無理矢理ハック。問題はCookieが保持できないことによるアレなわけやが、Drupalでsession.use_trans_sidを使ってセッションをGETに載せるのはできないような気がする。とりあえず、似たようなことを携帯の場合だけごにょごにょやってURLに載せた。
やったこととしては、index.phpでglobalな $sid を定義して、あとはsession.incやcommon.in(drupal_goto)から適宜読み出したり保存したりするだけ。あとindex.phpで出力するときに、正規表現でリンクを引っかけて$sidを載せるだけ。
elseif (isset($return)) { // Print any value (including an empty string) except NULL or undefined: if(is_mobile()){ $out = mb_convert_encoding(theme('page', $return), 'SJIS', 'UTF-8'); $out = preg_replace('|href="(/[^\?"]+)\??([^\?"]+)?"|', 'href="${1}?${2}&sid='.$global_sid.'"', $out); }else $out = theme('page', $return); // add sid to GET parameter print $out; }
こんな感じ?
あ、あとcommon.incのdrupal_get_tokenとかdrupal_valid_tokenも修正しないとログインできなかった*1。あとワンタイムログインのときも何故かうまくいかないので、user.moduleのuser_pass_resetで、ログインしたあとsess_regenerate()して切り抜けた。
あと、携帯からの投稿が文字化けするのは無理矢理mbstringの機能を有効にして凌いだ。setting.phpに昨日書いたis_mobile()を移動して、
if(is_mobile()){ ini_set('mbstring.http_input', 'SJIS'); ini_set('mbstring.encoding_translation', 'on'); }else{ ini_set('mbstring.http_input', 'pass'); ini_set('mbstring.encoding_translation', 'off'); }
とか書いた。.htaccessでの規制もこれらは解除。管理画面でエラー出てるけど気にしない<ぉ
setting.phpに昨日書いたis_mobile()を移動して、
if(is_mobile()){ foreach($_POST as $key => $value){ if(is_array($value)){ foreach($value as $k => $v) $value[$k] = mb_convert_encoding($v, 'UTF-8', 'SJIS'); $_POST[$key] = $value; } else $_POST[$key] = mb_convert_encoding($value, 'UTF-8', 'SJIS'); } }
とかして変数を自前で変換すれば問題ないか。ただ、enctype が multipart/form-data なフォームだと効かない?ので、そういうのは携帯の場合切るようにした。これはuserモジュール(画像アップロード)とかが直撃。
OpenWaveなブラウザでしか検証してないんで、ezweb以外での動作は謎。
*1:session_id()が動かないため?