Manage events on a Google Calendar

Overview

Manage events on a Google Calendar

Latest Version on Packagist Software License Test Status Code Style Status Total Downloads

This package makes working with a Google Calendar a breeze. Once it has been set up you can do these things:

use Spatie\GoogleCalendar\Event;

//create a new event
$event = new Event;

$event->name = 'A new event';
$event->description = 'Event description';
$event->startDateTime = Carbon\Carbon::now();
$event->endDateTime = Carbon\Carbon::now()->addHour();
$event->addAttendee([
    'email' => '[email protected]',
    'name' => 'John Doe',
    'comment' => 'Lorum ipsum',
]);
$event->addAttendee(['email' => '[email protected]']);

$event->save();

// get all future events on a calendar
$events = Event::get();

// update existing event
$firstEvent = $events->first();
$firstEvent->name = 'updated name';
$firstEvent->save();

$firstEvent->update(['name' => 'updated again']);

// create a new event
Event::create([
   'name' => 'A new event',
   'startDateTime' => Carbon\Carbon::now(),
   'endDateTime' => Carbon\Carbon::now()->addHour(),
]);

// delete an event
$event->delete();

Spatie is a webdesign agency based in Antwerp, Belgium. You'll find an overview of all our open source projects on our website.

Support us

We invest a lot of resources into creating best in class open source packages. You can support us by buying one of our paid products.

We highly appreciate you sending us a postcard from your hometown, mentioning which of our package(s) you are using. You'll find our address on our contact page. We publish all received postcards on our virtual postcard wall.

Installation

You can install the package via composer:

composer require spatie/laravel-google-calendar

You must publish the configuration with this command:

php artisan vendor:publish --provider="Spatie\GoogleCalendar\GoogleCalendarServiceProvider"

This will publish a file called google-calendar.php in your config-directory with these contents:

return [

    'default_auth_profile' => env('GOOGLE_CALENDAR_AUTH_PROFILE', 'service_account'),

    'auth_profiles' => [

        /*
         * Authenticate using a service account.
         */
        'service_account' => [
            /*
             * Path to the json file containing the credentials.
             */
            'credentials_json' => storage_path('app/google-calendar/service-account-credentials.json'),
        ],

        /*
         * Authenticate with actual google user account.
         */
        'oauth' => [
            /*
             * Path to the json file containing the oauth2 credentials.
             */
            'credentials_json' => storage_path('app/google-calendar/oauth-credentials.json'),

            /*
             * Path to the json file containing the oauth2 token.
             */
            'token_json' => storage_path('app/google-calendar/oauth-token.json'),
        ],
    ],

    /*
     *  The id of the Google Calendar that will be used by default.
     */
    'calendar_id' => env('GOOGLE_CALENDAR_ID'),
];

How to obtain the credentials to communicate with Google Calendar

The first thing you’ll need to do is get credentials to use Google's API. I’m assuming that you’ve already created a Google account and are signed in. Head over to Google API console and click "Select a project" in the header.

1

Next up we must specify which APIs the project may consume. From the header, select "Enable APIs and Services".

2

On the next page, search for "Calendar" and select "Google Calendar API" from the list.

3

From here, press "Enable" to enable the Google Calendar API for this project.

4

Now that you've created a project that has access to the Calendar API it's time to download a file with these credentials. Click "Credentials" in the sidebar and then press the "Credentials in APIs & Services" link.

5

From this page, open the "Create credentials" drop-down and select "Service account key".

6

On the next screen, you can give the service account a name. You can name it anything you’d like. In the service account id you’ll see an email address. We’ll use this email address later on in this guide. Select "JSON" as the key type and click "Create" to download the JSON file. You will get a warning that the service account does not have a role, you can safely ignore this and create the service account without assigning a role.

If you have delegated domain-wide access to the service account and you want to impersonate a user account, specify the email address of the user account in the config file.

7

Save the json inside your Laravel project at the location specified in the service_account_credentials_json key of the config file of this package. Because the json file contains potentially sensitive information, I don't recommend committing it to your git repository.

Now that everything is set up on the API site, we’ll need to configure some things on the Google Calendar site. Head over to Google Calendar and view the settings of the calendar you want to work with via PHP. On the "Share with specific people" tab press the "Add people" button and add the service account id that was displayed when creating credentials on the API site.

8

9

Scroll down to the "Integrate calendar" section to see the id of the calendar. You need to specify that id in the config file.

10

