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()が動かないため?