FuelPHPでフィーチャフォン(ガラケー)対応について考えてみた

FuelPHP Advent Calendar 2011 の 25日目です。
昨日は、@Kenji_s さんの「FuelPHP でのセキュリティ対策(3)Add Star」でした。

実は24日に記事を書かなければならないことを知り、かなり無謀ですが、執筆してしまったことを冒頭で謝らせてください。しかも FuelPHP のことをよく知りません。知らないことだらけです。CodeIgniter 使いが違和感なく使えるとの噂を信じて今回色々触ってみました。文中でも CodeIgniter との比較が出てくると思います。

今回は「 FuelPHP でフィーチャフォン(ガラケー)対応について考えてみた」というタイトルです。
周知の事実としてただ今スマートフォンがブームですね。iOS や AndroidOS を搭載した端末です。東京なんかだと携帯電話の新規購入や乗り換えの方々のほとんどがこれらのスマートフォンを選ぶそうです。しかし大阪や名古屋を含めた地方都市では必ずしもスマートフォンを選ぶ人ばかりではなく、フィーチャフォン(いわゆるガラケー)を選ぶ方々も多いと聞きます。つまりモバイル向けのWeb アプリケーション開発があった場合、スマートフォン向けとフィーチャフォン向けの二種類を作らなくてはならない可能性があります。HTML コーダーや PHP プログラマの負担は増すばかりですね。大変大変(汗)

スマートフォンはほぼパソコンのブラウザのような扱いが可能なため、それほど多くの特殊な対応が必要ないのですが、フィーチャフォンでは特殊な対応が必要になります。主に以下の3つでしょうか。

1.文字エンコーディングShift_JIS とする
2.クッキーが使えないことを前提とする
3.セッションを使うには工夫が必要

Webアプリケーションの世界では1の文字エンコーディングUTF-8 が今最もメジャーですが、フィーチャフォンでは Shift_JIS としておくのが無難です。それなら FuelPHPShift_JIS で書けばいいのでは?と思われるかもしれませんが、実はそうではありません。例えば多くのデータベースやライブラリなどの多くがUTF-8で設計されているケースが多く、FuelPHPUTF-8 で書くのが良いでしょう。以下のようなイメージで考えていただければ幸いです。

FuelPHPやデータベースはUTF-8で動作させ、フィーチャフォンへのアウトプット( output )を Shift_JIS にしてしまえば、文字化け等で悩むことが少なくなります。

フィーチャフォンの機種の中にはクッキーが標準で使えなかったり、機能そのものが無いものがあります。クッキーが使えないということは多くの制限を受けます。FuelPHP での開発にも影響を受けます。例えばクッキーが使えないと3のセッションも通常の設計では使えません。3年ほど前に CodeIgniter のメーリングリストにて「モバイルサイトのセッションについて」という記事とサンプルライブラリを書いたことがあります。話は大変長くなてしまうので、前置きは以上とします。


FuelPHP でフィーチャフォンに文字を表示させてみよう!

view ファイルの準備をします。レイアウトファイルから作成します。
レイアウトとは、ヘッダー、コンテンツ、フッターというようにviewファイルをパーツ化してそれぞれが他で使いまわせるようにする考え方のことです。CodeIgniter徹底入門(翔泳社)でも同様の執筆をしました。

フィーチャフォン用のmobileというデレクトリを作り、そこにレイアウトのための layout.php を作成します。

fuel/app/view/mobile/laypout.php

<?php echo $header; ?>
  <body>
<?php echo $content; ?>
  </body>
<?php echo $footer; ?>

各変数はviewファイルと対にして配置することで読むこむことができるようです。例えば、$headerは header.php と対になりますが、コントローラーでの定義も必須です。
続いて、header.php 、content.php 、footer.php を作成します。

fuel/app/view/mobile/header.php

<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
<head>
  <meta http-equiv="Content-Type" content="application/xhtml+xml ; charset=Shift_JIS" />
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <title><?php echo $title; ?></title>
</head>

変数である $title はグローバルとしてコントローラーで定義することにします。

fuel/app/view/mobile/content.php

携帯電話で文字化けしないで表示されていますか?

fuel/app/view/mobile/footer.php

</html>

