Smartyで絵文字共通化機能を実装する
前ページで作成した半角変換修飾子に加えて、携帯向け画面作成で必要とされる絵文字共通化のメソッドの例をSmartyを使って実装します。
絵文字共通化には携帯3キャリア対応の絵文字ライブラリのText_Pictogram_Mobileを使用します。Text_Pictogram_Mobileはキャリア種別と文字コードを指定すると対応する絵文字コードのリストを返却するライブラリです。具体的な使い方は以下のようになります。
$picObject = Text_Pictogram_Mobile::factory(キャリアの種別, 文字コード); $emojilist = $picObject->getFormattedPictogramsArray();
$emojilistに各キャリアの指定した文字コードに該当する絵文字コードが配列で入ります。絵文字コードの順番は以下のURLのドコモの絵文字一覧が基準となっています。
上記の例では$emojilist[0]には「晴れ」の絵文字コードが、$emojilist[1]では「曇り」の絵文字コードが取得できます。上記のことを踏まえてアウトプットフィルタを利用して絵文字共通化メソッドを作成します。
function filter2emoji($buff, &$smarty) {
// アクセスしてきたキャリアを判別
$agent = Net_UserAgent_Mobile::singleton();
$carrier = "";
switch( true )
{
case ($agent->isDoCoMo()):
$carrier = "docomo";
break;
case ($agent->isVodafone()):
$carrier = "softbank";
break;
case ($agent->isEZweb()):
$carrier = "ezweb";
break;
}
// 対応する絵文字コードを取得
$picObject = Text_Pictogram_Mobile::factory($carrier,'sjis');
$emojilist = $picObject->getFormattedPictogramsArray();
$_before = array();
$_after = array();
// [=index=]に対応する絵文字コードを配列に格納
foreach ($emojilist as $key=>$emoji){
$_before[] = "[={$key}=]";
$_after[] = $emojilist[$key];
}
// テンプレート内の[=数値=]を絵文字コードに置換
return str_replace($_before, $_after, $buff);
}
// アウトプットフィルタを登録
$smarty->register_outputfilter("filter2sjis");
$smarty->register_outputfilter("filter2emoji");
// テンプレートを表示
$smarty->display("books_mobile.tpl");
キャリアの判別にはNet_UserAgent_Mobileライブラリを利用します。Text_Pictogram_Mobileには「docomo」「softbank」「ezweb」の文字列でキャリア種別を渡します。前ページで作成したアウトプットフィルタ「filter2sjis」を先に実行してSJISに文字コードを変換するので、絵文字コードの指定は「sjis」で行っています。
{foreach from=$books key=k item=i}
[={$k+125}=] {$i.title|convert_z2h} <br /><br />
{/foreach}
書籍リストの左側に番号の絵文字を表示します。絵文字の「1」がドコモの絵文字一覧で125番目なのでSmarty変数$booksの0番目を125番目の絵文字にして、ループするごとに+1となるようにしています。
本連載第1回で紹介したFirefoxの携帯シュミレーターアドオンFireMobileSimulator、もしくは携帯実機を使って3キャリアでbooks_mobile.phpにアクセスしてみます。

各キャリアで数字の絵文字が表示されていることが分かります。
Smartyでメールテンプレート
Smartyを利用してメールテンプレートとメール送信のプログラムを分離します。
メール送信のPHPは本連載第3回で作成したMailSender.class.phpにテンプレートからメール件名、本文を取得するメソッドを追加して実装します。メール件名、本文をテンプレートに記述しておき、「送信者名」「送信元アドレス」「送信先アドレス」「テンプレート名」「Smarty変数割り当てデータ」を渡してメールを送信するメソッドを作成します。
function sendByTemplate($from_name, $from_mail, $to, $template, $data=array())
{
// Smartyインスタンスの作成
$smarty = new Smarty();
// テンプレートディレクトリ設定
$smarty->template_dir = "templates";
// コンパイル済みテンプレートディレクトリ設定
$smarty->compile_dir = "templates_c";
// Smarty変数の割り当て
foreach($data as $k=>$v){
$smarty->assign($k, $v);
}
// テンプレート実行
$text = $smarty->fetch($template);
// Subject と メール本文を分割
list($header, $body) = preg_split('/\r?\n\r?\n/', $text, 2);
// 件名のみ取得する
$subject = explode(':', $header);
// send メソッドで送信
$this->send($from_name, $from_mail, $subject[1], $body, $to);
}
Smartyインスタンスでテンプレートに変数を割り当てて、件名と本文を取得後、MailSender.class.phpのsendメソッドを実行してメールを送信します。文字コードの変換はsendメソッド内で行っておりますのでこのメソッドでは文字コード変換は行っていません。
メソッド呼び出し元のPHPとテンプレートは以下のようになります。
include('config.php');
// DBより情報を取得
$pdo = new PDO("{$dbType}:host={$MYSQL_HOST}; dbname={$MYSQL_DATABASE}","{$MYSQL_USER}", "{$MYSQL_PASSWORD}");
$stmt = $pdo->prepare("SELECT title , DATE_FORMAT(published_date,'%Y/%m/%d') as published FROM books ");
$stmt->execute(array());
$row = $stmt->fetchAll(PDO::FETCH_ASSOC);
// テンプレートに渡す配列を作成
$data = array();
$data['books'] = $row;
// MailSenderクラスをコール
$m = new MailSender();
$m->sendByTemplate('送信者名', '送信元アドレス', '送信先アドレス', 'books_mail.tpl', $data);
Subject:新刊のお知らせ
以下のように新刊が発売されています。
{foreach from=$books key=k item=i}
{$i.title} ( {$i.published}発売 )
{/foreach}
上記のように動的にデータが変わる部分はPHPで、静的な部分はテンプレートに記述することでプログラムとメールテンプレートをSmartyを使って分離できます。books_mail.phpの実行結果は以下のようになります。

テンプレートの通りに書籍のデータが配置されていることが確認できます。
まとめ
一般的にSmartyはHTMLのテンプレートエンジンとして使用されていることが多いと思います。Smartyは出力をコントロールする機能やプラグイン、フィルタなどオプション的な機能をデフォルトで多数備えています。
Smartyの機能を組み合わせたりカスタマイズしたりすることで、ロジックとビューを分離するだけでなく、開発したい機能を比較的容易に実装できる場合もあると思うので、皆さんもぜひ使いこんでみてください。
