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倍楽ですね。
コアクラスの拡張は難しい。