CakePHP で携帯用のページを作成する際に CakePHP 携帯用ビューを表示する | Shin x blog のページが大変参考になります。

しかし、/m/ のような URL ではなく携帯専用サイトにしたかったので下記のような方法で実装しました。なお、PC でアクセスしたときには /pc.html という静的なページを表示するようにしてあります。
また、PC、携帯の振り分けはユーザエージェントで行っています。

携帯用コンポーネント

app/controller/component/mobile.php を作成し、PEAR の Net_UserAgent_Mobile を使用しています。このコンポーネントでユーザエージェントを判定して PC だったら pc.html へリダイレクトします。

PEAR の Net_UserAgent_Mobile はサーバにインストールしてもいいのですが、今回は app/vendors/ ディレクトリに入れました。また、app/vendors/ に include_path を通すために、CakePHPガイドブック を参考に include_path_vendors.php を作成しました。

app/controller/component/mobile.php

vendor("include_path_vendors");
vendor("Net/UserAgent/Mobile");
class MobileComponent extends Object {
    function startup(&$controller) {
        $this->controller = $controller;
        $mobile = &Net_UserAgent_Mobile::factory();
        if ($mobile->isNonMobile()) {
            $this->controller->redirect("/pc.html");
        }
    }
}

今回は簡単に PC か携帯でアクセス振り分けているだけですが、画面の大きさやキャリアなどによって色々な処理の振り分けが考えられます。

携帯用ヘルパー

app/views/helper/mobile.php を作成して HTML 出力時に文字コードを Shift-JIS へ変換します。ヘルパーの afterRender メソッドを使用しています。

class MobileHelper extends Helper {
    function afterRender() {
        $out = ob_get_clean();
        $out = mb_convert_kana($out, "rak", "UTF-8");
        $out = mb_convert_encoding($out, "SJIS", "UTF-8");
        ob_start();
        echo $out;
    }
}

コントローラで携帯用コンポーネント、ヘルパーを使用する

app/app_controller.php で携帯用コンポーネントと携帯用ヘルパーを使用します。

var $components = array('Mobile');
var $helpers = array('Mobile');

app_controller.php で設定しておけば全てのコントローラで共通に読み込むので各コントローラにその都度書く必要がなくなります。DB の管理画面など PC 用のコントローラが必要な場合は各コントローラに書いた方がいいでしょう。今回は完全に携帯用にしています。PC 用の管理画面もあるのですが、サブドメインを変えて app ディレクトリも違うものを使用しています。

また、各コントローラ内で設定するタイトルの文字コードを変換しないといけないので、app_controller.php の beforeRenderメソッドでタイトルの文字コードを変換します。

function beforeRender() {
    $this->pageTitle = mb_convert_encoding($this->pageTitle, "SJIS", "UTF-8");
    parent::beforeRender();
}

以上で携帯専用のサイトが CakePHP で作成できました。

コントローラの afterFilter で文字コードを変換する方法

コントローラの afterFilter で文字コードを変換することもできます。

app/controller.php

function afterFilter() {
    parent::afterFilter();
    $out = ob_get_clean();
    $out = mb_convert_kana($out, "rak", "UTF-8");
    $out = mb_convert_encoding($out, "SJIS", "UTF-8");
    ob_start();
    echo $out;
}

この場合は、beforeRender でのタイトルの文字コード変換の処理が必要ないのと、携帯用ヘルパーは必要ありません。
PC 用のコントローラも作りたいときは携帯用コンポーネント、携帯用ヘルパーを使用する方法がよいかと思います。

関連する投稿