Re:

のあんのブログ

カテゴリ:開発 > CodeIgniter

_IGP4815

HTML_Emojiが絵文字処理を非常に楽なものへサポートしてくれるんだけど

SJISコードやUnicode記述からの変換はあっても、番号による変換はサポートしてくれてない。

当然といえば当然なんだけど。


太陽の絵文字を出そうにも、太陽がUnicodeでE63Eと覚えておいてと記述するのは理解しがたい。

太陽が1なら理解できるだろう。


ちなみに、Unicode記述の出力をキャリア変換するフィルタはこんな感じ。

$emoji = HTML_Emoji::getInstance();
$emoji->utf8 = true;
$emoji->setImageUrl('images/'); // PC出力用画像パス

$output = '太陽:';
$output = $emoji->filter($output, array('HexToUtf8', 'output'));

echo $output;

PC向けには出力する画像ファイル名をSJIS16進数(小文字)で付けて置く必要がある。


そんな訳で、番号での記述形式を決めてフィルタをコアに実装しよーと思った。

それだけだといくぶんオーバーヘッドだろうし、直接UTF化するのもあり。


docomoの絵文字番号を基準とした固定関数で良いよね!(Unicodeも何気に連続してないので、番号をkey、Unicodeをvalueとした配列定義しておくのが手っ取り早そう)


作ろうiモードコンテンツ:基本絵文字一覧 | サービス・機能 | NTTドコモ
http://www.nttdocomo.co.jp/service/imode/make/content/pictograph/basic/index.html

このテーブルをブラウザ上でコピーしてエディタに貼りつけ、正規表現で抜き出せばいーよ。

拡張絵文字もね!

^(拡?\d+).*(E[67][0-9A-F]{2}).*

配列にしたテキスト置いときます。(拡張絵文字は1000番)
http://adm.toypark.in/numToHexOfUnicodeByDocomo.txt



たとえば
  •  → 
  • emoji_1; →  (このフォーマット採用した。

どんな形式が標準的なんですかね?



ごくシンプルに実装。

http://www.coolphptools.com/codeigniter-smarty


librariesがあるのにlibsを置く点だけ気持ち悪かったので、libsをsmartyにリネームして/system/application/libraries/smartyとして置きました。

あと、view()で拡張子補完の修正(拡張子は省略して渡す前提で)。

$template → $template.EXT

とりあえずビューチェーンしたいので、出力結果を結合。

$CI->output->final_output .= $this->fetch($template.EXT);



$this->load->view($template, $data);

としてビュー処理してたところを

$this->smarty->view($template, $data);


ネイティブなPHPをテンプレに描くとかなり可読性が落ちるのと、パーサもあるけれど慣れてるSmartyが一番良いです。

まだまだフレームワークの改良中。


扱いやすくてCodeIgniterがおすすめー。

楽をするというか、良いものは取り入れカイハツする。

HTML_Emojiライブラリを使う!

pre_controllerでフックしてフィルタクラスを実装し、_GETまたは_POSTリクエストから絵文字を除去。

これでフォームからの絵文字対策はOK。

ちなみに、Net_UserAgent_Mobileとコレはpre_systemでフックしたダミー関数のファイル内でオブジェクトを作ってglobalにしました。


現状は(ガラ)ケータイ向けだけどUTF-8でサイト構築。

対応してないケータイは除外。

あとCookie未対応も除外。


将来的にスマートフォンへ移り変わるんだし、これから作るならそれで良い。


php_sessionライブラリもロードしたし、あとはmemcacheライブラリを入れたらフレームワーク側の環境は整うデス!

亀の遅さで進行中。

NetBeansに乗り換えてカイハツを行っています。

それまでまぁ、テキストエディタを使ってたりすることが殆どで、今の前身ではEclipse PDTも便利だったなぁと思いますが、全然使いこなしてないNetBeansながら、とりあえずコード補完が生産性の向上に一役買ってます。

ナビゲートの宣言移動や、使用状況などの補完系も重宝。


ようやくPHPフレームワークをCodeIgniterと決め込みコードを書いててぶち当たったんですが…モデルクラスが補完できない。


CodeIgniterのモデルは

$this->load->model('モデルクラス名')

これで $this->モデルクラス名 として利用できるのですが、これだとNetBeansが補完してくれません…。


検索したところ、以下の情報を見つけました。

http://www.mybelovedphp.com/2009/01/27/netbeans-revisited-code-completion-for-code-igniter-ii/


phpDocumentorの@property 記述で /nbproject にファイルを置いておけば一応解決策になるようです。

モデルを追加するたびに発生する作業ですが…。


ファイル名は特に決まりはなく、自分は properties.php として

<?php
/**
 * @property Cards $Cards
 */
class Controller {}
のような感じで置きました。

コントローラやモデルソースの好きな箇所(MY_Controller、MY_Modelに書いておいて継承しておくのが一番楽だね)に記述しておいても有効でした。

これで、

$this->load->model('Cards');

としたときに

$this->C まで入力したとして $this->Cards 補完が行え、さらに $this->Cards-> まで入力すると $this->Cards->getCard() といったメソッド補完(一覧)が可能になります。

クラス補完の例:

nb01

メソッドの補完の例:

nb02

もっとスマートな方法があったら教えてください…。

もうひと準備。

キャリア、機種、UIDを扱うために pear::Net_UserAgent_Mobileをインストール。

#pear install Net_UserAgent_Mobile

Controllerコアを拡張して、コンストラクタでユーザエージェントオブジェクトを生成しておく。

<?php

include_once('Net/UserAgent/Mobile.php');

class MY_Controller extends Controller {

    public $UA;

    public function  __construct() {
        parent::Controller();

        $this->UA = Net_UserAgent_Mobile::singleton();
    }
}

あとは、このクラスを継承してコントローラを作成。


CodeIgniterはフックが実装されているので(デフォルトでは無効)、キャリア判別、UID認証などをフックで定義しておくと便利だと思います。


フック : CodeIgniter ユーザガイド 日本語版
http://codeigniter.jp/user_guide_ja/general/hooks.html

作りにもよるけど、pre_controller、pre_controller_constructorあたりでキャリア判別、UID認証ですかね。


と思ったものの、クラスよりも pre_system で関数としてフックしておいたほうが使いやすい気がした。


Net_UserAgent_Mobile Documentation
http://pear.php.net/package/Net_UserAgent_Mobile/docs/1.0.0/li_Net_UserAgent_Mobile.html

よく使うメソッドは
  • isDoCoMo
  • isSoftBank
  • isEZweb
  • getUID

↑このページのトップヘ