Ktai Libraryを使いながらViewをPCと携帯で切り替える

CakePHPKtai Libraryを使用しているサイトで、アクセス元の端末を判別してCakePHPのViewを切り替える方法。
キャリア判別はしてないけど、この方法なら簡単に実装できるはず。

前準備

Viewのフォルダは以下の2つに分けます。

app/views
PCからアクセスした場合に参照するView
app/views_mobile
携帯からアクセスした場合に参照するView

実作業

  1. http://blog.ecworks.jp/ktaiから、モジュール本体(ktai-X.X.X.zip)をダウンロード。
  2. http://start.typepad.jp/typecast/から、TypePad絵文字(emoticon.zip)をダウンロード。
  3. ktai-X.X.X.zipを解凍。まあ中身の通り、そのまま配置。
    ちなみにヘルパの配置は、app/views の方へ。
  4. emoticon.zipを解凍。webroot/img/emoticon/ の中に画像を配置。
  5. app/controllers/app_controller.php に記述。

    <?php
    class AppController extends Controller {
        var $components = array("Ktai");
        var $helpers = array("Ktai");
        var $ktai = array(
            "convert_output" => true,
            "use_img_emoji"   => true,
            "input_encoding"  => "UTF8",
            "output_encoding" => "SJIS",
            "img_emoji_url" => "/appname/img/emoicons/",
            );
    }
    ?>
    

    今回行った$ktaiの設定内容は以下の通り。

    use_img_emoji
    絵文字をTypePad絵文字で出力します。デフォルトはfalse。
    PCのみで開発テストしてる場合は、画像で出力してくれた方が判りやすい。
    これを指定しなくても、携帯からアクセスした場合はちゃんと絵文字が出力されます。
    input_encoding / output_encoding
    入力文字コードと出力文字コード。デフォルトはどちらもUTF-8
    ViewファイルをUTF-8で記述し、出力はシフトJISにしたかったので指定してます。
    変更の必要がなければ、何もしなくてもいいかも。
    img_emoji_url
    TypePad絵文字のバス。デフォルトのパスは"/img/emoicons/"。


  6. これだけだと文字コードの変換が行われないので、更にapp_controller.phpへ追記。

    <?php
    class AppController extends Controller {
    ...
    (上の記述)
    ...
        function afterFilter() {
            if ($this->Ktai->is_ktai() == true) {
                parent::afterFilter();
                $this->output = mb_convert_kana($this->output, "rak");
                $this->output = mb_convert_encoding($this->output,"sjis-win","utf-8");
                $this->Ktai->convert_emoji($this->output,$this->Ktai->get_carrier());
            }
        }
    ?>
    

    これで、

    という動きになります。


  7. 最後に、PC/携帯電話でViewを切り替える設定。
    app/controllers/app_controller.phpへ更に追記。

    <?php
    class AppController extends Controller {
    ...
    (上の記述)
    ...
        function beforeRender() {
            parent::beforeRender();
            $config = Configure::getInstance();
            if ($this->Ktai->is_ktai() == true) {
                array_unshift($config->viewPaths, ROOT.DS.APP_DIR.DS."views_mobile".DS);
            }
        }
    ?>
    

    これで、

    • PCだったら通常のView(app/views)
    • 携帯だったら携帯用のView(app/views_mobile)

    を使用するようになります。
    ここで使用している is_ktai() をキャリア判別用の関数へ変更すれば、キャリア毎のView切替もできるはず。