概要

PHPでケータイサイトを作る際に非常に便利に使わせていただいているのが「らくらくケータイ3キャリアコンバーター(仮名)」です。(詳しくはke-tai.org > Blog Archive > PHPを使って3分で作る3キャリア対応ケータイサイト をご覧ください。)
簡単にいうと以下のようにやると3キャリア対応のケータイサイトが1つのソース(HTML)で実現できます。

  • HTML(テンプレート)はXHTMLでShift_JISで書く
  • 絵文字はドコモのunicode形式で書いておく (これを上記モジュールで出力時に変換する)

さてここでフォームの入力モード(docomoだとistyleとか)を指定したい場合にはどうしたらよいでしょうか?
「ケータイ xhtml 入力モード」とかでぐぐると以下のようなサイトがヒットします。

これらのサイトで述べられていることをまとめると以下のようになります。

  1. style属性でwap-input-formatを各キャリア仕様分並べて書いてやれば3キャリアとも機能する
  2. ただしSoftBankの一部の機種(特にSHARP)で入力制限モード(指定したモード以外の文字種が入力できない状態)になってしまう

大体のサイトでは2の条件はNGだろうと思うので結論としては「絵文字のように出力時に置換してやる方法しかない」ということになります。

そこで、「らくらくケータイ3キャリアコンバーター(仮名)」には docomoのときだけ istyle を wap-input-format に変換する関数が用意されていますがこれを拡張して3キャリア対応の関数を追加しました。

修正箇所

convert_istyle関数の追加


    /**
     * 入力モード指定変換(全キャリア)
     *
     * iモード用の入力モードの変換を行う
     *
     * @param   string  $input  変換対象の文字列
     *
     * @return  string          変換後の文字列
     */
    function convert_istyle($input, $agent)
    {
        $rep_arr_master = array(
            'DoCoMo' => array(
                'istyle="1"' => 'istyle="1" style="-wap-input-format:"*<ja:h>";"',
                'istyle="2"' => 'istyle="2" style="-wap-input-format:"*<ja:hk>";"',
                'istyle="3"' => 'istyle="3" style="-wap-input-format:"*<ja:en>";"',
                'istyle="4"' => 'istyle="4" style="-wap-input-format:"*<ja:n>";"'
            ),
            'SoftBank' => array(
                'istyle="1"' => 'mode="hiragana" istyle="1" format="*M"',
                'istyle="2"' => 'mode="hankakukana" istyle="2" format="*M"',
                'istyle="3"' => 'mode="alphabet" istyle="3" format="*x"',
                'istyle="4"' => 'mode="numeric" istyle="4" format="*N"'
            ),
            'EZweb' => array(
                'istyle="1"' => 'istyle="1" format="*M"',
                'istyle="2"' => 'istyle="2" format="*M"',
                'istyle="3"' => 'istyle="3" format="*x"',
                'istyle="4"' => 'istyle="4" format="*N"'
            ),
        );
        
        $carrier = KetaiConverter::getCarrier($agent);
        if (! preg_match('/DoCoMo|SoftBank|EZweb/', $carrier)) {
            return $input;
        }
        $rep_arr = $rep_arr_master[$carrier];
        
        $output = $input;
        preg_match_all('/<input (?:.*)(istyle=("|\')?[1-4](?:"|\')?)(?: (?:.*?))?>/i', $input, $arr);       // inputタグを検索し、配列に格納
        for ($i = 0; $i < count($arr[0]); $i++) {
            // 必要な変数を取得
            $target = $arr[0][$i];          // 置換対象
            $istyle = $arr[1][$i];          // istyle属性
            $quote = $arr[2][$i];           // クォート
            $replacement = strtr($target, $rep_arr);
            $output = str_replace($target, $replacement, $output);
        }
        
        return $output;
    }

convert関数の最後に convert_istyleを呼び出し


       // istyleの変換
        $output = KetaiConverter::convert_istyle($output, $agent);

※convert()内でDocomoのときに呼び出されている istyle_imode()はコメントアウトしておきます。

課題

今のところこのような形で運用していますがAUの一部の機種でどうしても「入力制限モード」になってしまうことがあるようです。調べた結果AUの仕様の書き方が曖昧で、これはどうしようもないとの結論に至っています。

まとめ

「らくらくケータイ3キャリアコンバーター(仮名)」はこのようにケータイサイトの出力時にいろいろ変換をかませるモジュールとして大変便利でカスタマイズしやすくなってます。
たとえばこれ以外にも

  • formのaction属性にguid=ONをつける

という変換なども加えて使っています。
このような便利なモジュールを公開してくださったke-tai.orgさんに感謝です。

参考

添付

viewer.php

コメントは受け付けていません。