cakephp最低限の労力で携帯対応!

まず、cakephpの設定をする。
http://www.1x1.jp/blog/2006/09/cakephp_mobile.html
http://www.easy-in.net/archives/8
のサイトを参考にMobile対応と文字コード対応をする。

さて、これで基本はOK。
例えば、
/thread/list
って処理があったとすると、
/m/thread/list
が携帯画面のアドレスになる。

対応するviewが自動的に変わるので、
PC版と同じ文字コードでviewを作成する。

ただ、デフォルト設定だと、viewのパスが
views/thread/mobile/list.thtml
となり、各コントローラ毎に携帯用のviewが散らばるので、あんまり良くない(と思う)

なので、他のwebservicesを使う予定が無ければ(あってもいいんだけどw)
cake/libs/view/view.php
を変更してやる。
変更箇所は
_getViewFileName()

_getLayoutFileName()
それぞれの中身。
ここで、読み込むviewのパスとlayoutのパスを作っているので、
うまいこと変えてやれば良い。
1.1.15.5144の変更後ファイルはこれ
そうそう変わるところじゃないので、多少バージョンが違っても大丈夫だと思うが、diffをかけて確認した方が良いと思う。

さて、変更後ファイルを適用すると、
view/mobile/コントローラ/アクション.thtml
とview直下のmobile内に全て収まる形になる。
layoutも同じく、
view/mobile/layoutsに作ればOKになる。

よし、これでファイルレイアウトはばっちりだろう。

あとは、ちょっとしたこと。
まず、controllerで$this->redirect();
を呼び出している場合、
携帯の場合は「/m/元のパス」としてやらないと
元のパス=PCサイトに飛んでしまうので、
こいつをなんとかする。

app/app_controller.phpに↓を追加。

function isMobile() {
  return isset($this->params["webservices"]) && $this->params["webservices"] == "Mobile";
}
function redirect($redirect) {
  if ($this->isMobile()) {
    parent::redirect("/m" . $redirect);
  } else {
    parent::redirect($redirect);
  }
}

単純にオーバーライドするだけ。簡単。

これでコントローラは(今のところ)修正無しに携帯サイトをくっつけることできた。