以上で view に関するパーツの用意ができました。早速コントローラーの作成をします。わかりやすいように mobile.php とします。
fuel/app/classes/controller/mobile.php

<?php
class Controller_Mobile extends Controller
{
    public function action_index()
    {
        // レイアウトの定義
        $view = View::forge('mobile/layout');
        // グローバル変数の定義
        $view->set_global('title', 'モバイルテスト');
        // viewパーツの指定
        $view->header = View::forge('mobile/header');
        $view->content = View::forge('mobile/content');
        $view->footer = View::forge('mobile/footer');

        return $view;
    }
}

FirefoxFireMobileSimulatorを使って、表示させてみました。

当然のことですが、文字化けしてしまいます。FuelPHP では UTF-8 でコーディングしたのに、HTML の charset 属性では Shift_JIS を宣言しているからです。ブラウザの文字エンコーディングUTF-8 に変更するれば、文字化けは解消されますが、フィーチャフォンではそのようなことはできません。

CodeIgniterでは、コントローラーで _output() メソッドを使用して一括変換していました。

function _output($output)
{
	header('Content-Type: text/html; charset=UTF-8');
	echo mb_convert_encoding($output, "SJIS", "UTF-8");
}

他にも色々な方法がありますが、_output() で定義しておけば、メソッドごとに header() 関数や mb_convert_encoding() 関数を書かなくても済みます。CodeIgniter の _output() メソッドのようなものが FuelPHP ではどのような手法になるのかは、時間の関係で調べられませんのでしたので今回は以下のようなもっとも単純な方法で実装させていただきました。

fuel/app/classes/controller/mobile.php

<?php
class Controller_Mobile extends Controller
{
    public function action_index()
    {
        // レイアウトの定義
        $view = View::forge('mobile/layout');
        // グローバル変数の定義
        $view->set_global('title', 'モバイルテスト');
        // viewパーツの指定
        $view->header = View::forge('mobile/header');
        $view->content = View::forge('mobile/content');
        $view->footer = View::forge('mobile/footer');
        // おまじない
        header('Content-Type: text/html; charset=Shift_JIS');
        // 携帯電話向けに文字エンコードの一括変換
        return mb_convert_encoding($view, "SJIS", "UTF-8");
    }
}

FirefoxfireMobileSimulator を使って、再び表示させてみました。

文字化けは起こりませんでした。
今回は時間の都合で実機による検証は行えませんでした。またセキュリティや本来あるべきものを追求したものでもありません。次回機会があれば、フィーチャフォンのセッションを考えてみたいと思います。
今回がこのアドベントカレンダーも最終回でした。みなさん、有志のよる25回分の記事は参考になりましたでしょうか。FuelPHP を使うきっかけになれたらと願っております。

フレームワークが多すぎてよくわからないです。

DooPHPは、CodeIgniterの2倍以上速いらしいです。

ベンチ
http://www.doophp.com/benchmark

どうなっているのか調べてまた報告したい。
やはりというか当り前なんだが、機能を削ぎ取る以上のことしているようなら当り。

あと面白いものを見つけた。
ASPフレームワーク ぴいたん

ASPで動くことは想像できるが、「ぴいたん」という名前でぴんと来た方は鋭い。
http://peetan.cre8labs.com/

「ちいたん」のASPへの移植版らしい。
これはこれで素晴らしい努力の賜物ですな。

Code Generatorリリース2

PHPフレームワーク CodeIgniterのファイルを自動生成するツール

Code Genratorのリリース2を出します。

applicationまでのパスをダイアログで選べるようにしました。

不具合も修正しました。お試しいただいたみなさん、ご協力ありがとうございました。

[ダウンロードする]
※配布は終了しました。

※日本CodeIgniterユーザ会やCodeIgniter本家の公式的な配布物ではありません。

Code Generatorお試し版リリース

PHPフレームワーク CodeIgniterのファイルを自動生成するツール
Code Genratorのお試し版をリリースします。
とても便利ですので、良かったら使ってください。
マニュアルはaboutメニューのhelpです。
バグが出たら報告ください。

[ダウンロードする]
※配布は終了しました。

※日本CodeIgniterユーザ会やCodeIgniter本家の公式的な配布物ではありません。
あくまでも趣味の個人開発リリースです。

予定:データベースとの連携によるCRUDの実装