Google Crisis Response(Google)
災害に関する情報源や、行方不明者情報の収集と検索を行う『パーソンファインダー』を初めとするツールの提供が行われています。

2008年3月16日 日曜日

Smarty で date() の書式設定を使う

Filed under: プログラミング
時間:22時39分
投稿者:よしとも
AddClips 経由でソーシャルブックマークに登録

 Smarty というテンプレートエンジンがあります。おそらく、PHP では定番中の定番だと思います。

 この Smarty は私のお気に入りでして、PHP でそれなりの規模のもの(といっても、プログラムとしては小さなものですが)を作るときには必ずといっていいほど使っています。現在製作中のものにも使っているのですが、日付を表示させる部分で不満がありました。1桁の時には10の位の部分が0になったり半角スペースになってしまうのです。

 書式を指定して日付を表示するには date_format という就職子を使うのですが、書式がいまいち充実していなくて思うような表示をさせることができません。データ保持に使っている MySQL のほうがよっぽど多機能だったので、思わずそちらで整形済みの日付を作成してしまいました。しかし、できれば Smarty 側で処理をさせたいと思い、大雑把ですがプラグイン機能を使って実装してしまいました。

実装

 実装したといっても、大したことはやってなかったりします。もともと date_format もプラグインとして実装されていて、内部では PHP の strftime() という組み込み関数を使用しています。冒頭で書いた不満は、この関数の機能に起因します。

 対して、同じ組み込み関数である date() では、1桁の時には1桁で表示するということが可能です。そこで、date_format のファイルを基にして date() を使うようにしてみたというわけです。それが次のコードです。ライセンスは Smarty に従って LGPL となります。

  1. <?php
  2. /**
  3.  * Smarty plugin
  4.  * @package Smarty
  5.  * @subpackage plugins
  6.  */
  7.  
  8. /**
  9.  * Include the {@link shared.make_timestamp.php} plugin
  10.  */
  11. require_once $smarty->_get_plugin_filepath('shared', 'make_timestamp');
  12. /**
  13.  * Smarty date_format modifier plugin
  14.  *
  15.  * Type:     modifier<br>
  16.  * Name:     date<br>
  17.  * Purpose:  format datestamps via date<br>
  18.  * Input:<br>
  19.  *         - string: input date string
  20.  *         - format: strftime format for output
  21.  *         - default_date: default date if $string is empty
  22.  * @author   Yoshitomo
  23.  * @param string
  24.  * @param string
  25.  * @param string
  26.  * @return string|void
  27.  * @uses smarty_make_timestamp()
  28.  */
  29. function smarty_modifier_date($string, $format = 'M d, Y', $default_date = '')
  30. {
  31.     if ($string != '') {
  32.         $timestamp = smarty_make_timestamp($string);
  33.     } elseif ($default_date != '') {
  34.         $timestamp = smarty_make_timestamp($default_date);
  35.     } else {
  36.         return;
  37.     }
  38.     return date($format, $timestamp);
  39. }
  40.  
  41. /* vim: set expandtab: */
  42.  
  43. ?>

 この内容を、modifier.date.php というファイル名で保存して、Smarty のプラグインディレクトリに置いてください。使い方は書式が date() に従うというだけで、あとは date_format と同じです。

[Smarty]
{$date_value|date:”Y年n月j日”}
[/Smarty]

残る不満

 無事便利になったわけですが、分と秒に関しては結局満足できる結果にはなりませんでした。この2つの項目は、なぜか1桁で表示するという書式設定ができません。
 書式の表をよく見てみると、小文字のときは0がついて、大文字の時には0がつかないと言うようになっていることがわかります。そして、分と秒に対する0のつく場合の文字としては i と s があり、その大文字である I と S はすでに別の項目で使われてしまっています。大文字と小文字の対応を崩したくないために実装していないのではないかと、思わず疑ってしまいました。

 I も S も、日本ではあまり需要がない項目であるのがなんとも残念です。時間を見て実装をと思っていますが、もしすでにあってご存知でしたらぜひ教えてください。

Comments (0)

HTML convert time: 0.148 sec. Powered by

Images is enhanced with WordPress Lightbox JS by Zeo