Recurr — это PHP-библиотека для работы с правилами повторения (RRULE) и преобразования их в объекты DateTime.
Recurr был разработан как предшественник календаря с повторяющимися событиями и во многом вдохновлен rrule.js.
Рекомендуемый способ установки Recurr — через Composer.
composer require simshaun/recurr
Вы можете создать новый объект правила, передав строку (RRULE) или массив с частями правила, датой начала, датой окончания (необязательно) и часовым поясом.
$ 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 );
Вы также можете использовать связанные методы для программного построения правила и получения результирующего RRULE.
$ 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(...)
возвращает RecurrenceCollection
объектов Recurrence
.Recurrence
имеет методы getStart()
и getEnd()
которые возвращают объект DateTime
.Rule
отсутствует дата окончания, getEnd()
вернет объект DateTime
равный объекту getStart()
.Примечание. Трансформатор имеет «виртуальный» лимит (по умолчанию 732) на количество генерируемых объектов. Это предотвращает сбой сценария при бесконечно повторяющемся правиле. Вы можете изменить виртуальный предел с помощью объекта
ArrayTransformerConfig
, который вы передаете вArrayTransformer
.
Ограничения используются ArrayTransformer, чтобы разрешить или запретить добавление определенных дат в RecurrenceCollection
. Recurr предоставляет следующие ограничения:
AfterConstraint(DateTime $after, $inc = false)
BeforeConstraint(DateTime $before, $inc = false)
BetweenConstraint(DateTime $after, DateTime $before, $inc = false)
$inc
определяет, что произойдет, если $after
или $before
сами являются повторениями. Если $inc = true
, они будут включены в коллекцию. Например,
$ 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 ));
Примечание. При создании собственного ограничения важно знать, что даты, не соответствующие требованиям ограничения, не учитываются в виртуальном пределе преобразователя. Если вы вручную установите для свойства
$stopsTransformer
ограничения значениеfalse
, преобразователь может выйти из строя из-за бесконечного цикла. См. примерBetweenConstraint
о том, как этого избежать.
RecurrenceCollection
после преобразования RecurrenceCollection
предоставляет следующие вспомогательные методы для фильтрации повторений:
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
определяет, что произойдет, если $after
или $before
сами являются повторениями. Если $inc = true
, они будут включены в отфильтрованную коллекцию. Например,
pseudo...
2014-06-01 startsBetween(2014-06-01, 2014-06-20) // false
2014-06-01 startsBetween(2014-06-01, 2014-06-20, true) // true
Примечание.
RecurrenceCollection
расширяет класс ArrayCollection проекта Doctrine.
Recurr поддерживает преобразование некоторых правил повторения в удобочитаемый текст. Эта функция все еще находится в стадии бета-тестирования и поддерживает только ежегодную, ежемесячную, еженедельную и ежедневную частоту.
$ rule = new Rule ( ' FREQ=YEARLY;INTERVAL=2;COUNT=3; ' , new DateTime ());
$ textTransformer = new TextTransformer ();
echo $ textTransformer -> transform ( $ rule );
Если вам нужно больше, чем английский, вы можете использовать переводчик с одной из поддерживаемых локалей (см. папку «Переводы») .
$ rule = new Rule ( ' FREQ=YEARLY;INTERVAL=2;COUNT=3; ' , new DateTime ());
$ textTransformer = new TextTransformer (
new Recurr Transformer Translator ( ' de ' )
);
echo $ textTransformer -> transform ( $ rule );
Это поведение настраивается:
$ 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
Не стесняйтесь комментировать или делать запросы на включение. Пожалуйста, включите тесты в PR.
Recurr лицензируется по лицензии MIT. Подробности смотрите в файле ЛИЦЕНЗИИ.