Recurr est une bibliothèque PHP permettant de travailler avec des règles de récurrence (RRULE) et de les convertir en objets DateTime.
Recurr a été développé comme précurseur d'un calendrier avec des événements récurrents et s'inspire fortement de rrule.js.
La méthode recommandée pour installer Recurr consiste à utiliser Composer.
composer require simshaun/recurr
Vous pouvez créer un nouvel objet Rule en passant la chaîne (RRULE) ou un tableau avec les parties de la règle, la date de début, la date de fin (facultatif) et le fuseau horaire.
$ timezone = ' America/New_York ' ;
$ startDate = new DateTime ( ' 2013-06-12 20:00:00 ' , new DateTimeZone ( $ timezone ));
$ endDate = new DateTime ( ' 2013-06-14 20:00:00 ' , new DateTimeZone ( $ timezone )); // Optional
$ rule = new Recurr Rule ( ' FREQ=MONTHLY;COUNT=5 ' , $ startDate , $ endDate , $ timezone );
Vous pouvez également utiliser des méthodes chaînées pour créer votre règle par programme et obtenir la RRULE résultante.
$ rule = ( new Recurr Rule )
-> setStartDate ( $ startDate )
-> setTimezone ( $ timezone )
-> setFreq ( ' DAILY ' )
-> setByDay ([ ' MO ' , ' TU ' ])
-> setUntil ( new DateTime ( ' 2017-12-31 ' ))
;
echo $ rule -> getString (); //FREQ = DAILY ; UNTIL=20171231T000000 ; BYDAY=MO , TU
$ transformer = new Recurr Transformer ArrayTransformer ();
print_r ( $ transformer -> transform ( $ rule ));
$transformer->transform(...)
renvoie une RecurrenceCollection
d'objets Recurrence
.Recurrence
possède les méthodes getStart()
et getEnd()
qui renvoient un objet DateTime
.Rule
transformée n'a pas de date de fin, getEnd()
renverra un objet DateTime
égal à celui de getStart()
.Remarque : Le transformateur a une limite « virtuelle » (par défaut 732) sur le nombre d'objets qu'il génère. Cela évite que le script plante sur une règle infiniment récurrente. Vous pouvez modifier la limite virtuelle avec un objet
ArrayTransformerConfig
que vous transmettez àArrayTransformer
.
Les contraintes sont utilisées par ArrayTransformer pour autoriser ou empêcher l'ajout de certaines dates à un RecurrenceCollection
. Recurr fournit les contraintes suivantes :
AfterConstraint(DateTime $after, $inc = false)
BeforeConstraint(DateTime $before, $inc = false)
BetweenConstraint(DateTime $after, DateTime $before, $inc = false)
$inc
définit ce qui se passe si $after
ou $before
sont eux-mêmes des récurrences. Si $inc = true
, ils seront inclus dans la collection. Par exemple,
$ startDate = new DateTime ( ' 2014-06-17 04:00:00 ' );
$ rule = new Recurr Rule ( ' FREQ=MONTHLY;COUNT=5 ' , $ startDate );
$ transformer = new Recurr Transformer ArrayTransformer ();
$ constraint = new Recurr Transformer Constraint BeforeConstraint ( new DateTime ( ' 2014-08-01 00:00:00 ' ));
print_r ( $ transformer -> transform ( $ rule , $ constraint ));
Remarque : Si vous créez votre propre contrainte, il est important de savoir que les dates qui ne répondent pas aux exigences de la contrainte ne sont pas prises en compte dans la limite virtuelle du transformateur. Si vous définissez manuellement la propriété
$stopsTransformer
de votre contrainte surfalse
, le transformateur peut planter via une boucle infinie. VoirBetweenConstraint
pour un exemple sur la façon d'éviter cela.
RecurrenceCollection
post-transformation RecurrenceCollection
fournit les méthodes d'assistance chaînables suivantes pour filtrer les récurrences :
startsBetween(DateTime $after, DateTime $before, $inc = false)
startsBefore(DateTime $before, $inc = false)
startsAfter(DateTime $after, $inc = false)
endsBetween(DateTime $after, DateTime $before, $inc = false)
endsBefore(DateTime $before, $inc = false)
endsAfter(DateTime $after, $inc = false)
$inc
définit ce qui se passe si $after
ou $before
sont eux-mêmes des récurrences. Si $inc = true
, ils seront inclus dans la collection filtrée. Par exemple,
pseudo...
2014-06-01 startsBetween(2014-06-01, 2014-06-20) // false
2014-06-01 startsBetween(2014-06-01, 2014-06-20, true) // true
Remarque :
RecurrenceCollection
étend la classe ArrayCollection du projet Doctrine.
Recurr prend en charge la transformation de certaines règles de récurrence en texte lisible par l'homme. Cette fonctionnalité est encore en version bêta et ne prend en charge que les fréquences annuelles, mensuelles, hebdomadaires et quotidiennes.
$ rule = new Rule ( ' FREQ=YEARLY;INTERVAL=2;COUNT=3; ' , new DateTime ());
$ textTransformer = new TextTransformer ();
echo $ textTransformer -> transform ( $ rule );
Si vous avez besoin de plus que l'anglais, vous pouvez utiliser un traducteur avec l'un des paramètres régionaux pris en charge (voir le dossier des traductions) .
$ rule = new Rule ( ' FREQ=YEARLY;INTERVAL=2;COUNT=3; ' , new DateTime ());
$ textTransformer = new TextTransformer (
new Recurr Transformer Translator ( ' de ' )
);
echo $ textTransformer -> transform ( $ rule );
Ce comportement est configurable :
$ timezone = ' America/New_York ' ;
$ startDate = new DateTime ( ' 2013-01-31 20:00:00 ' , new DateTimeZone ( $ timezone ));
$ rule = new Recurr Rule ( ' FREQ=MONTHLY;COUNT=5 ' , $ startDate , null , $ timezone );
$ transformer = new Recurr Transformer ArrayTransformer ();
$ transformerConfig = new Recurr Transformer ArrayTransformerConfig ();
$ transformerConfig -> enableLastDayOfMonthFix ();
$ transformer -> setConfig ( $ transformerConfig );
print_r ( $ transformer -> transform ( $ rule ));
// 2013-01-31 , 2013-02-28 , 2013-03-31 , 2013-04-30 , 2013-05-31
N'hésitez pas à commenter ou à faire des pull request. Veuillez inclure des tests avec des PR.
Recurr est sous licence MIT. Voir le fichier LICENSE pour plus de détails.