Authentication with OAuth2

This package supports OAuth2 authentication. This allows you to authenticate with an actual Google account, and to create and manage events with your own Google account.

OAuth2 authentication requires a token file, in addition to the credentials file. The easiest way to generate both of these files is by using the php quickstart tool. Following this guide will generate two files, credentials.json and token.json. They must be saved to your project as oauth-credentials.json and oauth-token.json, respectively. Check the config file in this package for exact details on where to save these files.

To use OAuth2, you must also set a new environment variable in your .env file:

GOOGLE_CALENDAR_AUTH_PROFILE=oauth

If you are upgrading from an older version of this package, you will need to force a publish of the configuration:

php artisan vendor:publish --provider="Spatie\GoogleCalendar\GoogleCalendarServiceProvider" --force

Finally, for a more seamless experience in your application, instead of using the quickstart tool you can set up a consent screen in the Google API console. This would allow non-technical users of your application to easily generate their own tokens. This is completely optional.

Usage

Getting events

You can fetch all events by simply calling Event::get(); this will return all events of the coming year. An event comes in the form of a Spatie\GoogleCalendar\Event object.

The full signature of the function is:

public static function get(Carbon $startDateTime = null, Carbon $endDateTime = null, array $queryParameters = [], string $calendarId = null): Collection

The parameters you can pass in $queryParameters are listed on the documentation on list at the Google Calendar API docs.

Accessing start and end dates of an event

You can use these getters to retrieve start and end date as Carbon instances:

$events = Event::get();

$events[0]->startDate;
$events[0]->startDateTime;
$events[0]->endDate;
$events[0]->endDateTime;

Creating an event

You can just new up a Spatie\GoogleCalendar\Event-object

$event = new Event;

$event->name = 'A new event';
$event->startDateTime = Carbon\Carbon::now();
$event->endDateTime = Carbon\Carbon::now()->addHour();

$event->save();

You can also call create statically:

Event::create([
   'name' => 'A new event',
   'startDateTime' => Carbon\Carbon::now(),
   'endDateTime' => Carbon\Carbon::now()->addHour(),
]);

This will create an event with a specific start and end time. If you want to create a full-day event you must use startDate and endDate instead of startDateTime and endDateTime.

$event = new Event;

$event->name = 'A new full day event';
$event->startDate = Carbon\Carbon::now();
$event->endDate = Carbon\Carbon::now()->addDay();

$event->save();

You can create an event based on a simple text string like this:

$event = new Event();

$event->quickSave('Appointment at Somewhere on April 25 10am-10:25am');

// statically
Event::quickCreate('Appointment at Somewhere on April 25 10am-10:25am');

Getting a single event

Google assigns a unique id to every single event. You can get this id by getting events using the get method and getting the id property on a Spatie\GoogleCalendar\Event-object:

// get the id of the first upcoming event in the calendar.
$eventId = Event::get()->first()->id;

You can use this id to fetch a single event from Google:

Event::find($eventId);

Updating an event

Easy, just change some properties and call save():

$event = Event::find($eventId);

$event->name = 'My updated title';
$event->save();

Alternatively, you can use the update method:

$event = Event::find($eventId)

$event->update(['name' => 'My updated title']);

Deleting an event

Nothing to it!

$event = Event::find($eventId);

$event->delete();

Setting a source

You can set source urls in your events, which are only visible to the creator of the event (see docs for more on the source property). This function only works when authenticated via OAuth.

$yourEvent->source = [
   'title' => 'Test Source Title',
   'url' => 'http://testsource.url',
 ];

Limitations

The Google Calendar API provides many options. This package doesn't support all of them. For instance, recurring events cannot be managed properly with this package. If you stick to creating events with a name and a date you should be fine.

Upgrading from v1 to v2

The only major difference between v1 and v2 is that under the hood Google API v2 is used instead of v1. Here are the steps required to upgrade:

  • rename the config file from laravel-google-calendar to google-calendar
  • in the config file rename the client_secret_json key to service_account_credentials_json

Changelog

Please see CHANGELOG for more information about what has changed recently.

Testing

composer test

Contributing

Please see CONTRIBUTING for details.

Security

If you discover any security-related issues, please email [email protected] instead of using the issue tracker.

Credits

A big thank you to Sebastiaan Luca for his big help creating v2 of this package.

License

The MIT License (MIT). Please see License File for more information.

