iPhone의 캘린더 앱이나 Google 캘린더에 온라인 캘린더를 표시 할 수 있도록 온라인 캘린더를 만들고 싶으십니까? 이는 다른 응용 프로그램에서로드 할 수있는 텍스트 형식 인 iCalendar 형식 (RFC 5545)의 캘린더를 생성하여 수행 할 수 있습니다.
이러한 달력의 형식은 RFC 5545로 정의되며, 이는 유쾌한 독서 경험이 아닙니다. 이 패키지는 RFC 5545와 RFC 7986의 일부 확장을 구현하여 캘린더를 만드는 데 쉽게 사용하기 쉬운 API를 제공합니다. 이러한 RFC를 완전히 구현하려는 의도는 아니지만 사용하기 쉬운 간단한 API를 제공하는 것이 우리의 의도입니다.
사용 방법의 예는 다음과 같습니다.
use Spatie IcalendarGenerator Components Calendar ;
use Spatie IcalendarGenerator Components Event ;
Calendar :: create ( ' Laracon online ' )
-> event ( Event :: create ( ' Creating calender feeds ' )
-> startsAt ( new DateTime ( ' 6 March 2019 15:00 ' ))
-> endsAt ( new DateTime ( ' 6 March 2019 16:00 ' ))
)
-> get ();위의 코드는이 문자열을 생성합니다.
BEGIN:VCALENDAR
VERSION:2.0
PRODID:spatie/icalendar-generator
NAME:Laracon online
X-WR-CALNAME:Laracon online
BEGIN:VEVENT
UID:5ef5c3f64cb2c
DTSTAMP;TZID=UTC:20200626T094630
SUMMARY:Creating calendar feeds
DTSTART:20190306T150000Z
DTEND:20190306T160000Z
DTSTAMP:20190419T135034Z
END:VEVENT
END:VCALENDAR
우리는 수업에서 가장 좋은 오픈 소스 패키지를 만들기 위해 많은 자원을 투자합니다. 유료 제품 중 하나를 구매하여 우리를 지원할 수 있습니다.
귀하가 사용하는 패키지 중 어느 패키지를 언급하면서 고향에서 엽서를 보내 주셔서 감사합니다. 연락처 페이지에서 주소를 찾을 수 있습니다. 우리는 가상 엽서 벽에 수신 된 엽서를 모두 게시합니다.
작곡가를 통해 패키지를 설치할 수 있습니다.
composer require spatie/icalendar-generator패키지의 V1과 V2 사이에는 상당한 변화가있었습니다. 자세한 내용은 업그레이드 안내서를 확인하십시오.
달력을 만드는 방법은 다음과 같습니다.
$ calendar = Calendar :: create ();달력에 이름을 줄 수 있습니다.
$ calendar = Calendar :: create ( ' Laracon Online ' );설명은 달력에 추가 할 수 있습니다.
$ calendar = Calendar :: create ()
-> name ( ' Laracon Online ' )
-> description ( ' Experience Laracon all around the world ' );결국 캘린더를 텍스트로 변환하여 사용자에게 스트리밍하거나 다운로드 할 수 있도록하려고합니다. 당신이하는 방법은 다음과 같습니다.
Calendar :: create ( ' Laracon Online ' )-> get (); // BEGIN:VCALENDAR ...캘린더를 응용 프로그램으로 스트리밍 할 때는 캘린더의 새로 고침 간격을 몇 분만에 설정할 수 있습니다. 이 설정시, 캘린더 응용 프로그램은 캘린더 변경에 대해 지정된 지속 시간 후에 매번 서버를 확인합니다.
Calendar :: create ( ' Laracon Online ' )
-> refreshInterval ( 5 )
. . .이벤트는 다음과 같이 만들 수 있습니다. 이름은 필요하지 않지만 시작 날짜는 항상 제공되어야합니다.
Event :: create ( ' Laracon Online ' )
-> startsAt ( new DateTime ( ' 6 march 2019 ' ));이벤트에서 다음 속성을 설정할 수 있습니다.
Event :: create ()
-> name ( ' Laracon Online ' )
-> description ( ' Experience Laracon all around the world ' )
-> uniqueIdentifier ( ' A unique identifier can be set here ' )
-> createdAt ( new DateTime ( ' 6 march 2019 ' ))
-> startsAt ( new DateTime ( ' 6 march 2019 15:00 ' ))
-> endsAt ( new DateTime ( ' 6 march 2019 16:00 ' ));시작 및 종료 날짜로 이벤트를 빨리 만들고 싶습니까?
Event :: create ( ' Laracon Online ' )
-> period ( new DateTime ( ' 6 march 2019 ' ), new DateTime ( ' 7 march 2019 ' ));이벤트에 위치를 추가 할 수 있습니다.
Event :: create ()
-> address ( ' Kruikstraat 22, 2018 Antwerp, Belgium ' )
-> addressName ( ' Spatie HQ ' )
-> coordinates ( 51.2343 , 4.4287 )
. . .이벤트 주최자를 설정할 수 있습니다. 이메일 주소가 필요하지만 이름을 생략 할 수 있습니다.
Event :: create ()
-> organizer ( ' [email protected] ' , ' Ruben ' )
. . .이벤트 참석자는 다음과 같이 추가 할 수 있습니다.
Event :: create ()
-> attendee ( ' [email protected] ' ) // only an email address is required
-> attendee ( ' [email protected] ' , ' Brent ' )
. . .참석자의 참여 상태를 설정할 수도 있습니다.
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: accepted ())
. . .5 가지 참여 상태가 있습니다.
ParticipationStatus::accepted()ParticipationStatus::declined()ParticipationStatus::tentative()ParticipationStatus::needs_action()ParticipationStatus::delegated()참석자가 이벤트를 위해 RSVP가 필요하다는 것을 나타낼 수 있습니다.
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: needs_action (), requiresResponse: true )
. . .이벤트는 투명하게 만들 수 있으므로 달력의 다른 이벤트와 시각적으로 겹치지 않습니다.
Event :: create ()
-> transparent ()
. . .하루 종일에 걸친 이벤트를 만들 수 있습니다.
Event :: create ()
-> fullDay ()
. . .이벤트의 상태를 설정할 수 있습니다.
Event :: create ()
-> status ( EventStatus :: cancelled ())
. . .세 가지 이벤트 상태가 있습니다.
EventStatus::confirmed()EventStatus::cancelled()EventStatus::tentative() 이벤트는 다음과 같이 분류 될 수 있습니다 ( public , private , confidential ).
Event :: create ()
-> classification ( Classification :: private ())
. . .따라서 URL 첨부 파일을 추가 할 수 있습니다.
Event :: create ()
-> attachment ( ' https://spatie.be/logo.svg ' )
-> attachment ( ' https://spatie.be/feed.xml ' , ' application/json ' )
. . .따라서 내장 부착물 (Base64)을 추가 할 수 있습니다.
Event :: create ()
-> embeddedAttachment ( $ file -> toString ())
-> embeddedAttachment ( $ fileString , ' application/json ' )
-> embeddedAttachment ( $ base64String , ' application/json ' , needsEncoding: false )
. . .이미지를 추가 할 수 있습니다.
Event :: create ()
-> image ( ' https://spatie.be/logo.svg ' )
-> image ( ' https://spatie.be/logo.svg ' , ' text/svg+xml ' )
-> image ( ' https://spatie.be/logo.svg ' , ' text/svg+xml ' , Display :: badge ())
. . .네 가지 이미지 디스플레이 유형이 있습니다.
Display::badge()Display::graphic()Display::fullsize()Display::thumbnail()이벤트를 만든 후에는 캘린더에 추가해야합니다. 이를위한 여러 가지 옵션이 있습니다.
// As a single event parameter
$ event = Event :: create ( ' Creating calendar feeds ' );
Calendar :: create ( ' Laracon Online ' )
-> event ( $ event )
. . .
// As an array of events
Calendar :: create ( ' Laracon Online ' )
-> event ([
Event :: create ( ' Creating calender feeds ' ),
Event :: create ( ' Creating contact lists ' ),
])
. . .
// As a closure
Calendar :: create ( ' Laracon Online ' )
-> event ( function ( Event $ event ){
$ event -> name ( ' Creating calender feeds ' );
})
. . .인기있는 탄소 라이브러리를 사용할 수 있습니다.
use Carbon Carbon ;
Event :: create ( ' Laracon Online ' )
-> startsAt ( Carbon :: now ())
. . . 이벤트는 제공하는 DateTime 객체에 정의 된 시간대를 사용합니다. PHP는 항상이 시간을 DateTime 객체로 설정합니다. 기본적으로 이것은 UTC 타임 존이지만이를 변경할 수 있습니다.
알림 : DateTime 객체에서 PHP의 setTimezone 함수를 사용하지 않으면 TimeZone에 따라 시간이 변경됩니다! 따라서 시간대를 사용하여 새 DateTime 객체를 만드는 것이 좋습니다.
new DateTime ( ' 6 march 2019 15:00 ' , new DateTimeZone ( ' Europe/Brussels ' ))시간 존을 생략하기위한 포인트를 만들 수 있습니다. 예를 들어, 세계 정오에 이벤트를 보여주고 싶을 때. 우리는 12시에 정오를 정의하지만 그 시간은 상대적입니다. 벨기에, 호주 또는 세계의 다른 국가에있는 사람들에게는 동일하지 않습니다.
그렇기 때문에 이벤트에서 시간대를 비활성화 할 수 있습니다.
$ starts = new DateTime ( ' 6 march 2019 12:00 ' )
Event :: create ()
-> startsAt ( $ starts )
-> withoutTimezone ()
. . .전체 캘린더에 대해서도 타임 존을 비활성화 할 수도 있습니다.
Calendar :: create ()
-> withoutTimezone ()
. . .각 캘린더에는 캘린더 내에서 사용되는 시간대를 설명하는 시간대 구성 요소가 있어야합니다. 모든 캘린더 클라이언트가이를 요구하는 것은 아니지만 이러한 구성 요소를 추가하는 것이 좋습니다.
이러한 시간대 구성 요소를 만드는 것은 매우 복잡합니다. 그렇기 때문에이 패키지는 구성없이 자동으로 추가 할 수 있습니다.
이 동작을 비활성화 할 수 있습니다.
Calendar :: create ()
-> withoutAutoTimezoneComponents ()
. . .원하는 경우 캘린더에 수동으로 타임 존을 추가 할 수 있습니다.
$ timezoneEntry = TimezoneEntry :: create (
TimezoneEntryType :: daylight (),
new DateTime ( ' 23 march 2020 ' ),
' +00:00 ' ,
' +02:00 '
);
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ( $ timezoneEntry )
. . .
Calendar :: create ()
-> timezone ( $ timezone )
. . .나중에이 시간에 더 많은 것들.
경고를 통해 캘린더 클라이언트는 특정 이벤트에 대한 알림을 보낼 수 있습니다. 예를 들어, iPhone의 Apple Mail은 사용자에게 이벤트에 대한 알림을 보냅니다. 경고는 항상 이벤트에 설명되어 있으며 이벤트가 시작되기 몇 분 전에 다음과 같습니다.
Event :: create ( ' Laracon Online ' )
-> alertMinutesBefore ( 5 , ' Laracon online is going to start in five minutes ' );이벤트 후 경고를 트리거 할 수도 있습니다.
Event :: create ( ' Laracon Online ' )
-> alertMinutesAfter ( 5 , ' Laracon online has ended, see you next year! ' );또는 특정 날짜에 경고를 트리거합니다.
Event :: create ( ' Laracon Online ' )
-> alertAt (
new DateTime ( ' 05/16/2020 12:00:00 ' ),
' Laracon online has ended, see you next year! '
);달력이나 이벤트에서 시간 존을 제거하면 경고에서 시간이 제거됩니다.
예를 들어 월간 회사 저녁 식사와 같은 이벤트가 반복 될 수 있습니다. 이것은 다음과 같이 수행 할 수 있습니다.
Event :: create ( ' Laracon Online ' )
-> repeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));그리고 일련의 날짜로 이벤트를 반복 할 수도 있습니다.
Event :: create ( ' Laracon Online ' )
-> repeatOn ([ new DateTime ( ' 05/16/2020 12:00:00 ' ), new DateTime ( ' 08/13/2020 15:00:00 ' )]);재발 규칙 또는 rrule의 간단히 말해서, rrule 내에서 반복 될 때를 설명하여 캘린더에 반복 이벤트를 추가 할 수 있도록하십시오. 먼저, 우리는 rrule을 만들어야합니다.
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ()); 이 규칙은 매일 반복 될 이벤트를 설명합니다. 또한 주파수를 secondly , minutely , hourly , weekly , monthly 또는 yearly 으로 설정할 수도 있습니다.
rrule은 다음과 같은 이벤트에 추가 할 수 있습니다.
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: monthly ()));당신의 개인적인 취향에 대한 rrule을 미세하게하는 것이 가능합니다. 보자!
rrule은 특정 시점에서 시작할 수 있습니다.
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> starting ( new DateTime ( ' now ' ));그리고 특정 시점에서 멈추십시오.
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> until ( new DateTime ( ' now ' ));예를 들어 다음과 같은 10 번만 반복 할 수 있습니다.
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> times ( 10 );반복 간격은 변경 될 수 있습니다.
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> interval ( 2 );예를 들어이 이벤트가 월요일에 시작되면이 행사의 다음 반복은 화요일이 아니라 수요일에 발생하지 않습니다. 모든 주파수에 대해 동일한 작업을 수행 할 수 있습니다.
특정 주간에 이벤트를 반복 할 수도 있습니다.
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday ()
);또는 그 달의 특정 주중 :
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday (), 3
);또는 한 달의 마지막 요일 :
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: sunday (), - 1
);그 달의 특정 날에 반복 할 수 있습니다.
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay ( 16 );그 달에 일의 며칠을 줄 수도 있습니다.
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay (
[ 5 , 10 , 15 , 20 ]
);특정 달 동안 반복을 수행 할 수 있습니다 (예 : 2 분기에만) :
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
[ RecurrenceMonth :: april (), RecurrenceMonth :: may (), RecurrenceMonth :: june ()]
);또는 한 달에만 :
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
RecurrenceMonth :: october ()
);주가 시작되는 날을 설정할 수 있습니다.
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> weekStartsOn (
ReccurenceDay :: monday ()
);이벤트가 반복되지 않는 특정 날짜를 제공 할 수 있습니다.
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()))
-> doNotRepeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));이벤트가 반복되지 않는 날짜를 제공하는 것도 가능합니다.
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()))
-> doNotRepeatOn ([ new DateTime ( ' 05/16/2020 12:00:00 ' ), new DateTime ( ' 08/13/2020 15:00:00 ' )]);또는 Rrules를 문자열로 추가 할 수 있습니다.
Event :: create ( ' SymfonyCon ' )
-> rruleAsString ( ' FREQ=DAILY;INTERVAL=1 ' );rrules를 문자열로 추가하면 Dtstart에 포함 된 시간대를 Dtstart에 포함시키고 문자열이 구문 분석되지 않고 평가되지 않기 때문에 패키지에 알려지지 않습니다. 그들이 알려진 경우 패키지가 시간대를 발견 할 수 있도록 dtstart를 추가하고 별도로 추가 할 수 있습니다.
Event :: create ( ' SymfonyCon ' )
-> rruleAsString (
' DTSTART=20231207T090000Z;FREQ=DAILY;INTERVAL=1;UNTIL=20231208T090000Z ' ,
new DateTime ( ' 7 december 2023 09:00:00 ' , new DateTimeZone ( ' UTC ' )),
new DateTime ( ' 8 december 2023 09:00:00 ' , new DateTimeZone ( ' UTC ' ))
);Laravel 응답을 사용하여 스트림을 캘린더 응용 프로그램을 달성 할 수 있습니다.
$ calendar = Calendar :: create ( ' Laracon Online ' );
return response ( $ calendar -> get ())
-> header ( ' Content-Type ' , ' text/calendar; charset=utf-8 ' );사용자가 캘린더를 다운로드하여 캘린더 응용 프로그램으로 가져올 가능성을 추가하려면 다음과 같습니다.
$ calendar = Calendar :: create ( ' Laracon Online ' );
return response ( $ calendar -> get (), 200 , [
' Content-Type ' => ' text/calendar; charset=utf-8 ' ,
' Content-Disposition ' => ' attachment; filename="my-awesome-calendar.ics" ' ,
]);Timezone 구성 요소를 직접 제작하려면 RFC의 시간대 섹션을 먼저 읽는 것이 좋습니다.
다음과 같은 시간대를 만들 수 있습니다.
$ timezone = Timezone :: create ( ' Europe/Brussels ' );마지막 수정 날짜를 제공 할 수 있습니다.
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> lastModified ( new DateTime ( ' 16 may 2020 12:00:00 ' ));또는 시간대에 대한 자세한 정보가 포함 된 URL을 추가하십시오.
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> url ( ' https://spatie.be ' );시간대는 UTC에 비해 시간대 시간이 변경된 여러 항목으로 구성되며, 이러한 항목은 표준 또는 일광 시간 동안 구성 할 수 있습니다.
$ entry = TimezoneEntry :: create (
TimezoneEntryType :: standard (),
new DateTime ( ' 16 may 2020 12:00:00 ' ),
' +00:00 ' ,
' +02:00 '
); 먼저 항목 유형 ( standard 또는 daylight )을 제공합니다. 그런 다음 시간이 변할 때 DateTime . 마지막으로, 변경 전부터 UTC에 대한 오프셋 및 변경 후 UTC에 대한 오프셋.
이 항목을 이름과 설명을 제공 할 수도 있습니다.
$ entry = TimezoneEntry :: create (...)
-> name ( ' Europe - Brussels ' )
-> description ( ' Belgian timezones ftw! ' );항목을위한 rrule은 다음과 같이 주어질 수 있습니다.
$ entry = TimezoneEntry :: create (...)
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()));결국 시간대에 항목을 추가 할 수 있습니다.
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ( $ timezoneEntry );또는 여러 항목을 추가하십시오.
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ([ $ timezoneEntryOne , $ timezoneEntryTwo ]);이제 우리는 시간대를 구축했습니다. 시간은 시간 (?) 일정에 캘린더에 추가 할 시간입니다.
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ( $ timezone );여러 타임 존을 추가 할 수도 있습니다.
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ([ $ timezoneOne , $ timezoneTwo ]);우리는이 패키지를 가능한 한 간단하게 유지하려고 노력합니다. 그렇기 때문에 RFC의 많은 속성과 하위 구성 요소 가이 패키지에 포함되지 않습니다. 패키지에 포함되지 않은 것이 필요한 경우 각 구성 요소에 다른 속성 또는 하위 구성 요소를 추가 할 수있었습니다. 그러나 조심하세요! 이 순간부터 RFC를 올바르게 구현하고 있습니다.
다음과 같은 구성 요소에 새 속성을 추가 할 수 있습니다.
Calendar :: create ()
-> appendProperty (
TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
)
. . . 여기에 TextProperty 추가했으며 텍스트를 값으로 기본 키 값 속성 유형입니다. 패키지에 포함 된 기본 속성 중 하나를 사용하거나 Property 클래스를 확장하여 직접 만들 수 있습니다.
때로는 속성에 몇 가지 추가 매개 변수가있을 수 있습니다. 키 값 항목이며 다음과 같은 속성에 추가 할 수 있습니다.
$ property = TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
-> addParameter ( Parameter :: create ( ' CN ' , ' RUBEN VAN ASSCHE ' ));
Calendar :: create ()
-> appendProperty ( $ property )
. . .하위 구성 요소는 다음과 같이 추가 될 수 있습니다.
Calendar :: create ()
-> appendSubComponent (
Event :: create ( ' Extending icalendar-generator ' )
)
. . . Component 클래스를 확장하여 하위 구성 요소를 만들 수 있습니다.
composer test우리는 간단하고 사용하기 쉬운 API를 위해 노력합니다. 더 많은 것을 원하십니까? 그런 다음 Markus Poerschke 의이 패키지를 확인하십시오.
최근에 변경된 내용에 대한 자세한 내용은 ChangElog를 참조하십시오.
자세한 내용은 기여를 참조하십시오.
보안에 관한 버그를 찾은 경우 문제 추적기를 사용하는 대신 [email protected]를 우편으로 보내주십시오.
이 패키지를 자유롭게 사용할 수는 있지만 프로덕션 환경에이를 경우 고향에서 엽서를 보내 주셔서 감사합니다.
우리의 주소는 다음과 같습니다. Spatie, Kruikstraat 22, Box 12, 2018 Antwerp, Belgium.
우리는 회사 웹 사이트에 모든 엽서를 게시합니다.
MIT 라이센스 (MIT). 자세한 내용은 라이센스 파일을 참조하십시오.