qlick / laravel-full-calendar
Laravel的FullCalendar.io助手。是https://github.com/maddhatter/laravel-fullcalendar的分支
Requires
- php: ^7.1|^8.0
- illuminate/database: ^7.0|^8.0
- illuminate/support: ^7.0|^8.0
- laravel/helpers: ^1.0
README
这是https://github.com/nelkasovic/laravel-full-calendar的分支。一个简单的助手包,使在Laravel应用程序中生成http://fullcalendar.io更容易。因为该包已被放弃,所以我决定分支并发布一个与Laravel 6兼容的版本。
安装
使用以下命令通过composer安装包
composer require qlick/laravel-full-calendar
或者将以下内容添加到你的composer.json的require部分,然后执行composer update
"require": { "qlick/laravel-full-calendar": "~1.0" }
Laravel 5.4(及之前版本)
在你的app.php
配置文件中注册服务提供者
LaravelFullCalendar\FullCalendarServiceProvider::class,
可选地创建一个别名
'Calendar' => LaravelFullCalendar\Facades\Calendar::class,
Laravel 5.5+
提供者和Calendar
别名将自动注册。
你还需要将fullcalendar.io的文件包含在你的HTML中。
用法
创建事件
使用event()
创建事件的简单方法是将事件信息传递给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
接口
或者,你可以使用一个现有的类并使其实现LaravelFullCalendar\Event
。一个实现Event
接口的Eloquent模型的示例
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
接口
如果你希望你的现有类有事件ID,可以改用实现\LaravelFullcalendar\IdentifiableEvent
。此接口扩展了\LaravelFullcalendar\Event
并添加了getId()
方法
class EventModel extends Eloquent implements \LaravelFullcalendar\IdentifiableEvent { // Implement all Event methods ... /** * Get the event's ID * * @return int|string|null */ public function getId(); }
额外的事件参数
如果你想在事件中添加额外参数,有两种选择
使用Calendar::event()
将一个包含'parameter' => 'value'
对的数组作为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
方法
<?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 ]; } //... }
创建日历
要创建日历,在你的路由或控制器中创建你的事件,然后将它们传递给Calendar::addEvent()
或Calendar::addEvents()
(用于添加事件数组)。addEvent()
和addEvents()
可以流畅地使用(链接在一起)。它们的第二个参数接受一个有效的FullCalendar事件对象参数数组。
示例控制器代码
$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'));
示例视图
然后,要将以下代码添加到你的视图中以显示
<!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>
注意:来自calendar()
和script()
的输出必须是非转义的,所以请使用{!!
和!!
(或配置你的Blade编译器的原始标签指令)。
可以将script()
放在calendar()
之后任何位置,但必须在包含fullcalendar之后。
这将生成(2020年2月)