Recurr adalah perpustakaan PHP untuk bekerja dengan aturan perulangan (RRULE) dan mengubahnya menjadi objek DateTime.
Recurr dikembangkan sebagai pendahulu kalender dengan acara berulang, dan sangat terinspirasi oleh rrule.js.
Cara yang disarankan untuk menginstal Recurr adalah melalui Composer.
composer require simshaun/recurr
Anda dapat membuat objek Aturan baru dengan meneruskan string (RRULE) atau larik yang berisi bagian aturan, tanggal mulai, tanggal akhir (opsional), dan zona waktu.
$ 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 );
Anda juga dapat menggunakan metode berantai untuk membuat aturan secara terprogram dan mendapatkan RRULE yang dihasilkan.
$ 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(...)
mengembalikan objek RecurrenceCollection
dari Recurrence
.Recurrence
memiliki metode getStart()
dan getEnd()
yang mengembalikan objek DateTime
.Rule
yang diubah tidak memiliki tanggal akhir, getEnd()
akan mengembalikan objek DateTime
yang sama dengan getStart()
.Catatan: Trafo memiliki batas "virtual" (default 732) pada jumlah objek yang dihasilkannya. Hal ini mencegah skrip mogok pada aturan yang berulang tanpa batas. Anda dapat mengubah batas virtual dengan objek
ArrayTransformerConfig
yang Anda teruskan keArrayTransformer
.
Batasan digunakan oleh ArrayTransformer untuk mengizinkan atau mencegah tanggal tertentu ditambahkan ke RecurrenceCollection
. Recurr memberikan batasan berikut:
AfterConstraint(DateTime $after, $inc = false)
BeforeConstraint(DateTime $before, $inc = false)
BetweenConstraint(DateTime $after, DateTime $before, $inc = false)
$inc
mendefinisikan apa yang terjadi jika $after
atau $before
merupakan pengulangan. Jika $inc = true
, mereka akan disertakan dalam koleksi. Misalnya,
$ 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 ));
Catatan: Jika membuat batasan Anda sendiri, penting untuk mengetahui bahwa tanggal yang tidak memenuhi persyaratan batasan tidak diperhitungkan dalam batas virtual transformator. Jika Anda menyetel properti
$stopsTransformer
batasan Anda secara manual kefalse
, trafo mungkin mogok melalui loop tak terbatas. LihatBetweenConstraint
untuk contoh cara mencegahnya.
RecurrenceCollection
Pasca Transformasi RecurrenceCollection
menyediakan metode pembantu yang dapat dirantai berikut untuk menyaring pengulangan:
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
mendefinisikan apa yang terjadi jika $after
atau $before
merupakan pengulangan. Jika $inc = true
, mereka akan disertakan dalam koleksi yang difilter. Misalnya,
pseudo...
2014-06-01 startsBetween(2014-06-01, 2014-06-20) // false
2014-06-01 startsBetween(2014-06-01, 2014-06-20, true) // true
Catatan:
RecurrenceCollection
memperluas kelas ArrayCollection proyek Doktrin.
Recurr mendukung transformasi beberapa aturan perulangan menjadi teks yang dapat dibaca manusia. Fitur ini masih dalam versi beta dan hanya mendukung frekuensi tahunan, bulanan, mingguan, dan harian.
$ rule = new Rule ( ' FREQ=YEARLY;INTERVAL=2;COUNT=3; ' , new DateTime ());
$ textTransformer = new TextTransformer ();
echo $ textTransformer -> transform ( $ rule );
Jika Anda membutuhkan lebih dari bahasa Inggris, Anda dapat menggunakan penerjemah dengan salah satu bahasa lokal yang didukung (lihat folder terjemahan) .
$ rule = new Rule ( ' FREQ=YEARLY;INTERVAL=2;COUNT=3; ' , new DateTime ());
$ textTransformer = new TextTransformer (
new Recurr Transformer Translator ( ' de ' )
);
echo $ textTransformer -> transform ( $ rule );
Perilaku ini dapat dikonfigurasi:
$ 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
Jangan ragu untuk berkomentar atau membuat permintaan tarik. Harap sertakan tes dengan PR.
Recurr dilisensikan di bawah Lisensi MIT. Lihat file LISENSI untuk detailnya.