iPhone/iPadのホーム画面コンテスト開催中!賞品は iTunes カード!

CakePHP & PHP 2006/09/04 21:52

CakePHP 携帯用ビューを表示する

サイトにPC用と携帯用がある場合、PC用とは別に携帯用の表示を行う方法です。この方法なら同じコントローラ・アクションで、レイアウトとビューファイルを変更することができます。なお携帯版のURLは[/m/]で始まるようにします。

1.URLルーティングを設定する。

[app/config/routes.php]で[/m/]からURLが始まる場合にwebservicesとして扱うように設定します。

[app/config/routes.php]

PHP:
  1. <?php
  2. (snip)
  3. $Route->connect('/m/:controller/:action/*', array('webservices' => 'Mobile'));
  4. ?>

2.WEBSERVICESを有効にする。

webservicesがフレームワーク内でサポートされるように設定を変更します。

[app/config/core.php:123行目付近]

PHP:
  1. /**
  2. *  The define below is used to turn cake built webservices
  3. *  on or off. Default setting is off.
  4. */
  5. define('WEBSERVICES', 'on'); // off から on にします。

3.携帯用コンポーネント、ヘルパーを設置する。

携帯用コンポーネント、ヘルパーを設置します。これは単に表示を変えるだけなら不要なのですが、1.でwebservicesとして動作するように設定しているので必須となります。(クラス内はとりあえず空で良いです)

[app/controller/components/mobile.php]

PHP:
  1. <?php
  2. class MobileComponent extends Object
  3. {
  4. }
  5. ?>

[app/views/helpers/mobile.php]

PHP:
  1. <?php
  2. class MobileHelper extends Object
  3. {
  4. }
  5. ?>

4.携帯用レイアウト、ビューファイルを設置する。

携帯用レイアウト、ビューファイルを[app/views/layouts/mobile][app/views/%controller_name%/mobile]に設置します。双方ともmobile/ディレクトリ以下に設置するのがミソです。

これで[/post/index]にアクセスすればPC版のレイアウト・ビューファイルが、[/m/post/index]にアクセスすれば携帯版のレイアウト・ビューファイルが表示されるようになります。

>>

なぜwebservicesとして扱うか?

CakePHPには一つのコントローラ、アクションでrssやxmlといった多種の出力形式をサポートする機能があります。これがWEBSERVICESです。前出のrssやxmlはフレームワークで定義されているのですが、携帯用と思われるものはありませんでした。そこでroutes.phpのルーティング情報に携帯用を定義する方法を取っています。

この方法の良いところは、レイアウト・ビューファイルの切り替えはフレームワーク側でやってくれるのでコントローラ側では何も意識する必要が無い点です。悪い点はURLが[/m/~]になってしまう点でしょうか。
URLが[/m/]ではじまるのが気になる場合は、mod_rewriteで携帯からのアクセスの場合は自動的に[/m/]へ飛ばす設定にしておく、という方法もありです。



■Related Posts

6 Responses to “CakePHP 携帯用ビューを表示する”

  1. on 29 1月 2007 at 20:47 1.CakeFriends said …

    app/config/routes.phpに設定したルートにはmobileの設定は適用されない。

    例えば
    $Route->connect('/', array('controller' => 'main', 'action' => 'display'));

    と設定した場合
    app/views/main/mobile/home.thtml
    を作ってもそれは表示されず、

    app/views/main/home.thtml
    が表示されてしまう。

    このような場合は、
    $Route->connect('/m/', array('controller' => 'main', 'action' => 'display', ’webservices’ => ‘Mobile’);

    $Route->connect('/', array('controller' => 'main', 'action' => 'display', 'home'));

    と書くしかない

  2. on 30 1月 2007 at 10:43 2.CakeFriends said …

    さらに一歩進めて、

    app/config/routes.phpに以下のように書けば良い事に気がつく

    $ua = $_SERVER["HTTP_USER_AGENT"];
    if( strpos( $ua, "Docomo" ) !== FALSE ){

    $Route->connect('/', array('controller' => 'main', 'action' => 'home', 'webservices' => 'au')); //独自設定のルート
    $Route->connect('/:controller/:action/*', array('webservices' => 'Docomo')); //Docomoのデフォルトのルート(これを一番下に!)
    } else {
    $Route->connect('/', array('controller' => 'main', 'action' => 'home'));
    } else if( strpos( $ua, "UP.Browser" ) !== FALSE ){
    //AU版
    } else if(strpos( $ua, "SBのUA" ) !== FALSE ){
    //SoftBank
    } else {
    $Route->connect('/', array('controller' => 'main', 'action' => 'home'));
    }

  3. on 13 2月 2008 at 05:31 3.straighten » links for 2008-02-12 said …

    [...] CakePHP 携帯用ビューを表示する | Shin x blog (tags: cakephp mobile php) | | | Yahoo!ブックマークに登録 | | | [...]

  4. on 31 3月 2008 at 16:31 4.CakePHP 携帯専用サイトを作成する | Sun Limited Mt. said …

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

  5. on 01 4月 2008 at 10:23 5.CakePHP 携帯でセションを有効にする | Sun Limited Mt. said …

    [...] 携帯サイトと PC サイトが共存しているときの携帯用のビューを表示させる方法は下記が参考になります。 CakePHP 携帯用ビューを表示する | Shin x blog [...]

  6. on 05 9月 2008 at 20:04 6.toyosystem | CakePHP1.1でキャリアごとの絵文字を表示 said …

    [...] バッファをためて一括で変換しています。絵文字と一緒に全角カナも半角カナに直してしまいます。 $this->params["webservices"]で判別しているのはShin x blogさんの「CakePHP 携帯用ビューを表示する」を使用して携帯のビューを切り替えているからです。 [...]

Trackback This Post | Subscribe to the comments through RSS Feed

Leave a Reply