SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

目的に応じて適材適所で使うPHPライブラリ

WEBシステムの様々な機能をSmartyを使って実装する

目的に応じて適材適所で使うPHPライブラリ(7)

Smartyで絵文字共通化機能を実装する

 前ページで作成した半角変換修飾子に加えて、携帯向け画面作成で必要とされる絵文字共通化のメソッドの例をSmartyを使って実装します。

 絵文字共通化には携帯3キャリア対応の絵文字ライブラリのText_Pictogram_Mobileを使用します。Text_Pictogram_Mobileはキャリア種別と文字コードを指定すると対応する絵文字コードのリストを返却するライブラリです。具体的な使い方は以下のようになります。

[リスト19]Text_Pictogram_Mobileの使用例
$picObject = Text_Pictogram_Mobile::factory(キャリアの種別, 文字コード);
$emojilist = $picObject->getFormattedPictogramsArray();

 $emojilistに各キャリアの指定した文字コードに該当する絵文字コードが配列で入ります。絵文字コードの順番は以下のURLのドコモの絵文字一覧が基準となっています。

 上記の例では$emojilist[0]には「晴れ」の絵文字コードが、$emojilist[1]では「曇り」の絵文字コードが取得できます。上記のことを踏まえてアウトプットフィルタを利用して絵文字共通化メソッドを作成します。

[リスト20]books_mobile.php(抜粋)
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」で行っています。

[リスト21]books_mobile.tpl(抜粋)
{foreach from=$books key=k item=i}
    [={$k+125}=]&nbsp;{$i.title|convert_z2h} <br /><br />
{/foreach}

 書籍リストの左側に番号の絵文字を表示します。絵文字の「1」がドコモの絵文字一覧で125番目なのでSmarty変数$booksの0番目を125番目の絵文字にして、ループするごとに+1となるようにしています。

 本連載第1回で紹介したFirefoxの携帯シュミレーターアドオンFireMobileSimulator、もしくは携帯実機を使って3キャリアでbooks_mobile.phpにアクセスしてみます。

books_mobile.php実行結果
books_mobile.php実行結果

 各キャリアで数字の絵文字が表示されていることが分かります。

Smartyでメールテンプレート

 Smartyを利用してメールテンプレートとメール送信のプログラムを分離します。

 メール送信のPHPは本連載第3回で作成したMailSender.class.phpにテンプレートからメール件名、本文を取得するメソッドを追加して実装します。メール件名、本文をテンプレートに記述しておき、「送信者名」「送信元アドレス」「送信先アドレス」「テンプレート名」「Smarty変数割り当てデータ」を渡してメールを送信するメソッドを作成します。

[リスト22]MailSender.class.php(抜粋)
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とテンプレートは以下のようになります。

[リスト23]books_mail.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);
[リスト24]books_mail.tpl
Subject:新刊のお知らせ

以下のように新刊が発売されています。

{foreach from=$books key=k item=i}
{$i.title} ( {$i.published}発売 )
{/foreach}

 上記のように動的にデータが変わる部分はPHPで、静的な部分はテンプレートに記述することでプログラムとメールテンプレートをSmartyを使って分離できます。books_mail.phpの実行結果は以下のようになります。

books_mail.php実行結果
books_mail.php実行結果

 テンプレートの通りに書籍のデータが配置されていることが確認できます。

まとめ

 一般的にSmartyはHTMLのテンプレートエンジンとして使用されていることが多いと思います。Smartyは出力をコントロールする機能やプラグイン、フィルタなどオプション的な機能をデフォルトで多数備えています。

 Smartyの機能を組み合わせたりカスタマイズしたりすることで、ロジックとビューを分離するだけでなく、開発したい機能を比較的容易に実装できる場合もあると思うので、皆さんもぜひ使いこんでみてください。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
目的に応じて適材適所で使うPHPライブラリ連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5123 2010/05/25 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー