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 ของ RecurrenceRecurrence มีเมธอด getStart() และ getEnd() ที่ส่งคืนออบเจ็กต์ DateTimeRule ที่แปลงไม่มีวันที่สิ้นสุด 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 จัดเตรียมวิธีการช่วยเหลือแบบ chainable ต่อไปนี้เพื่อกรองการเกิดซ้ำ:
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 รู้สึกอิสระที่จะแสดงความคิดเห็นหรือทำการร้องขอดึง โปรดรวมการทดสอบกับ PRs
Recurr ได้รับอนุญาตภายใต้ใบอนุญาต MIT ดูไฟล์ใบอนุญาตสำหรับรายละเอียด