Smarty というテンプレートエンジンがあります。おそらく、PHP では定番中の定番だと思います。
この Smarty は私のお気に入りでして、PHP でそれなりの規模のもの(といっても、プログラムとしては小さなものですが)を作るときには必ずといっていいほど使っています。現在製作中のものにも使っているのですが、日付を表示させる部分で不満がありました。1桁の時には10の位の部分が0になったり半角スペースになってしまうのです。
書式を指定して日付を表示するには date_format
という就職子を使うのですが、書式がいまいち充実していなくて思うような表示をさせることができません。データ保持に使っている MySQL のほうがよっぽど多機能だったので、思わずそちらで整形済みの日付を作成してしまいました。しかし、できれば Smarty 側で処理をさせたいと思い、大雑把ですがプラグイン機能を使って実装してしまいました。
実装
実装したといっても、大したことはやってなかったりします。もともと date_format もプラグインとして実装されていて、内部では PHP の strftime()
という組み込み関数を使用しています。冒頭で書いた不満は、この関数の機能に起因します。
対して、同じ組み込み関数である date()
では、1桁の時には1桁で表示するということが可能です。そこで、date_format
のファイルを基にして date()
を使うようにしてみたというわけです。それが次のコードです。ライセンスは Smarty に従って LGPL となります。
- <?php
- /**
- * Smarty plugin
- * @package Smarty
- * @subpackage plugins
- */
- /**
- * Include the {@link shared.make_timestamp.php} plugin
- */
- require_once $smarty->_get_plugin_filepath('shared', 'make_timestamp');
- /**
- * Smarty date_format modifier plugin
- *
- * Type: modifier<br>
- * Name: date<br>
- * Purpose: format datestamps via date<br>
- * Input:<br>
- * - string: input date string
- * - format: strftime format for output
- * - default_date: default date if $string is empty
- * @author Yoshitomo
- * @param string
- * @param string
- * @param string
- * @return string|void
- * @uses smarty_make_timestamp()
- */
- function smarty_modifier_date($string, $format = 'M d, Y', $default_date = '')
- {
- if ($string != '') {
- $timestamp = smarty_make_timestamp($string);
- } elseif ($default_date != '') {
- $timestamp = smarty_make_timestamp($default_date);
- } else {
- return;
- }
- return date($format, $timestamp);
- }
- /* vim: set expandtab: */
- ?>
この内容を、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 も、日本ではあまり需要がない項目であるのがなんとも残念です。時間を見て実装をと思っていますが、もしすでにあってご存知でしたらぜひ教えてください。