Calendar Decorators

Calendar Decorators --  Calendar_Decoratorとは

Calendar Decorators

Calendar_DecoratorCalendar_Decoratorクラスを利用するとサブクラスを使用しないで、カレンダーオブジェクトに機能を追加することができます。このことはいくつもの状況で利用できます。たとえば、カレンダーメソッドの返り値を修正するときやカレンダーをレンダリングするためのデータベースクエリーを受け取るときなどです(このようなときは、おそらく数字の月の名前を文字の月の名前に変換するでしょう)。

PEAR::Calendarで提供されるいくつかの具体的なdecoratorはこのライブラリを使用する際に問題となるいくつかのことに対応しています。これらはすべての人に適合するように設計されておらず、より狭い分野の問題を解決するように特化しています。これらはPHPエンジンに読み込まれるだけで、明示的にコードの中に含めなければなりません。次はdecoratorの便利な使い方の例です;


<?php
require_once 'Calendar/Day.php';
require_once 'Calendar/Decorator.php';

class WorkingDay extends Calendar_Decorator {
    function WorkingDay(& $Calendar) {
        parent::Calendar_Decorator($Calendar);
    }

    // Overides the default fetch method of the calendar object
    function fetch() {
        if ( $Hour = parent::fetch() ) {

            // Recursive fetch, return only hours between 8am and 6pm
            if ( $Hour->thisHour() < 8 || $Hour->thisHour() > 18 ) {
                return $this->fetch();
            } else {
                return $Hour;
            }
        } else {
            // Make sure to return FALSE when the real fetch returned nothing
            // or you'll get an infinite loop
            return FALSE;
        }
    }
}

// Create a normal day and build the hours
$Day = new Calendar_Day(date('Y'), date('n'), date('d'));
$Day->build();

// Create the decorator, passing it the normal day
$WorkingDay = new WorkingDay($Day);

// Only hours in a working day are displayed...
while ( $Hour = $WorkingDay->fetch() ) {
    echo ( $Hour->thisHour().'<br>' );
}
?>

The base Calendar_Decorator

基本クラスのCalendar_DecoratorはすべてのCalendarのサブクラスのAPIを"ミラー"しています。このクラスはそのコンストラクタでカレンダーオブジェクトを受け取り、 このことで、カレンダーオブジェクトはそのコンストラクタで オリジナルのカレンダーオブジェクトを直接呼び出すよりも、直接カレンダーオブジェクトを呼び出さずに、"継承"してAPIを利用可能にします。Calendar_Decoratorは単に、decoratingして適切な値を返すカレンダーオブジェクトを呼び出すだけです。

Decorators and Date Selection

decoraterのもうひとつの重要な利用方法はカレンダーをレンダリングするループにデータを"inject"することです。このことでデータベースの何種類かの"event"からデータを取り出すのが楽になります。どのようなbuild()メソッドから配列を選択する場合でも、選択されたデータオブジェクトはデフォルトのオブジェクトに置き換えられ、isSelected()メソッドを利用してfetch()ループ内で取得しなおすことができます。PEAR::Calendarをダウンロードして例をみてください。いつでも必要とするイベントのデータはデータベースへの一回の問い合わせで取得できるはずです