Laravel 8 Full Calendar Helper
This is a fork of https://github.com/nelkasovic/laravel-full-calendar. A simple helper package to make generating http://fullcalendar.io in Laravel apps easier. Because the package is abandoned I decided to fork and publish a version which should work with Laravel 8 and I fix some bug
Installing
Require the package with composer using the following command:
composer require mjczz/laravel-full-calendar
Or add the following to your composer.json's require section and composer update
"require": {
"mjczz/laravel-full-calendar": "~1.0"
}
Laravel 5.4 (and earlier)
Register the service provider in your app.php
config file:
LaravelFullCalendar\FullCalendarServiceProvider::class,
And optionally create an alias:
'Calendar' => LaravelFullCalendar\Facades\Calendar::class,
Laravel 5.5+
The provider and Calendar
alias will be registered automatically.
You will also need to include fullcalendar.io's files in your HTML.
Usage
Creating Events
event()
:
Using The simpliest way to create an event is to pass the event information to Calendar::event()
:
$event = \Calendar::event(
"Valentine's Day", //event title
true, //full day event?
'2020-02-14', //start time, must be a DateTime object or valid DateTime format (http://bit.ly/1z7QWbg)
'2020-02-14', //end time, must be a DateTime object or valid DateTime format (http://bit.ly/1z7QWbg),
1, //optional event ID
[
'url' => 'http://full-calendar.io'
]
);
Event
Interface
Implementing Alternatively, you can use an existing class and have it implement LaravelFullCalendar\Event
. An example of an Eloquent model that implements the Event
interface:
class EventModel extends Eloquent implements \LaravelFullCalendar\Event
{
protected $dates = ['start', 'end'];
/**
* Get the event's id number
*
* @return int
*/
public function getId() {
return $this->id;
}
/**
* Get the event's title
*
* @return string
*/
public function getTitle()
{
return $this->title;
}
/**
* Is it an all day event?
*
* @return bool
*/
public function isAllDay()
{
return (bool)$this->all_day;
}
/**
* Get the start time
*
* @return DateTime
*/
public function getStart()
{
return $this->start;
}
/**
* Get the end time
*
* @return DateTime
*/
public function getEnd()
{
return $this->end;
}
}
IdentifiableEvent
Interface
If you wish for your existing class to have event IDs, implement \LaravelFullcalendar\IdentifiableEvent
instead. This interface extends \LaravelFullcalendar\Event
to add a getId()
method:
class EventModel extends Eloquent implements \LaravelFullcalendar\IdentifiableEvent
{
// Implement all Event methods ...
/**
* Get the event's ID
*
* @return int|string|null
*/
public function getId();
}
Additional Event Parameters
If you want to add additional parameters to your events, there are two options:
Calendar::event()
Using Pass an array of 'parameter' => 'value'
pairs as the 6th parameter to Calendar::event()
:
$event = \Calendar::event(
"Valentine's Day", //event title
true, //full day event?
'2020-02-14', //start time, must be a DateTime object or valid DateTime format (http://bit.ly/1z7QWbg)
'2020-02-14', //end time, must be a DateTime object or valid DateTime format (http://bit.ly/1z7QWbg),
1, //optional event ID
[
'url' => 'http://full-calendar.io',
//any other full-calendar supported parameters
]
);
getEventOptions
method to your event class
Add an <?php
class CalendarEvent extends \Illuminate\Database\Eloquent\Model implements \LaravelFullcalendar\Event
{
//...
/**
* Optional FullCalendar.io settings for this event
*
* @return array
*/
public function getEventOptions()
{
return [
'color' => $this->background_color,
//etc
];
}
//...
}
Create a Calendar
To create a calendar, in your route or controller, create your event(s), then pass them to Calendar::addEvent()
or Calendar::addEvents()
(to add an array of events). addEvent()
and addEvents()
can be used fluently (chained together). Their second parameter accepts an array of valid FullCalendar Event Object parameters.
Sample Controller code:
$events = [];
$events[] = \Calendar::event(
'Event One', //event title
false, //full day event?
'2020-02-11T0800', //start time (you can also use Carbon instead of DateTime)
'2020-02-12T0800', //end time (you can also use Carbon instead of DateTime)
0 //optionally, you can specify an event ID
);
$events[] = \Calendar::event(
"Valentine's Day", //event title
true, //full day event?
new \DateTime('2020-02-14'), //start time (you can also use Carbon instead of DateTime)
new \DateTime('2020-02-14'), //end time (you can also use Carbon instead of DateTime)
'stringEventId' //optionally, you can specify an event ID
);
$eloquentEvent = EventModel::first(); //EventModel implements LaravelFullcalendar\Event
$calendar = \Calendar::addEvents($events) //add an array with addEvents
->addEvent($eloquentEvent, [ //set custom color fo this event
'color' => '#800',
])->setOptions([ //set fullcalendar options
'firstDay' => 1
])->setCallbacks([ //set fullcalendar callback options (will not be JSON encoded)
'viewRender' => 'function() {alert("Callbacks!");}'
]);
return view('hello', compact('calendar'));
Sample View
Then to display, add the following code to your View:
<!doctype html>
<html lang="en">
<head>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.9.0/moment.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/fullcalendar/2.2.7/fullcalendar.min.js"></script>
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/fullcalendar/2.2.7/fullcalendar.min.css"/>
<style>
/* ... */
</style>
</head>
<body>
{!! $calendar->calendar() !!}
{!! $calendar->script() !!}
</body>
</html>
Note: The output from calendar()
and script()
must be non-escaped, so use {!!
and !!}
(or whatever you've configured your Blade compiler's raw tag directives as).
The script()
can be placed anywhere after calendar()
, and must be after fullcalendar was included.
This will generate (in February 2020):