Deseja criar calendários on -line para que você possa exibi -los no aplicativo de calendário do iPhone ou no Google Calendar? Isso pode ser feito gerando calendários no formato iCalendar (RFC 5545), um formato textual que pode ser carregado por diferentes aplicações.
O formato de tais calendários é definido no RFC 5545, o que não é uma experiência agradável de leitura. Este pacote implementa o RFC 5545 e algumas extensões da RFC 7986 para fornecer uma API fácil de usar para criar calendários. Não é nossa intenção implementar completamente essas RFC, mas fornecer uma API direta que é fácil de usar.
Aqui está um exemplo de como usá -lo:
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 ();
O código acima gerará esta string:
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
Investimos muitos recursos para criar os melhores pacotes de código aberto de classe. Você pode nos apoiar comprando um de nossos produtos pagos.
Agradecemos muito por você nos enviar um cartão postal da sua cidade natal, mencionando qual dos nossos pacotes você está usando. Você encontrará nosso endereço em nossa página de contato. Publicamos todos os cartões postais recebidos em nossa parede virtual de cartão postal.
Você pode instalar o pacote via compositor:
composer require spatie/icalendar-generator
Houve algumas mudanças substanciais entre V1 e V2 do pacote. Verifique o guia de atualização para obter mais informações.
Veja como você pode criar um calendário:
$ calendar = Calendar :: create ();
Você pode dar um nome ao calendário:
$ calendar = Calendar :: create ( ' Laracon Online ' );
Uma descrição pode ser adicionada a um calendário:
$ calendar = Calendar :: create ()
-> name ( ' Laracon Online ' )
-> description ( ' Experience Laracon all around the world ' );
No final, você deseja converter seu calendário em texto para que ele possa ser transmitido ou baixado para o usuário. Aqui está como você faz isso:
Calendar :: create ( ' Laracon Online ' )-> get (); // BEGIN:VCALENDAR ...
Ao transmitir um calendário para um aplicativo, é possível definir o intervalo de atualização do calendário por duração em minutos. Ao definir isso, o aplicativo do calendário verificará seu servidor sempre após a duração especificada para alterações no calendário:
Calendar :: create ( ' Laracon Online ' )
-> refreshInterval ( 5 )
. . .
Um evento pode ser criado da seguinte maneira. Um nome não é necessário, mas uma data de início sempre deve ser dada:
Event :: create ( ' Laracon Online ' )
-> startsAt ( new DateTime ( ' 6 march 2019 ' ));
Você pode definir as seguintes propriedades em um evento:
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 ' ));
Deseja criar um evento rapidamente com uma data de início e término?
Event :: create ( ' Laracon Online ' )
-> period ( new DateTime ( ' 6 march 2019 ' ), new DateTime ( ' 7 march 2019 ' ));
Você pode adicionar um local a um evento como:
Event :: create ()
-> address ( ' Kruikstraat 22, 2018 Antwerp, Belgium ' )
-> addressName ( ' Spatie HQ ' )
-> coordinates ( 51.2343 , 4.4287 )
. . .
Você pode definir o organizador de um evento, o endereço de email é necessário, mas o nome pode ser omitido:
Event :: create ()
-> organizer ( ' [email protected] ' , ' Ruben ' )
. . .
Os participantes de um evento podem ser adicionados como tal:
Event :: create ()
-> attendee ( ' [email protected] ' ) // only an email address is required
-> attendee ( ' [email protected] ' , ' Brent ' )
. . .
Você também pode definir o status de participação de um participante:
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: accepted ())
. . .
Existem cinco status de participação:
ParticipationStatus::accepted()
ParticipationStatus::declined()
ParticipationStatus::tentative()
ParticipationStatus::needs_action()
ParticipationStatus::delegated()
Você pode indicar que um participante é obrigado a confirmar um evento:
Event :: create ()
-> attendee ( ' [email protected] ' , ' Ruben ' , ParticipationStatus :: needs_action (), requiresResponse: true )
. . .
Um evento pode ser tornado transparente, por isso não se sobrepõe visualmente a outros eventos em um calendário:
Event :: create ()
-> transparent ()
. . .
É possível criar um evento que abrange um dia inteiro:
Event :: create ()
-> fullDay ()
. . .
O status de um evento pode ser definido:
Event :: create ()
-> status ( EventStatus :: cancelled ())
. . .
Existem três status de evento:
EventStatus::confirmed()
EventStatus::cancelled()
EventStatus::tentative()
Um evento pode ser classificado ( public
, private
, confidential
) como tal:
Event :: create ()
-> classification ( Classification :: private ())
. . .
Você pode adicionar um acessório de URL como tal:
Event :: create ()
-> attachment ( ' https://spatie.be/logo.svg ' )
-> attachment ( ' https://spatie.be/feed.xml ' , ' application/json ' )
. . .
Você pode adicionar um acessório incorporado (base64) como tal:
Event :: create ()
-> embeddedAttachment ( $ file -> toString ())
-> embeddedAttachment ( $ fileString , ' application/json ' )
-> embeddedAttachment ( $ base64String , ' application/json ' , needsEncoding: false )
. . .
Você pode adicionar uma imagem como tal:
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 ())
. . .
Existem quatro tipos diferentes de exibição de imagem:
Display::badge()
Display::graphic()
Display::fullsize()
Display::thumbnail()
Depois de criar seu evento, ele deve ser adicionado a um calendário. Existem várias opções para fazer isso:
// 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 ' );
})
. . .
Você pode usar a Biblioteca de Carbono Popular:
use Carbon Carbon ;
Event :: create ( ' Laracon Online ' )
-> startsAt ( Carbon :: now ())
. . .
Os eventos usarão os fusos horários definidos nos objetos DateTime
que você fornece. O PHP sempre define esses fusos horários em um objeto DateTime
. Por padrão, este será o fuso horário da UTC, mas é possível alterar isso.
Apenas um lembrete: não use a função setTimezone
do PHP em um objeto DateTime
, ele mudará o tempo de acordo com o fuso horário! É melhor criar um novo objeto DateTime
com um fuso horário como tal:
new DateTime ( ' 6 march 2019 15:00 ' , new DateTimeZone ( ' Europe/Brussels ' ))
Pode ser feito um ponto para omitir fusos horários. Por exemplo, quando você deseja mostrar um evento ao meio -dia do mundo. Definimos meio -dia às 12 horas, mas esse tempo é relativo. Não é o mesmo para as pessoas na Bélgica, Austrália ou qualquer outro país do mundo.
É por isso que você pode desativar fusos horários em eventos:
$ starts = new DateTime ( ' 6 march 2019 12:00 ' )
Event :: create ()
-> startsAt ( $ starts )
-> withoutTimezone ()
. . .
Você pode até desativar os fusos horários por um calendário inteiro:
Calendar :: create ()
-> withoutTimezone ()
. . .
Cada calendário deve ter componentes do fuso horário que descrevem os fusos horários usados no seu calendário. Embora nem todos os clientes do calendário exijam isso, é recomendável adicionar esses componentes.
Criar esses componentes do fuso horário é bastante complicado. É por isso que este pacote os adicionará automaticamente para você sem configuração.
Você pode desativar esse comportamento como tal:
Calendar :: create ()
-> withoutAutoTimezoneComponents ()
. . .
Você pode adicionar manualmente fusos horários a um calendário, se desejar como tal:
$ 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 )
. . .
Mais sobre esses fusos horários mais tarde.
Os alertas permitem que os clientes do calendário enviem lembretes sobre eventos específicos. Por exemplo, o Apple Mail em um iPhone enviará aos usuários uma notificação sobre o evento. Um alerta sempre pertence a um evento tem uma descrição e vários minutos antes do evento será acionado:
Event :: create ( ' Laracon Online ' )
-> alertMinutesBefore ( 5 , ' Laracon online is going to start in five minutes ' );
Você também pode desencadear um alerta após o evento:
Event :: create ( ' Laracon Online ' )
-> alertMinutesAfter ( 5 , ' Laracon online has ended, see you next year! ' );
Ou acionar um alerta em uma data específica:
Event :: create ( ' Laracon Online ' )
-> alertAt (
new DateTime ( ' 05/16/2020 12:00:00 ' ),
' Laracon online has ended, see you next year! '
);
A remoção de fusos horários em um calendário ou evento também removerá fusos horários no alerta.
É possível que os eventos repetam, por exemplo, seu jantar mensal da empresa. Isso pode ser feito como tal:
Event :: create ( ' Laracon Online ' )
-> repeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));
E você também pode repetir o evento em um conjunto de datas:
Event :: create ( ' Laracon Online ' )
-> repeatOn ([ new DateTime ( ' 05/16/2020 12:00:00 ' ), new DateTime ( ' 08/13/2020 15:00:00 ' )]);
Regras de recorrência ou RRULE em resumo, possibilite adicionar um evento de repetição ao seu calendário, descrevendo quando ele se repete dentro de uma rrule. Primeiro, temos que criar uma rrule:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ());
Esta regra descreve um evento que será repetido diariamente. Você também pode definir a frequência como secondly
, minutely
, hourly
, weekly
, monthly
ou yearly
.
O RRULE pode ser adicionado a um evento como tal:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: monthly ()));
É possível definir o rrule para o seu gosto pessoal; Vamos dar uma olhada!
Uma rrule pode começar de um determinado momento:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> starting ( new DateTime ( ' now ' ));
E pare em um determinado ponto:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> until ( new DateTime ( ' now ' ));
Só pode ser repetido por algumas vezes, 10 vezes, por exemplo:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> times ( 10 );
O intervalo da repetição pode ser alterado:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: daily ())-> interval ( 2 );
Quando este evento começar na segunda -feira, por exemplo, a próxima repetição deste evento não ocorrerá na terça -feira, mas quarta -feira. Você pode fazer o mesmo em todas as frequências.
Também é possível repetir o evento em um dia de semana específico:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday ()
);
Ou em um dia da semana específico de uma semana no mês:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: friday (), 3
);
Ou no último dia da semana de um mês:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onWeekDay (
RecurrenceDay :: sunday (), - 1
);
Você pode repetir em um dia específico do mês:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay ( 16 );
É até possível dar uma variedade de dias no mês:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonthDay (
[ 5 , 10 , 15 , 20 ]
);
A repetição pode ser feita por determinados meses (por exemplo, apenas no segundo trimestre):
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
[ RecurrenceMonth :: april (), RecurrenceMonth :: may (), RecurrenceMonth :: june ()]
);
Ou apenas em um mês apenas:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> onMonth (
RecurrenceMonth :: october ()
);
É possível definir o dia em que a semana começar:
$ rrule = RRule :: frequency ( RecurrenceFrequency :: monthly ())-> weekStartsOn (
ReccurenceDay :: monday ()
);
Você pode fornecer uma data específica na qual um evento não será repetido:
Event :: create ( ' Laracon Online ' )
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()))
-> doNotRepeatOn ( new DateTime ( ' 05/16/2020 12:00:00 ' ));
Também é possível dar uma variedade de datas nas quais o evento não será repetido:
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 ' )]);
Como alternativa, você pode adicionar rrules como uma string:
Event :: create ( ' SymfonyCon ' )
-> rruleAsString ( ' FREQ=DAILY;INTERVAL=1 ' );
Se você adicionar rrules como uma corda, os fusos horários incluídos no dtstart e até que sejam desconhecidos do pacote, pois a string nunca é analisada e avaliada. Se eles são conhecidos, você pode adicionar o DTSTART e até separadamente para ajudar o pacote a descobrir os fusos horários:
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 ' ))
);
Você pode usar as respostas do Laravel para fluir para aplicativos de calendário:
$ calendar = Calendar :: create ( ' Laracon Online ' );
return response ( $ calendar -> get ())
-> header ( ' Content-Type ' , ' text/calendar; charset=utf-8 ' );
Se você deseja adicionar a possibilidade de os usuários baixarem um calendário e importá -lo para um aplicativo de calendário:
$ 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" ' ,
]);
Se você deseja criar componentes do fuso horário, está no lugar certo, embora o aconselemos a ler a seção em fusos horários da RFC primeiro.
Você pode criar um fuso horário como tal:
$ timezone = Timezone :: create ( ' Europe/Brussels ' );
É possível fornecer a última data modificada:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> lastModified ( new DateTime ( ' 16 may 2020 12:00:00 ' ));
Ou adicione um URL com mais informações sobre o fuso horário:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> url ( ' https://spatie.be ' );
Um fuso horário consiste em várias entradas em que o tempo do fuso horário mudou em relação ao UTC, essa entrada pode ser construída para o horário padrão ou diário:
$ entry = TimezoneEntry :: create (
TimezoneEntryType :: standard (),
new DateTime ( ' 16 may 2020 12:00:00 ' ),
' +00:00 ' ,
' +02:00 '
);
Em primeiro lugar, você fornece o tipo de entrada ( standard
ou daylight
). Então, um DateTime
quando o tempo muda. Por fim, um deslocamento em relação ao UTC antes da alteração e um deslocamento em relação ao UTC após a alteração.
Também é possível dar a esta entrada um nome e descrição:
$ entry = TimezoneEntry :: create (...)
-> name ( ' Europe - Brussels ' )
-> description ( ' Belgian timezones ftw! ' );
Uma rrule para a entrada pode ser dada como tal:
$ entry = TimezoneEntry :: create (...)
-> rrule ( RRule :: frequency ( RecurrenceFrequency :: daily ()));
No final, você pode adicionar uma entrada a um fuso horário:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ( $ timezoneEntry );
Ou até adicione várias entradas:
$ timezone = Timezone :: create ( ' Europe/Brussels ' )
-> entry ([ $ timezoneEntryOne , $ timezoneEntryTwo ]);
Agora, construímos nosso fuso horário, é hora (?) Para adicionar esse fuso horário ao nosso calendário:
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ( $ timezone );
Também é possível adicionar vários fusos horários:
$ calendar = Calendar :: create ( ' Calendar with timezones ' )
-> timezone ([ $ timezoneOne , $ timezoneTwo ]);
Tentamos manter este pacote o mais simples possível. É por isso que muitas propriedades e subcomponentes da RFC não estão incluídos neste pacote. Tornamos possível adicionar outras propriedades ou subcomponentes a cada componente, se você precisar de algo não incluído no pacote. Mas tenha cuidado! A partir deste momento, você está por conta própria implementando corretamente os RFCs.
Você pode adicionar uma nova propriedade a um componente como este:
Calendar :: create ()
-> appendProperty (
TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
)
. . .
Aqui, adicionamos um TextProperty
, e este é um tipo de propriedade de valor-chave padrão com um texto como valor. Você também pode usar uma das propriedades padrão incluídas no pacote ou criar o seu próprio, estendendo a classe Property
.
Às vezes, uma propriedade pode ter alguns parâmetros adicionais, essas são entradas de valor-chave e podem ser adicionadas às propriedades como tal:
$ property = TextProperty :: create ( ' ORGANIZER ' , ' [email protected] ' )
-> addParameter ( Parameter :: create ( ' CN ' , ' RUBEN VAN ASSCHE ' ));
Calendar :: create ()
-> appendProperty ( $ property )
. . .
Um subcomponente pode ser anexado como tal:
Calendar :: create ()
-> appendSubComponent (
Event :: create ( ' Extending icalendar-generator ' )
)
. . .
É possível criar seus subcomponentes, estendendo a classe Component
.
composer test
Nós nos esforçamos para uma API simples e fácil de usar. Quer algo mais? Em seguida, confira este pacote de Markus Poerschke.
Consulte Changelog para obter mais informações sobre o que mudou recentemente.
Por favor, consulte a contribuição para obter detalhes.
Se você encontrou um bug sobre segurança, envie um e -mail para segurança @spatie.be em vez de usar o rastreador de problemas.
Você é livre para usar este pacote, mas se for o ambiente de produção, agradecemos muito por você nos enviar um cartão postal da sua cidade natal, mencionando qual dos nossos pacotes está usando.
Nosso endereço é: Spatie, Kruikstraat 22, Box 12, 2018 Antuérpia, Bélgica.
Publicamos todos os cartões postais recebidos no site da nossa empresa.
A licença do MIT (MIT). Consulte o arquivo de licença para obter mais informações.