Recurr es una biblioteca PHP para trabajar con reglas de recurrencia (RRULE) y convertirlas en objetos DateTime.
Recurr fue desarrollado como precursor de un calendario con eventos recurrentes y está fuertemente inspirado en rrule.js.
La forma recomendada de instalar Recurr es a través de Composer.
composer require simshaun/recurr
Puede crear un nuevo objeto Regla pasando la cadena (RRULE) o una matriz con las partes de la regla, la fecha de inicio, la fecha de finalización (opcional) y la zona horaria.
$ 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 );
También puede utilizar métodos encadenados para crear su regla mediante programación y obtener la RRULE resultante.
$ 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(...)
devuelve una RecurrenceCollection
de objetos Recurrence
.Recurrence
tiene métodos getStart()
y getEnd()
que devuelven un objeto DateTime
.Rule
transformada carece de una fecha de finalización, getEnd()
devolverá un objeto DateTime
igual al de getStart()
.Nota: El transformador tiene un límite "virtual" (predeterminado 732) en la cantidad de objetos que genera. Esto evita que el script falle en una regla infinitamente recurrente. Puede cambiar el límite virtual con un objeto
ArrayTransformerConfig
que pasa aArrayTransformer
.
ArrayTransformer utiliza restricciones para permitir o evitar que se agreguen ciertas fechas a una RecurrenceCollection
. Recurr proporciona las siguientes restricciones:
AfterConstraint(DateTime $after, $inc = false)
BeforeConstraint(DateTime $before, $inc = false)
BetweenConstraint(DateTime $after, DateTime $before, $inc = false)
$inc
define lo que sucede si $after
o $before
son en sí mismos recurrencias. Si $inc = true
, se incluirán en la colección. Por ejemplo,
$ 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 ));
Nota: Si crea su propia restricción, es importante saber que las fechas que no cumplen con los requisitos de la restricción no cuentan para el límite virtual del transformador. Si configura manualmente la propiedad
$stopsTransformer
de su restricción enfalse
, el transformador podría fallar a través de un bucle infinito. ConsulteBetweenConstraint
para ver un ejemplo sobre cómo evitarlo.
RecurrenceCollection
posteriores a la transformación RecurrenceCollection
proporciona los siguientes métodos auxiliares encadenables para filtrar las recurrencias:
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
define lo que sucede si $after
o $before
son en sí mismos recurrencias. Si $inc = true
, se incluirán en la colección filtrada. Por ejemplo,
pseudo...
2014-06-01 startsBetween(2014-06-01, 2014-06-20) // false
2014-06-01 startsBetween(2014-06-01, 2014-06-20, true) // true
Nota:
RecurrenceCollection
extiende la clase ArrayCollection del proyecto Doctrine.
Recurr admite la transformación de algunas reglas de recurrencia en texto legible por humanos. Esta función aún está en versión beta y solo admite frecuencias anuales, mensuales, semanales y diarias.
$ rule = new Rule ( ' FREQ=YEARLY;INTERVAL=2;COUNT=3; ' , new DateTime ());
$ textTransformer = new TextTransformer ();
echo $ textTransformer -> transform ( $ rule );
Si necesita más que inglés, puede pasar un traductor con una de las configuraciones regionales admitidas (consulte la carpeta de traducciones) .
$ rule = new Rule ( ' FREQ=YEARLY;INTERVAL=2;COUNT=3; ' , new DateTime ());
$ textTransformer = new TextTransformer (
new Recurr Transformer Translator ( ' de ' )
);
echo $ textTransformer -> transform ( $ rule );
Este comportamiento es 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
No dudes en comentar o realizar solicitudes de extracción. Incluya pruebas con relaciones públicas.
Recurr tiene la licencia MIT. Consulte el archivo de LICENCIA para obtener más detalles.