DateHelperを拡張してMM-dd形式の日付を出力させる
<?php echo format_date('2009-03-12 03:29:36') // 03-12 ?>
というような出力をしたくて、DateHelper.php -> sfDateFormat.class.phpと辿って行くと、getPattern関数に与える引数で形式を変えられることが判明。しかし、MM-dd形式での返り値がない!
sfDateFormat.class.phpをオーバライドすればいいのですが、DateHelper.phpでsfDateFormat.class.phpを呼ぶと決まっているので、オーバライドできない。
結局、DateHelper.phpをオーバライドして、sfDateFormat.class.phpをオーバライドしたクラスを呼び出すようにする。
という回りくどい方法で解決しました。
sfDateFormat.class.phpをオーバライドしたmyDateFormat.class.phpを作成
<?php // app/frontend/lib/myDateFormat.class.php class myDateFormat extends sfDateFormat { /** * Gets the pattern from DateTimeFormatInfo or some predefined patterns. * If the $pattern parameter is an array of 2 element, it will assume * that the first element is the date, and second the time * and try to find an appropriate pattern and apply * DateTimeFormatInfo::formatDateTime * See the tutorial documentation for futher details on the patterns. * * @param mixed $pattern a pattern. * @return string a pattern. * @see DateTimeFormatInfo::formatDateTime() */ public function getPattern($pattern) { if (is_array($pattern) && count($pattern) == 2) { return $this->formatInfo->formatDateTime($this->getPattern($pattern[0]), $this->getPattern($pattern[1])); } switch ($pattern) { case 'd': return $this->formatInfo->ShortDatePattern; break; case 'D': return $this->formatInfo->LongDatePattern; break; case 'p': return $this->formatInfo->MediumDatePattern; break; case 'P': return $this->formatInfo->FullDatePattern; break; case 't': return $this->formatInfo->ShortTimePattern; break; case 'T': return $this->formatInfo->LongTimePattern; break; case 'q': return $this->formatInfo->MediumTimePattern; break; case 'Q': return $this->formatInfo->FullTimePattern; break; case 'f': return $this->formatInfo->formatDateTime($this->formatInfo->LongDatePattern, $this->formatInfo->ShortTimePattern); break; case 'F': return $this->formatInfo->formatDateTime($this->formatInfo->LongDatePattern, $this->formatInfo->LongTimePattern); break; case 'g': return $this->formatInfo->formatDateTime($this->formatInfo->ShortDatePattern, $this->formatInfo->ShortTimePattern); break; case 'G': return $this->formatInfo->formatDateTime($this->formatInfo->ShortDatePattern, $this->formatInfo->LongTimePattern); break; case 'i': return 'yyyy-MM-dd'; break; case 'I': return 'yyyy-MM-dd HH:mm:ss'; break; case 'm': // 今回追加した部分 return 'MM-dd'; break; case 'M': return 'MMMM dd'; break; case 'R': case 'r': return 'EEE, dd MMM yyyy HH:mm:ss'; break; case 's': return 'yyyy-MM-ddTHH:mm:ss'; break; case 'u': return 'yyyy-MM-dd HH:mm:ss z'; break; case 'U': return 'EEEE dd MMMM yyyy HH:mm:ss'; break; case 'Y': case 'y': return 'yyyy MMMM'; break; default : return $pattern; } } }
同名のヘルパーがあると、ローカルのを優先して使うのを利用する
$ mkdir app/frontend/lib/helper $ cp /usr/share/pear/symfony/helper/DateHelper.php app/frontend/lib/helper/
DateFormatクラス名を置換
$ vim app/frontend/lib/helper/DateHelper.php :s/sfDateFormat/myDateFormat/
以上で、format_dateの第2引数に'm'を渡すと、MM-dd形式で返ってきます。
<?php echo format_date('2009-03-12 03:29:36', 'm') // 03-12 ?>
/usr/share/pear/symfony/i18n/sfDateFormat.class.php を直接編集した方が100倍楽ですね。
コアクラスの拡張は難しい。