Хотите создать онлайн -календари, чтобы вы могли отобразить их в приложении календаря 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 ())
. . .
Есть пять статусов участия:
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 Timezone, но это можно изменить.
Просто напоминание: не используйте функцию setTimezone
от PHP в объекте DateTime
, это изменит время в соответствии с часовым поясом! Лучше создать новый объект 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 )
. . .
Подробнее об этих часовых поясах позже.
Оповещения позволяют клиентам календаря отправлять напоминания о конкретных событиях. Например, Apple Mail на iPhone отправит пользователям уведомление о событии. Оповещение всегда принадлежит событию имеет описание, и за несколько минут до события оно будет запускается:
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 ());
Это правило описывает событие, которое будет повторяться ежедневно. Вы yearly
можете установить частоту на secondly
, minutely
, hourly
, weekly
или monthly
.
Rrule может быть добавлен в событие как таковое:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: monthly ()));
Можно привлечь к вашему личному вкусу; Давайте посмотрим!
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 ]
);
Повторение может быть сделано в течение определенных месяцев (например, только во втором квартале):
$ 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 и до отдельно, чтобы помочь посылке обнаружить часовые пояса:
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" ' ,
]);
Если вы хотите создать компоненты часового пояса самостоятельно, вы находитесь в нужном месте, хотя мы советуем вам сначала прочитать раздел о часовых поясах от 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. Хотите что -то больше? Затем проверьте этот пакет от Маркуса Поершке.
Пожалуйста, смотрите ChangeLog для получения дополнительной информации о том, что изменилось в последнее время.
Пожалуйста, смотрите для получения подробной информации.
Если вы нашли ошибку, касающуюся безопасности, пожалуйста, отправьте сообщение [email protected] вместо использования трекера выпуска.
Вы можете использовать этот пакет, но если он попадет в вашу производственную среду, мы очень ценим, что вы отправите нам открытку из своего родного города, упомянув, какой из наших пакетов вы используете.
Наш адрес: Spatie, Kruikstraat 22, Box 12, 2018 Antwerp, Бельгия.
Мы публикуем все полученные открытки на веб -сайте нашей компании.
Лицензия MIT (MIT). Пожалуйста, смотрите файл лицензии для получения дополнительной информации.