PEAR::Calendar には全部で 12 のクラスがあり、あなたが解決しようとしている問題に応じてそれらを使い分けます。 これらのクラスは日付クラス、表形式の日付クラス、バリデーションクラス、デコレーションクラスに分類できます。
基本的で日常的な日付を提供します。これらはすべて Calendar のサブクラスで、以下のメソッドが提供されています。
Calendar_Year - 年を表すクラスで、Calendar_Month, Calendar_Month_Weekdays と Calendar_Month_Weeks オブジェクトを構築することができます。
require_once 'Calendar/Year.php'; |
Calendar_Month - 月を表すクラスで、Calendar_Day オブジェクトを構築することができます。
require_once 'Calendar/Month.php'; |
Calendar_Day - 日を表すクラスで、Calendar_Hour オブジェクトを構築することができます。.
require_once 'Calendar/Day.php'; |
Calendar_Hour - 時間を表すのクラスで、Calendar_Minute オブジェクトを構築することができます。
require_once 'Calendar/Hour.php'; |
Calendar_Minute - 分を表すクラスで、Calendar_Second オブジェクトを構築することができます。
require_once 'Calendar/Minute.php'; |
Calendar_Second - 秒を表すクラスです。他のオブジェクトは構築しません。
require_once 'Calendar/Second.php'; |
表形式で整形されたカレンダーを構築します。これらはすべてCalendar のサブクラスで、以下のメソッドが提供されています。
Calendar_Month_Weekdays - Calendar_Day オブジェクトを構築し、isFirst(), isLast() と isEmpty() の状態を設定します。表形式のフォームで月を表示するために使用されます。
require_once 'Calendar/Month/Weekdays.php'; |
Calendar_Month_Weeks - Calendar_Weekを構築します。週を表す表で、一ヶ月を表します(どのような週の表現があるかは FAQ を参照してください)。
require_once 'Calendar/Month/Weeks.php'; |
Calendar_Week - 7 つの Calendar_Day オブジェクトを構築します。Calendar_Month_Weeks オブジェクトに継承された場合は、その月の週を表形式で表し、必要なら isEmpty() の状態を設定します。
require_once 'Calendar/Week.php'; |
日付の妥当性を検証するために使用します。Calendar の提供する検証メソッドは 2 種類あります。isValid() は、任意の日付に対する簡単なチェックを行います。getValidator() は、より詳細な検証を行うための Calendar_Validator のインスタンスを返します。
Calendar_Validator - これはあなたのコードで直接インスタンスを作成するものではありません (明確に include し、それを作成する必要があります)。しかし Calendar::getValidator() からの返値のかわりに、Calendar の任意のサブクラスを呼び出せます。このクラスは日付を細かくvalidatし、正確にどこが悪かったかを検出するのに使用できます (単純な検証なら、日付オブジェクトや表形式日付オブジェクトに対して isValid() メソッドを呼び出すことだけで、正しい値で作成されたかどうかを知ることができます)。
Calendar_Validation_Error - 検証エラーを表します。このクラスはどこが悪かったのかを検出するメソッドを提供します。利用できるメソッドは getUnit() (たとえば年あるいは月を返します)、getValue() (失敗している値を返します)、getMessage() (検証エラーメッセージを返します) およびここまでに述べた 3 つのメソッドをまとめた値を返す toString() です。デフォルトの検証エラーメッセージは英語ですが、定数 CALENDAR_VALUE_TOOSMALL と CALENDAR_VALUE_TOOLARGE についてはコードの中で再定義できます。
カレンダーオブジェクトの本体 (Calendar を継承したクラス) に機能を追加するものです。明示的にそれらを拡張する必要がなくなり、フィールドを偶然に上書きしてしまうリスクも回避できます。デコレータを作成するときは、そのコンストラクタにカレンダーオブジェクトのインスタンスを渡します。すると、オリジナルのカレンダーオブジェクトを呼び出すのとまったく同じようにデコレータを呼び出すことができるようになります。これによってカレンダーのメソッドを "上書き" することができるようになります。またそれだけではなく、新しいメソッドを追加したり、同一カレンダーオブジェクトに複数のデコレータを適用したりすることもできるようになります。デコレータを使用する場面としては、カレンダーがレンダリングされるループに (選択、あるいは Calendar_Decorator_Wrapper デコレータを使用して)「注入」したり、出力内容を変更したり (例えば 1 => January のように月の表現法を数字から文字に変換する) といったものがあります。
PEAR::Calendar では、ありがちな問題に対応するためのデコレータの実装をいくつか提供しています。これらは万人向けに設計されているわけではなく、必要に応じて使用できるようにオプションのコードとして提供されています (これにより、使いもしないコードをパースするために速度が低下してしまうといった現象を避けています)。
Calendar_Decorator - デコレータの基底クラスです。これを直接使用するのではなく、このクラスを拡張して使用しなければなりません。デコレート対象のカレンダークラスと同じ API を提供し、このクラスを通じてカレンダーをコールします。例えば次のようになります。
require_once 'Calendar/Decorator.php'; class ChristmasDecorator extends Calendar_Decorator { function ChristmasDecorator(&$Calendar) { parent::Calendar_Decorator($Calendar); } // 追加する何らかのメソッド function getDaysToChristmas() { $today = parent::thisDay(true); $Christmas = new Calendar_Day(date('Y'), 12, 25); $xmasday = $Christmas->thisDay(TRUE); $diff = $xmasday - $today; if ($diff < 0) { $NextChristmas = new Calendar_Day($Christmas->nextYear(), 12, 25); $nextxmasday = $NextChristmas->thisDay(true); $diff = $today - $nextxmasday; } return ($diff / 86400); } } |
Calendar_Decorator_Uri - URL (例えば「次」や「前」を表す URL など) の作成を補助するデコレータです。
require_once 'Calendar/Decorator/Uri.php'; |
Calendar_Decorator_Textual - カレンダーオブジェクトから文字の月名と曜日を取得することを助けます。
require_once 'Calendar/Decorator/Textual.php'; |
Calendar_Decorator_Wrapper - あなたが使用しているカレンダーオブジェクトの子クラスにデコレートを追加することを補助するためのクラスです。build() の後で fetch() または fetchAll() がコールされた際に、指定したオブジェクトの子オブジェクトをラップします。
require_once 'Calendar/Decorator/Wrapper.php'; |