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. Подробности смотрите в файле ЛИЦЕНЗИИ.