forked from kalebheitzman/grav-plugin-events
-
Notifications
You must be signed in to change notification settings - Fork 0
/
events.php
314 lines (282 loc) · 8.33 KB
/
events.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
<?php
/**
* Grav Events Plugin
*
* The Events Plugin provides Event Listings and Calendars to Grav CMS using
* event frontmatter. The event: frontmatter is converted to taxonomy so that
* colletions can be specified in page headers.
*
* PHP version 5.6+
*
* @package Events
* @author Kaleb Heitzman <kalebheitzman@gmail.com>
* @copyright 2016 Kaleb Heitzman
* @license https://opensource.org/licenses/MIT MIT
* @version 1.0.10
* @link https://github.com/kalebheitzman/grav-plugin-events
* @since 1.0.0 Initial Release
*/
namespace Grav\Plugin;
// import classes
require_once __DIR__.'/vendor/autoload.php';
require_once __DIR__.'/classes/calendar.php';
require_once __DIR__.'/classes/events.php';
use Grav\Common\Plugin;
use Grav\Common\Grav;
use Grav\Common\Page\Collection;
use Grav\Common\Page\Page;
use Grav\Common\Page\Pages;
use Grav\Common\Taxonomy;
use RocketTheme\Toolbox\Event\Event;
use Carbon\Carbon;
use Events\Calendar;
use Events\Events;
/**
* Events Plugin Class
*
* The Events Plugin provides Event Listings and Calendars for your Grav
* powered website. This plugin searches each page for `event:` front matter
* and then sets a custom taxonomy named *type* to *event*. It also sets
* a repeating and frequency taxonomy to build more intricate collections.
* The `event_repeat` taxonomy will take a string in the format `MTWRFSU` and
* the `event_freq` taxonomy will take `daily, weekly, monthly, or yearly`.
* These taxonomies are automatically added by the plugin so you don't need to
* add them to your configuration unless you just want to or need to build on
* top of them.
*
* Below is a sample of what an `event:` front matter section would look like.
*
* ```
* event:
* start: 01/01/2015 6:00pm
* end: 01/01/2015 7:00pm
* repeat: MTWRFSU
* freq: weekly
* until: 01/01/2020
* ```
*
* @package Events
* @author Kaleb Heitzman <kalebheitzman@gmail.com>
* @version 1.0.10
* @since 1.0.0 Initial Release
* @todo Implement Date Formats
* @todo Implement ICS Feeds
* @todo Implement All Day Option
*/
class EventsPlugin extends Plugin
{
/**
* Current Carbon DateTime
*
* @since 1.0.0 Initial Release
* @var object
*/
protected $now;
/**
* Events Events Class
*
* @since 1.0.0 Initial Release
* @var object
*/
protected $events;
/**
* Events Calendar Class
*
* @since 1.0.0 Initial Release
* @var object
*/
protected $calendar;
/**
* Date Range
*
* @since 1.0.0 Initial Release
* @var array
*/
protected $dateRange;
/**
* Get Subscribed Events
*
* @since 1.0.0 Initial Release
*
* @return array
*/
public static function getSubscribedEvents()
{
return [
'onPluginsInitialized' => ['onPluginsInitialized', 0],
];
}
/**
* Initialize plugin configuration
*
* From here we determine if the pluing should run and set the custom
* taxonomies to store event information in. We also initialize the Events
* and Calendar class that this plugin utilizes and then we start
* intercepting Grav hooks to build our events list and insert any vars
* we need into the system.
*
* @since 1.0.0 Initial Release
*
* @return void
*/
public function onPluginsInitialized()
{
// Nothing else is needed for admin so close it out
if ( $this->isAdmin() ) {
$this->active = false;
return;
}
// Add these to taxonomy for events management
$event_taxonomies = array('type', 'event_freq', 'event_repeat');
$taxonomy_config = array_merge((array)$this->config->get('site.taxonomies'), $event_taxonomies);
$this->config->set('site.taxonomies', $taxonomy_config);
// get the current datetime with c
$this->now = Carbon::now();
// set the calendar accessor
$this->calendar = new Calendar();
// set the events accessor
$this->events = new Events($this->grav, $this->config);
$this->enable([
'onTwigTemplatePaths' => ['onTwigTemplatePaths', 0],
'onPagesInitialized' => ['onPagesInitialized', 0],
'onPageInitialized' => ['onPageInitialized', 0],
'onTwigSiteVariables' => ['onTwigSiteVariables', 0],
]);
}
/**
* Add current directory to twig lookup paths.
*
* Add the templates directory to the twig directory look up path so we
* can load our page templates. These are overridable by the theme and
* are only meant as a starting point.
*
* @since 1.0.0 Initial Release
*
* @return void
*/
public function onTwigTemplatePaths()
{
// add templates to twig path
$this->grav['twig']->twig_paths[] = __DIR__ . '/templates';
}
/**
* Check for repeating entries and add them to the page collection
*
* We initialze the `repeat` and `freq` based events alongside other
* events into an array that contains a token and the appropriate date
* and time information. This allows us to filter events later and insert
* them into Grav's page stack where needed
*
* @since 1.0.0 Initial Release
*
* @return void
*/
public function onPagesInitialized()
{
// get instances of all events
$pages = $this->events->instances();
}
/**
* On Page Initialized
*
* Adds correct event header information to individual events based on the
* events array and token generated. A single dynamic page has an a token
* associated with in the url as evt:123456. We use this to pull the correct
* information and update the header.
*
* @since 1.0.6 Templates Update
*
* @return void
*/
public function onPageInitialized()
{
// setup
$page = $this->grav['page'];
/**
* Use the evt: param to serve up event date times.
*/
if ( $page->template() == 'event' && $this->grav['uri']->param('evt') !== false )
{
$evt = $this->grav['uri']->param('evt');
$event = $this->events->getEventByToken( $evt );
$newHeader = $page->header();
$newHeader->event['start'] = $event['startDate']->toDateTimeString();
$newHeader->event['end'] = $event['endDate']->toDateTimeString();
// set any other event frontmatter
if ( isset($event['repeat']) && $event['repeat'] !== false ) {
$newHeader->event['repeat'] = $event['repeat'];
$newHeader->event['repeatDisplay'] = $this->events->getRepeatDisplay( $event['repeat'] );
}
if ( isset($event['freq']) && $event['freq'] !== false ) {
$newHeader->event['freq'] = $event['freq'];
}
if ( isset($event['until']) && $event['until'] !== false ) {
$newHeader->event['until'] = $event['until'];
}
$page->header( $newHeader );
}
}
/**
* Add Events blueprints to admin
*
* This is currently not operational. In the future we'd like to add
* blueprints associated with page templates through this plugin hook.
*
* @since 1.0.0 Initial Release
*
* @return void
*/
public function onBlueprintCreated()
{
// todo: add events event blueprint to admin
// $this->grav['blueprints'];
}
/**
* Set needed variables to display events
*
* We set various twig variables on the calendar and single event pages.
*
* Our most signicant variable is the `evt:` param found in a single
* event's URI. This var is used to refernece the main events listing via
* an event token that is a 6 digit alphanumeric string. This gives us the
* date and time information that we need to display for a single event
* page.
*
* For the calendar page, we load the appropriate js and css to make the
* calendar work smoothly as well as add the appropriate calendar twig
* variables.
*
* @since 1.0.0 Initial Release
*
* @return void
*/
public function onTwigSiteVariables()
{
// setup
$page = $this->grav['page'];
$collection = $page->collection();
$twig = $this->grav['twig'];
// only load the vars if calendar page
if ($page->template() == 'calendar')
{
$yearParam = $this->grav['uri']->param('year');
$monthParam = $this->grav['uri']->param('month');
$twigVars = $this->calendar->twigVars($yearParam, $monthParam);
$calVars = $this->calendar->calendarVars($collection);
// add calendar to twig as calendar
$twigVars['calendar']['events'] = $calVars;
$twig->twig_vars['calendar'] = array_shift($twigVars);
}
$templates = array( 'calendar', 'events', 'event' );
if ( in_array( $page->template(), $templates ) )
{
// styles
$css = 'plugin://events/css-compiled/events.css';
$js = 'plugin://events/js/events.js';
$assets = $this->grav['assets'];
$assets->addCss($css);
$assets->add('jquery');
$assets->addJs($js);
}
}
}