Comments
  • Enabling delegated domain-wide with impersonate user account

    Enabling delegated domain-wide with impersonate user account

    I have a problem described in #152 and I manage to solve reading the google-api-php-client docs in https://github.com/googleapis/google-api-php-client#authentication-with-service-accounts.

    Don't know if is a feature that you want to provide in your package, but it was a necessity for me and I solve changing these two files. My intention was to enable to pass the user_to_impersonate variable at every request when you create an event for example, like you do in with $calendarId, but I couldn't, so my contribution is just this ;)

    opened by ovitor 7
  • Upgrade to use Google API v2

    Upgrade to use Google API v2

    PR to upgrade to "google/apiclient": "^2.2",, which allows to use both spatie/laravel-analytics and spatie/laravel-google-calendar in a single project.

    Will probably require some more tests, code formatting, … but it works :)

    Notes

    • Haven't tested creating events, only fetching them from different calendars. But nothing much has changed (just how authentication happens in the factory), so probably still works.
    • Copied some stuff from your analytics package that seemed useful (guard against invalid config, etc)
    • Upgraded PHPUnit and other packages while I was at it
    • Fixed a typo which also lead to the discovery of a test bug (asserting null equals null instead of the actual calendar ID, so in effect, the test actually failed).
      • I removed the it_will_use_the_calendar_id_from_the_config_file_by_default test completely. Not sure what to do with it since testing this would require either actual Google API credentials or some research to see if the Google event class still returns the calendarId key (which gets passed to it through Spatie's event class).
    • Most file diffs / changes are from PHPStorm applying my code formatting. Most changes where done in the factory and a few in the service provider and config. Can either leave this as-is or start over and copy changes, but use a different code style.
    opened by sebastiaanluca 5
  • Support database stored OAuth token

    Support database stored OAuth token

    What

    This feature will allow developers to get a column of data (like calendar_token in users table) for OAuth authentication instead of a fixed token file.

    Why

    In many cases, we will build an application for many users, it is not just for a user. And I think it's best to store the token in the database.

    How

    I added an authentication type called user_oauth and used the config file to see which columns the developer wanted to use. In src/GoogleCalendarFactory.php I just get the token from there and use it.

    I don't know how to write Unit Test for OAuth, let me know what I can do.

    Changes details

    • Added profile user_oauth to config/google-calendar.php
    • Added static method named createOAuthClientFromAuth in src/GoogleCalendarFactory.php for create a Google Client from user's token
    • Updated README.md
    opened by nhamtphat 4
  • First draft of sending multiple requests as a batch

    First draft of sending multiple requests as a batch

    Hi @freekmurze,

    As per the tweet I sent you the other day, I was wondering if this was a good time to propose a fairly significant feature for this calendar package.

    The current package sends a request to the Google servers for every insert/update/get/delete request that a user makes when creating/changing an event on their calendar. This is fine when you are working on a small number of events, but I don't think it scales very well and is a little bit heavy handed with hitting the Google servers.

    There is a feature with the API that allows us to BATCH SEND a request that holds up to 50 calls per single request (https://developers.google.com/calendar/batch#overview). I will deliberately ignore this limit at the moment in this PR, but it is trivial to work with later.

    I currently have a webapp that (sometimes) requires up to 300-500 events to be added to a calendar in one go. Sending each of those as an individual http request would really slow it down and also I don't want to be hitting google's servers so much in a short period of time.

    So I've attempted to add some features to your current package to allow a user to send many requests using the BATCH facility in the google api library.

    https://developers.google.com/api-client-library/php/guide/batch

    Here's where I need your help! I'm not sure how you would like this to look, there are some options I would like to hear your feedback on.

    1. At the moment I have only ADDED methods to the Google Calendar class and so this should be backwards compatible.

    ~~2) My BIG problem is that to make the BATCH feature work, it must be "switched on" before the first request is generated. My current implementaion is to add an enableBatch($bool) method. I don't really like the way this looks in the code - I would love to get feedback on how else this could be done.~~

    1. When the batch feature is "switched on" - all the current methods return an http request object that implements the \Psr\Http\Message\RequestInterface and not a Google_Service_Calendar_Event. I therefore had to remove the return type hinting in the methods on the calendar class. Can you specify two types of return objects from a method? I don't think so??

    2. Anyone who needs to add/edit/remove a SINGLE event at a time can still use the current methods/code that they have.

    3. This doesn't change anything for those who want to use the Event:: way at the moment. Those single requests will still be sent individually.

    4. Anyone who would like to "store up" all the changes/additions/deletions they are going to make into a batch request can use these new addition methods.

    The outline of the calendar class with new methods marked with a * would be as follows:

    listEvents
    getEvent
    getEvents*
    insertEvent
    insertEvents*
    updateEvent
    updateEvents*
    deleteEvent
    deleteEvents*
    

    Some code to show how this would look:

    
    //Create some events to use later
        $event1 = new \Spatie\GoogleCalendar\Event;
        $event1->name = 'Event 1';
        $event1->startDateTime = \Carbon\Carbon::parse('2018-08-23 12:00');
        $event1->endDateTime = \Carbon\Carbon::parse('2018-08-23 13:00');
    
        $event2 = new \Spatie\GoogleCalendar\Event;
        $event2->name = 'Event 2';
        $event2->startDateTime = \Carbon\Carbon::parse('2018-08-23 16:00');
        $event2->endDateTime = \Carbon\Carbon::parse('2018-08-23 17:00');
    
    
    //Currently you can do this - I appreciate this is not the most streamlined, only to prove the point:
    
        $calendar = app('laravel-google-calendar');
    
        $inserted1 = $calendar->insertEvent($event1);
        $inserted2 = $calendar->insertEvent($event2);
    
    
        $event3 = $calendar->getEvent('abcdefg');
        $event4 = $calendar->getEvent('hijklmn');
        $event5 = $calendar->getEvent('opqrstu');
    
    
        $updated = $calendar->updateEvent($event1);
    
        $calendar->deleteEvent('abcdefg');
    
    
    //This is a total of 7 http requests.
    
    
    
    
    //Proposed
    
    
        $response = $calendar
            ->getEvents(['abcedfg', 'hijklmn', 'opqrstu',])
            ->insertEvents([$event1, $event2])
            ->updateEvents([$event1])
            ->deleteEvents(['abcedfg',])
            ->sendBatch();
    
            //This is a total of ONE http request. It's VERY fast :)
    
    

    The proposed way would allow ALL of those requests to be sent in ONE http request rather than a single one.

    1. Like the enableBatch method at the start, the batch feature would require the user to end their requests with the ->sendBatch() method. What are your thoughts about that? Is the name acceptable? Is there a better way?

    2. The batch request that gets sent, returns an array with all the results of the request that the user has sent (https://developers.google.com/api-client-library/php/guide/batch#handling-responses). I have thoughts about how to handle that but I would like feedback on this initial stage of the PR.

    3. For info, in regards to point 8, if you supply an associated array to any of the methods, the key for the corresponding request is used in the response array so you can get your result very easily from the reply.

    There's loads here to get used too. It's one of my first PR's so no doubt there's loads to be picked on, but I would appreciate any thoughts you might have.

    Thank you.

    opened by jonnywilliamson 4
  • add the possibility to impersonate a user

    add the possibility to impersonate a user

    Hi,

    This PR adds the possibility to impersonate a user when using Google API. It's necessary when dealing with domain delegation (eg. when using G-Suite).

    Source & reference:

    • https://developers.google.com/api-client-library/php/auth/service-accounts#delegatingauthority
    • https://developers.google.com/identity/protocols/OAuth2ServiceAccount#delegatingauthority

    I'm not sure how to test this, so if you got any lead lett me know.

    opened by Elhebert 3
  • Add Event update method and update README

    Add Event update method and update README

    Hi,

    I really need my code to be a bit more DRY, but I had to have two methods to create and update my calendar that didn't accept the same parameters:

    Create was:

    CalendarEvent::create([
        'id' => $eventId,
        'name' => $this->event->title,
        'description' => $this->event->markdown_content,
        'startDateTime' => Carbon::parse($this->event->start),
        'endDateTime' => $this->event->end,
        'location' => $this->formatLocations(),
        'status' => $this->formatStatus(),
    ]);
    

    while update was:

    $this->googleEvent->name = $this->event->title;
    $this->googleEvent->description = $this->event->markdown_content;
    $this->googleEvent->startDateTime = Carbon::parse($this->event->start);
    $this->googleEvent->endDateTime = $this->event->end;
    $this->googleEvent->location = $this->formatLocations();
    $this->googleEvent->status = $this->formatStatus();
    
    $this->googleEvent->save();
    

    So now with this simple method I can have:

    protected function getDefaultEventProperties()
    {
        return [
            'name' => $this->event->title,
            'description' => $this->event->markdown_content,
            'startDateTime' => Carbon::parse($this->event->start),
            'endDateTime' => $this->event->end,
            'location' => $this->formatLocations(),
            'status' => $this->formatStatus(),
        ];
    }
    ...
    
    public function create()
    {
        $eventId = 'event'.date('dmYHisu');
    
        CalendarEvent::create(
            array_merge(['id' => $eventId], $this->getDefaultEventProperties()),
            $this->event->getCalendarId()
        );
    }
    ...
    
    public function update()
    {
         return $this->googleEvent->update($this->getDefaultEventProperties());
    }
    

    I'm planning on submitting a new PR for the v1 branch if this one gets accepted ;)

    Thanks,

    Xavier

    opened by XavRsl 3
  • php-cs-fixer fixes

    php-cs-fixer fixes

    php-cs-fixer CI job is using docker://oskarstark/php-cs-fixer-ga this docker was updated to use php cs fixer V3

    I've added necessary changes to make it work with new version

    https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/v3.0.0/UPGRADE-v3.md

    opened by sergiy-petrov 2
  • Laravel 8.x Compatibility

    Laravel 8.x Compatibility

    This is an automated pull request from Shift to update your package code and dependencies to be compatible with Laravel 8.x.

    Before merging, you need to:

    • Checkout the l8-compatibility branch
    • Review all comments for additional changes
    • Thoroughly test your package

    If you do find an issue, please report it by commenting on this PR to help improve future automation.

    opened by laravel-shift 2
  • Add support for OAuth2 authentication, source property on Events

    Add support for OAuth2 authentication, source property on Events

    Thanks for this awesome project! I needed some new features and I thought they were worth sharing with the community.

    New features:

    • Authenticate using OAuth2 as an alternative to using service accounts
    • Add getter/setter for the source property on Events (also added a test for this)

    Background:

    Capture

    The source property on the google event object allows you to set a custom url as an attribute in the calendar event. The link is visible and clickable in the Google Calendar interface. While the source property was accessible via $event->googleEvent->getSource() and $event->googleEvent->setSource(), it was not working when authenticating with a service account.

    A closer look at the api documentation reveals the problem:

    Source from which the event was created. For example, a web page, an email message or any document identifiable by an URL with HTTP or HTTPS scheme. Can only be seen or modified by the creator of the event.

    This means that only the user who created the event can see the link, i.e. the link is only visible to the service account user. This is why I forked to add support for authenticating using my own Google account.

    Implementation:

    The new authentication method can be configured by setting a new environment variable, GOOGLE_CALENDAR_AUTH_PROFILE. Setting this variable to oauth will select the OAuth2 profile. The config will default to using the service account if you do not set anything. The code will switch to authenticate the client based on the selected profile. I have included instructions for obtaining the OAuth2 credentials in the README.

    The new getter/setter for the Event source property can be used no matter how you authenticate, but it will only be readable by the creator of the event.

    Upgrading:

    Due to changes in the config file, if you upgrade from an older version you will have to publish a fresh config. I have included a note about this in the readme.

    opened by akmolina28 2
  • Allow passing array of credentials.

    Allow passing array of credentials.

    Hi, Google allows passing an associative array of credentials instead of the path of the json file containing them.

    See: https://github.com/googleapis/google-api-php-client/blob/afd3b55207efd691564c6e8e8b9e9bb39f6ce4f4/src/Google/Client.php#L900-L939

    This PR allows it too in the Laravel config.

    It especially allows to store the credentials in env, instead of file:

    json_decode(env('GOOGLE_CALENDAR_CREDENTIALS'))
    

    Thanks.

    opened by mathieutu 2
  • add abilities to add query params

    add abilities to add query params

    Google API calendar supports some query parameters like sendNotifications. ref: https://developers.google.com/google-apps/calendar/v3/reference/events/insert

    We should be able to use it:

    $event = new Event;
    ...
    $event->save('insertEvent', ['sendNotifications' => true]);
    
    opened by glendmaatita 2
Releases(3.5.1)
Owner
Spatie
We create open source, digital products and courses for the developer community
Spatie
Featured Calendar Maker v1.0 multingual extends the functionalities of the latest version of the FullCalendar (5.3.2), the most popular and completed JavaScript Calendar open source

Featured Calendar Maker v1.0 multingual extends the functionalities of the latest version of the FullCalendar (5.3.2), the most popular and completed JavaScript Calendar open source.

null 21 Oct 5, 2022
This helps with public holiday info using google calendar api

Public Holiday This package uses the Google Calendar API to fetch public holidays. The data always comes with 3 years data; the previous year, the cur

Temitope Olotin 5 Jul 13, 2022
The missing PHP 5.3+ calendar management library.

CalendR CalendR is an Object Oriented Calendar management library on top of PHP5.3+ Date objects. You can use it to deal with all your needs about cal

Yohan Giarelli 462 Dec 30, 2022
ReCalendar - highly customizable calendar for ReMarkable tablets

ReCalendar Highly customizable calendar for ReMarkable tablets ReCalendar allows you to generate your own, personalized calendar using PHP and the mPD

Igor Klimer 172 Oct 17, 2022
Display a calendar of commits from public GitHub repositories

commit-calendar Display a list of dates and commits from public GitHub repositories. You will display the list in the terminal, and you can choose to

Erika Gili 5 Jul 23, 2021
Flexible Calendar for Laravel 4

Laravel 4 Calendar Flexible Calendar for Laravel 4, supports Month, Week and Day Views and multiple events per date. To change the view type dynamical

null 59 Dec 24, 2022
📆 Calendar app for Nextcloud

Nextcloud Calendar A calendar app for Nextcloud. Easily sync events from various devices with your Nextcloud and edit them online. ?? ?? Why is this s

Nextcloud 801 Dec 29, 2022
TeamCal Neo is a web application of a day-based calendar

TeamCal Neo is a web application of a day-based calendar. It's generic purpose is the absence and event management of project teams, music bands and other groups needing a scheduler that focusses on days.

George Lewe 3 Nov 15, 2022
Simple Event/Calendar

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files

TolisM 2 Feb 1, 2022
Laravel 9 & React Event Calendar

###Event Calendar ##Projeyi docker üzerinde ayağa kaldırma #Acount Service accountService klasörü içine girerek docker-compose up --build komutu ile a

Muhammed Mustafa Bulut 4 Apr 19, 2022
Wordpress Plugin to show a small amount of events in an easy to use calender/schedule

Wordpress Plugin to show a small amount of events in an easy to use calender/schedule

Michael Burtscher 32 Feb 7, 2022
A package which provides a monthly calendar with days and events depending on given months and events.

A package which provides a monthly calendar with days and events depending on given months and events. This is where your description should go. Try a

MichaB 6 Nov 1, 2022
Featured Calendar Maker v1.0 multingual extends the functionalities of the latest version of the FullCalendar (5.3.2), the most popular and completed JavaScript Calendar open source

Featured Calendar Maker v1.0 multingual extends the functionalities of the latest version of the FullCalendar (5.3.2), the most popular and completed JavaScript Calendar open source.

null 21 Oct 5, 2022
Add The Events Calendar support to Sage 10.

The Events Calendar support for Sage 10 Add The Events Calendar support to Sage 10. For the time being there can only be a blade view, the default-tem

Supermundano 10 Nov 5, 2022
Laravel Livewire component to show Events in a good looking monthly calendar

Livewire Calendar This package allows you to build a Livewire monthly calendar grid to show events for each day. Events can be loaded from within the

Andrés Santibáñez 680 Jan 4, 2023
This helps with public holiday info using google calendar api

Public Holiday This package uses the Google Calendar API to fetch public holidays. The data always comes with 3 years data; the previous year, the cur

Temitope Olotin 5 Jul 13, 2022
Connect Nios4 with Google Calendar via PHP

Nios4_Google_Calendar Connect Nios4 with Google Calendar via PHP ISTRUZIONI INTEGRAZIONE GOOGLE CALENDAR CON NIOS4. Guida per l'integrazione del calen

null 2 Sep 23, 2021
Laravel package to easily send events to Google Analytics

Laravel Analytics Event Tracking https://twitter.com/pascalbaljet/status/1257926601339277312 Laravel package to easily send events to Google Analytics

Protone Media 212 Dec 22, 2022
An advanced plugin to manage events when the player enters the server!

⭐ • Better Join Version Status Date 1.0.0 stable-dev 12/10/2022 ?? • General: Plugin Introduction: This is an advanced player input management plugin

HenryDM 3 Nov 2, 2022
The missing PHP 5.3+ calendar management library.

CalendR CalendR is an Object Oriented Calendar management library on top of PHP5.3+ Date objects. You can use it to deal with all your needs about cal

Yohan Giarelli 462 Dec 30, 2022