Décorateurs de Calendar

Décorateurs de Calendar --  A quoi sert Calendar_Decorator

Décorateurs de Calendar

La classe Calendar_Decorator est fournie pour vous aider à ajouter des fonctionnalités à des objets Calendar existants sans avoir besoin de les dériver. Cela est utile dans plusieurs situations, comme, permettre d'afficher le résultat d'une requête sous forme d'un Calendrier ou encore pour modifier les valeurs retournées par les méthodes de Calendar (convertir un numéro de mois en nom de mois).

Quelques décorateurs concrets sont fournis avec PEAR::Calendar, pour répondre aux problèmes communs que vous pouvez rencontrer en utilisant cette librairie. Ils ne sont pas faits pour répondre aux besoins particuliers de chacuns, mais ils pourront vous servir de base pour résoudre vos problèmes. Ils ne seront analysés par PHP que si vous les incluez explicitement dans votre code. Un exemple d'utilisation :
<?php

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

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

    // On écrase la méthode fetch de l'objet Calendar
    function fetch() {
        if ( $Hour = parent::fetch() ) {

            // Mode récursif, on ne retourne que les heures entre 8 heures du matin et 6 heures du soir
            if ( $Hour->thisHour() < 8 || $Hour->thisHour() > 18 ) {
                return $this->fetch();
            } else {
                return $Hour;
            }
        } else {
            // Assurez-vous de retourner FALSE lorsque la vrai méthode fetch n'a rien retourné
            // sinon vous aurez une boucle infinie
            return FALSE;
        }
    }
}

// On crée la date du jour et on construit les heures
$Day = new Calendar_Day(date('Y'), date('n'), date('d'));
$Day->build();

// On crée le décorateur en passant la date du jour
$WorkingDay = new WorkingDay($Day);

// Seule les heures de travail sont affichées
while ( $Hour = $WorkingDay->fetch() ) {
    echo ( $Hour->thisHour().'<br />' );
}
?>

La classe de base Calendar_Decorator

La classe de base Calendar_Decorator permet d'accéder à l'API combinée de toutes les sous-classes de Calendar. Son constructeur doit recevoir un objet Calendar. La classe Calendar_Decorator prend alors le dessus sur l'API de cet objet vous permettant d'y accéder directement à travers le nouvel objet créé. Calendar_Decorator route tous les appels vers l'objet qu'il agrémente et renvoie les valeurs appropriées.

Décorateurs et Sélection de Date

Une des fonctionnalités intéressante des décorateurs permet d' "injecter" des données dans la boucle permettant de créer les calendriers. Celà peut par exemple vous permettre d'intéragir avec une base de données. Lorsque un tableau sélectionné est passé à n'importe quelle méthode build(), les objets date sélectionnés remplaceront les objets construits par défaut, vous permettant de les récupérer en utilisant une boucle fetch(), utilisant la méthode isSelected(). Vous trouverez dans un exemple de celà sur la page de PEAR::Calendar. Il doit toujours être possible de récupérer les données d'un évènement dont vous avez besoin avec une simple requête à la base de données.

Les décorateurs embarqués

PEAR::Calendar fournit de base quelques décorateurs :

Exemple avec Calendar_Decorator_Textual

Ce décorateur définit quelques méthodes qui peuvent être utiles pour gérer les noms des mois et des jours :

Exemple avec Calendar_Decorator_Uri

Méthodes définies par ce décorateur :

Un exemple simple d'utilisation :
$Day = new Calendar_Day(2003, 10, 23);
$Uri = & new Calendar_Decorator_Uri($Day);
$Uri->setFragments('year', 'month', 'day');
echo $Uri->prev('day');
// Affiche year=2003&month=10&day=22

Exemple avec Calendar_Decorator_Weekday

Méthodes définies par ce décorateur :

Exemple :
$Day = new Calendar_Day(2003, 10, 23);
$Weekday = & new Calendar_Decorator_Weekday($Day);
$Weekday->setFirstDay(0); // définie le premier jour de la semaine à Dimanche (défaut : Lundi)
echo $Weekday->thisWeekDay(); // Affiche 5 - cinquième jour de la semaine par rapport à Dimanche

Exemple avec Calendar_Decorator_Wrapper

require_once 'Calendar/Month.php';
require_once 'Calendar/Decorator.php'; // Pas vraiment nécessaire mais ajouter pour aider à donner un sens
require_once 'Calendar/Decorator/Wrapper.php';

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

    function thisDay()
    {
        return '<strong>'.parent::thisDay().'</strong>';
    }
}

$Month = new Calendar_Month(date('Y'), date('n'));

$Wrapper = & new Calendar_Decorator_Wrapper($Month);
$Wrapper->build();

echo '<h2>The Wrapper decorator</h2>';
echo '<i>Day numbers are rendered in bold</i><br /> <br />';
while ($DecoratedDay = $Wrapper->fetch('MyBoldDecorator')) {
    echo $DecoratedDay->thisDay().'<br />';
}