1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* Calendar |
4
|
|
|
* |
5
|
|
|
* @package SimpleCalendar/Calendars |
6
|
|
|
*/ |
7
|
|
|
namespace SimpleCalendar\Abstracts; |
8
|
|
|
|
9
|
|
|
use Carbon\Carbon; |
10
|
|
|
use SimpleCalendar\Events\Event; |
11
|
|
|
use SimpleCalendar\Events\Event_Builder; |
12
|
|
|
use SimpleCalendar\Events\Events; |
13
|
|
|
|
14
|
|
|
if ( ! defined( 'ABSPATH' ) ) { |
15
|
|
|
exit; |
16
|
|
|
} |
17
|
|
|
|
18
|
|
|
/** |
19
|
|
|
* The Calendar. |
20
|
|
|
* |
21
|
|
|
* Displays events from events feed. |
22
|
|
|
*/ |
23
|
|
|
abstract class Calendar { |
24
|
|
|
|
25
|
|
|
/** |
26
|
|
|
* Calendar Id. |
27
|
|
|
* |
28
|
|
|
* @access public |
29
|
|
|
* @var int |
30
|
|
|
*/ |
31
|
|
|
public $id = 0; |
32
|
|
|
|
33
|
|
|
/** |
34
|
|
|
* Calendar post object. |
35
|
|
|
* |
36
|
|
|
* @access public |
37
|
|
|
* @var \WP_Post |
38
|
|
|
*/ |
39
|
|
|
public $post = null; |
40
|
|
|
|
41
|
|
|
/** |
42
|
|
|
* Calendar Type. |
43
|
|
|
* |
44
|
|
|
* @access public |
45
|
|
|
* @var string |
46
|
|
|
*/ |
47
|
|
|
public $type = ''; |
48
|
|
|
|
49
|
|
|
/** |
50
|
|
|
* Calendar Name. |
51
|
|
|
* |
52
|
|
|
* @access public |
53
|
|
|
* @var string |
54
|
|
|
*/ |
55
|
|
|
public $name = ''; |
56
|
|
|
|
57
|
|
|
/** |
58
|
|
|
* Feed type. |
59
|
|
|
* |
60
|
|
|
* @access public |
61
|
|
|
* @var string |
62
|
|
|
*/ |
63
|
|
|
public $feed = ''; |
64
|
|
|
|
65
|
|
|
/** |
66
|
|
|
* Calendar start. |
67
|
|
|
* |
68
|
|
|
* @access public |
69
|
|
|
* @var int |
70
|
|
|
*/ |
71
|
|
|
public $start = 0; |
72
|
|
|
|
73
|
|
|
/** |
74
|
|
|
* Calendar end. |
75
|
|
|
* |
76
|
|
|
* @access public |
77
|
|
|
* @var int |
78
|
|
|
*/ |
79
|
|
|
public $end = 0; |
80
|
|
|
|
81
|
|
|
/** |
82
|
|
|
* Static calendar. |
83
|
|
|
* |
84
|
|
|
* @access public |
85
|
|
|
* @var bool |
86
|
|
|
*/ |
87
|
|
|
public $static = false; |
88
|
|
|
|
89
|
|
|
/** |
90
|
|
|
* Today. |
91
|
|
|
* |
92
|
|
|
* @access public |
93
|
|
|
* @var int |
94
|
|
|
*/ |
95
|
|
|
public $today = 0; |
96
|
|
|
|
97
|
|
|
/** |
98
|
|
|
* Time now. |
99
|
|
|
* |
100
|
|
|
* @access public |
101
|
|
|
* @var int |
102
|
|
|
*/ |
103
|
|
|
public $now = 0; |
104
|
|
|
|
105
|
|
|
/** |
106
|
|
|
* Timezone offset. |
107
|
|
|
* |
108
|
|
|
* @access public |
109
|
|
|
* @var int |
110
|
|
|
*/ |
111
|
|
|
public $offset = 0; |
112
|
|
|
|
113
|
|
|
/** |
114
|
|
|
* Timezone |
115
|
|
|
* |
116
|
|
|
* @access public |
117
|
|
|
* @var string |
118
|
|
|
*/ |
119
|
|
|
public $timezone = 'UTC'; |
120
|
|
|
|
121
|
|
|
/** |
122
|
|
|
* Site timezone. |
123
|
|
|
* |
124
|
|
|
* @access public |
125
|
|
|
* @var string |
126
|
|
|
*/ |
127
|
|
|
public $site_timezone = 'UTC'; |
128
|
|
|
|
129
|
|
|
/** |
130
|
|
|
* Date format. |
131
|
|
|
* |
132
|
|
|
* @access public |
133
|
|
|
* @var string |
134
|
|
|
*/ |
135
|
|
|
public $date_format = ''; |
136
|
|
|
|
137
|
|
|
/** |
138
|
|
|
* Time format. |
139
|
|
|
* |
140
|
|
|
* @access public |
141
|
|
|
* @var string |
142
|
|
|
*/ |
143
|
|
|
public $time_format = ''; |
144
|
|
|
|
145
|
|
|
/** |
146
|
|
|
* Date-time separator. |
147
|
|
|
* |
148
|
|
|
* @access public |
149
|
|
|
* @var string |
150
|
|
|
*/ |
151
|
|
|
public $datetime_separator = '@'; |
152
|
|
|
|
153
|
|
|
/** |
154
|
|
|
* First day of the week. |
155
|
|
|
* |
156
|
|
|
* @access public |
157
|
|
|
* @var int |
158
|
|
|
*/ |
159
|
|
|
public $week_starts = 0; |
160
|
|
|
|
161
|
|
|
/** |
162
|
|
|
* Events to display. |
163
|
|
|
* |
164
|
|
|
* @access public |
165
|
|
|
* @var array |
166
|
|
|
*/ |
167
|
|
|
public $events = array(); |
168
|
|
|
|
169
|
|
|
/** |
170
|
|
|
* Errors. |
171
|
|
|
* |
172
|
|
|
* @access public |
173
|
|
|
* @var array |
174
|
|
|
*/ |
175
|
|
|
protected $errors = array(); |
176
|
|
|
|
177
|
|
|
/** |
178
|
|
|
* Earliest event. |
179
|
|
|
* |
180
|
|
|
* @access public |
181
|
|
|
* @var int |
182
|
|
|
*/ |
183
|
|
|
public $earliest_event = 0; |
184
|
|
|
|
185
|
|
|
/** |
186
|
|
|
* Latest event. |
187
|
|
|
* |
188
|
|
|
* @access public |
189
|
|
|
* @var int |
190
|
|
|
*/ |
191
|
|
|
public $latest_event = 0; |
192
|
|
|
|
193
|
|
|
/** |
194
|
|
|
* Event builder content. |
195
|
|
|
* |
196
|
|
|
* @access public |
197
|
|
|
* @var string |
198
|
|
|
*/ |
199
|
|
|
public $events_template = ''; |
200
|
|
|
|
201
|
|
|
/** |
202
|
|
|
* Calendar Views. |
203
|
|
|
* |
204
|
|
|
* The calendar available views. |
205
|
|
|
* |
206
|
|
|
* @access public |
207
|
|
|
* @var array |
208
|
|
|
*/ |
209
|
|
|
public $views = array(); |
210
|
|
|
|
211
|
|
|
/** |
212
|
|
|
* Calendar View. |
213
|
|
|
* |
214
|
|
|
* The current view. |
215
|
|
|
* |
216
|
|
|
* @access public |
217
|
|
|
* @var Calendar_View |
218
|
|
|
*/ |
219
|
|
|
public $view = null; |
220
|
|
|
|
221
|
|
|
/** |
222
|
|
|
* Calendar settings. |
223
|
|
|
* |
224
|
|
|
* @access protected |
225
|
|
|
* @var array |
226
|
|
|
*/ |
227
|
|
|
protected $settings = array(); |
228
|
|
|
|
229
|
|
|
/** |
230
|
|
|
* Constructor. |
231
|
|
|
* |
232
|
|
|
* @since 3.0.0 |
233
|
|
|
* |
234
|
|
|
* @param int|object|\WP_Post|Calendar $calendar |
235
|
|
|
* @param string $view |
236
|
|
|
*/ |
237
|
|
|
public function __construct( $calendar, $view = '' ) { |
238
|
|
|
|
239
|
|
|
// Set the post object. |
240
|
|
|
$this->set_post_object( $calendar ); |
241
|
|
|
|
242
|
|
|
if ( ! is_null( $this->post ) ) { |
243
|
|
|
|
244
|
|
|
// Set calendar type and events source. |
245
|
|
|
$this->set_taxonomies(); |
246
|
|
|
|
247
|
|
|
// Set calendar default datetime properties. |
248
|
|
|
$this->set_timezone(); |
249
|
|
|
$this->set_start_of_week(); |
250
|
|
|
$this->set_static(); |
251
|
|
|
|
252
|
|
|
// Set calendar start. |
253
|
|
|
$this->set_start(); |
254
|
|
|
|
255
|
|
|
// Set the events template. |
256
|
|
|
$this->set_events_template(); |
257
|
|
|
|
258
|
|
|
// Get events source data. |
259
|
|
|
$feed = simcal_get_feed( $this ); |
260
|
|
|
if ( $feed instanceof Feed ) { |
261
|
|
|
if ( ! empty( $feed->events ) ) { |
262
|
|
|
if ( is_array( $feed->events ) ) { |
263
|
|
|
$this->set_events( $feed->events ); |
264
|
|
|
if ( 'use_calendar' == get_post_meta( $this->id, '_feed_timezone_setting', true ) ) { |
265
|
|
|
$this->timezone = $feed->timezone; |
266
|
|
|
$this->set_start(); |
267
|
|
|
} |
268
|
|
|
} elseif ( is_string( $feed->events ) ) { |
269
|
|
|
$this->errors[] = $feed->events; |
270
|
|
|
} |
271
|
|
|
} |
272
|
|
|
} |
273
|
|
|
|
274
|
|
|
// Set general purpose timestamps. |
275
|
|
|
$now = Carbon::now( $this->timezone ); |
276
|
|
|
$this->now = $now->getTimestamp(); |
277
|
|
|
$this->today = $now->startOfDay()->getTimestamp(); |
278
|
|
|
$this->offset = $now->getOffset(); |
279
|
|
|
|
280
|
|
|
// Set date time formatting. |
281
|
|
|
$this->set_date_format(); |
282
|
|
|
$this->set_time_format(); |
283
|
|
|
$this->set_datetime_separator(); |
284
|
|
|
|
285
|
|
|
// Set earliest and latest event timestamps. |
286
|
|
|
if ( $this->events && is_array( $this->events ) ) { |
|
|
|
|
287
|
|
|
$this->earliest_event = intval( current( array_keys( $this->events ) ) ); |
288
|
|
|
$this->latest_event = intval( key( array_slice( $this->events, -1, 1, true ) ) ); |
289
|
|
|
} |
290
|
|
|
|
291
|
|
|
// Set calendar end. |
292
|
|
|
$this->set_end(); |
293
|
|
|
|
294
|
|
|
// Set view. |
295
|
|
|
if ( ! $view ) { |
296
|
|
|
|
297
|
|
|
$calendar_view = get_post_meta( $this->id, '_calendar_view', true ); |
298
|
|
|
$calendar_view = isset( $calendar_view[ $this->type ] ) ? $calendar_view[ $this->type ] : ''; |
299
|
|
|
|
300
|
|
|
$view = esc_attr( $calendar_view ); |
301
|
|
|
} |
302
|
|
|
} |
303
|
|
|
|
304
|
|
|
// Get view. |
305
|
|
|
$this->view = $this->get_view( $view ); |
306
|
|
|
} |
307
|
|
|
|
308
|
|
|
/** |
309
|
|
|
* Overloading __isset function with post meta. |
310
|
|
|
* |
311
|
|
|
* @since 3.0.0 |
312
|
|
|
* |
313
|
|
|
* @param mixed $key Post meta key. |
314
|
|
|
* |
315
|
|
|
* @return bool |
316
|
|
|
*/ |
317
|
|
|
public function __isset( $key ) { |
318
|
|
|
return metadata_exists( 'post', $this->id, '_' . $key ); |
319
|
|
|
} |
320
|
|
|
|
321
|
|
|
/** |
322
|
|
|
* Overloading __get function with post meta. |
323
|
|
|
* |
324
|
|
|
* @since 3.0.0 |
325
|
|
|
* |
326
|
|
|
* @param string $key Post meta key. |
327
|
|
|
* |
328
|
|
|
* @return mixed |
329
|
|
|
*/ |
330
|
|
|
public function __get( $key ) { |
331
|
|
|
$value = get_post_meta( $this->id, '_' . $key, true ); |
332
|
|
|
if ( ! empty( $value ) ) { |
333
|
|
|
$this->$key = $value; |
334
|
|
|
} |
335
|
|
|
return $value; |
336
|
|
|
} |
337
|
|
|
|
338
|
|
|
/** |
339
|
|
|
* Set post object and id. |
340
|
|
|
* |
341
|
|
|
* @since 3.0.0 |
342
|
|
|
* |
343
|
|
|
* @param int|object|\WP_Post|Calendar $calendar |
344
|
|
|
*/ |
345
|
|
|
public function set_post_object( $calendar ) { |
346
|
|
|
if ( is_numeric( $calendar ) ) { |
347
|
|
|
$this->id = absint( $calendar ); |
348
|
|
|
$this->post = get_post( $this->id ); |
349
|
|
|
} elseif ( $calendar instanceof Calendar ) { |
350
|
|
|
$this->id = absint( $calendar->id ); |
351
|
|
|
$this->post = $calendar->post; |
352
|
|
|
} elseif ( $calendar instanceof \WP_Post ) { |
|
|
|
|
353
|
|
|
$this->id = absint( $calendar->ID ); |
354
|
|
|
$this->post = $calendar; |
355
|
|
|
} elseif ( isset( $calendar->id ) && isset( $calendar->post ) ) { |
356
|
|
|
$this->id = $calendar->id; |
357
|
|
|
$this->post = $calendar->post; |
358
|
|
|
} |
359
|
|
|
} |
360
|
|
|
|
361
|
|
|
/** |
362
|
|
|
* Return the calendar title. |
363
|
|
|
* |
364
|
|
|
* @since 3.0.0 |
365
|
|
|
* |
366
|
|
|
* @return string |
367
|
|
|
*/ |
368
|
|
|
public function get_title() { |
369
|
|
|
$title = isset( $this->post->post_title ) ? $this->post->post_title : ''; |
370
|
|
|
return apply_filters( 'simcal_calendar_title', $title ); |
371
|
|
|
} |
372
|
|
|
|
373
|
|
|
/** |
374
|
|
|
* Get the calendar post data. |
375
|
|
|
* |
376
|
|
|
* @since 3.0.0 |
377
|
|
|
* |
378
|
|
|
* @return \WP_Post |
379
|
|
|
*/ |
380
|
|
|
public function get_post_data() { |
381
|
|
|
return $this->post; |
382
|
|
|
} |
383
|
|
|
|
384
|
|
|
/** |
385
|
|
|
* Set taxonomies. |
386
|
|
|
* |
387
|
|
|
* @since 3.0.0 |
388
|
|
|
* @access protected |
389
|
|
|
*/ |
390
|
|
|
protected function set_taxonomies() { |
391
|
|
|
// Set calendar type. |
392
|
|
|
if ( $type = wp_get_object_terms( $this->id, 'calendar_type' ) ) { |
393
|
|
|
$this->type = sanitize_title( current( $type )->name ); |
394
|
|
|
} else { |
395
|
|
|
$this->type = apply_filters( 'simcal_calendar_default_type', 'default-calendar' ); |
396
|
|
|
} |
397
|
|
|
// Set feed type. |
398
|
|
|
if ( $feed_type = wp_get_object_terms( $this->id, 'calendar_feed' ) ) { |
399
|
|
|
$this->feed = sanitize_title( current( $feed_type )->name ); |
400
|
|
|
} else { |
401
|
|
|
$this->feed = apply_filters( 'simcal_calendar_default_feed', 'google' ); |
402
|
|
|
} |
403
|
|
|
} |
404
|
|
|
|
405
|
|
|
/** |
406
|
|
|
* Get events. |
407
|
|
|
* |
408
|
|
|
* @since 3.0.0 |
409
|
|
|
* |
410
|
|
|
* @return Events |
411
|
|
|
*/ |
412
|
|
|
public function get_events() { |
413
|
|
|
return new Events( $this->events, $this->timezone ); |
414
|
|
|
} |
415
|
|
|
|
416
|
|
|
/** |
417
|
|
|
* Set events. |
418
|
|
|
* |
419
|
|
|
* @since 3.0.0 |
420
|
|
|
* |
421
|
|
|
* @param array $array |
422
|
|
|
*/ |
423
|
|
|
public function set_events( array $array ) { |
424
|
|
|
|
425
|
|
|
$events = array(); |
426
|
|
|
|
427
|
|
|
if ( ! empty( $array ) ) { |
428
|
|
|
foreach ( $array as $tz => $e ) { |
429
|
|
|
foreach ( $e as $event ) { |
430
|
|
|
$events[ $tz ][] = $event instanceof Event ? $event : new Event( $event ); |
431
|
|
|
} |
432
|
|
|
} |
433
|
|
|
} |
434
|
|
|
|
435
|
|
|
$this->events = $events; |
436
|
|
|
} |
437
|
|
|
|
438
|
|
|
/** |
439
|
|
|
* Get the event builder template. |
440
|
|
|
* |
441
|
|
|
* @since 3.0.0 |
442
|
|
|
* |
443
|
|
|
* @param string $template |
444
|
|
|
* |
445
|
|
|
* @return string |
|
|
|
|
446
|
|
|
*/ |
447
|
|
|
public function set_events_template( $template = '' ) { |
448
|
|
|
if ( empty( $template ) ) { |
449
|
|
|
$template = isset( $this->post->post_content ) ? $this->post->post_content : ''; |
450
|
|
|
} |
451
|
|
|
|
452
|
|
|
// TODO: Removed wpautop() call. |
453
|
|
|
|
454
|
|
|
$event_formatting = get_post_meta( $this->id, '_event_formatting', true ); |
455
|
|
|
|
456
|
|
|
switch( $event_formatting ) { |
457
|
|
|
case 'none': |
458
|
|
|
$this->events_template = wp_kses_post( trim( $template ) ); |
459
|
|
|
break; |
460
|
|
|
case 'no_linebreaks': |
461
|
|
|
$this->events_template = wpautop( wp_kses_post( trim( $template ) ), false ); |
462
|
|
|
break; |
463
|
|
|
default: |
464
|
|
|
$this->events_template = wpautop( wp_kses_post( trim( $template ) ), true ); |
465
|
|
|
} |
466
|
|
|
|
467
|
|
|
//$this->events_template = wpautop( wp_kses_post( trim( $template ) ), true ); |
|
|
|
|
468
|
|
|
} |
469
|
|
|
|
470
|
|
|
/** |
471
|
|
|
* Set the timezone. |
472
|
|
|
* |
473
|
|
|
* @since 3.0.0 |
474
|
|
|
* |
475
|
|
|
* @param string $tz Timezone. |
476
|
|
|
*/ |
477
|
|
|
public function set_timezone( $tz = '' ) { |
478
|
|
|
|
479
|
|
|
$site_tz = esc_attr( simcal_get_wp_timezone() ); |
480
|
|
|
|
481
|
|
|
if ( $this->feed === 'grouped-calendars' ) { |
482
|
|
|
$this->timezone = $site_tz; |
483
|
|
|
return; |
484
|
|
|
} |
485
|
|
|
|
486
|
|
|
if ( empty( $tz ) ) { |
487
|
|
|
|
488
|
|
|
$timezone_setting = get_post_meta( $this->id, '_feed_timezone_setting', true ); |
489
|
|
|
|
490
|
|
|
if ( 'use_site' == $timezone_setting ) { |
491
|
|
|
$tz = $site_tz; |
492
|
|
|
} elseif ( 'use_custom' == $timezone_setting ) { |
493
|
|
|
$custom_timezone = esc_attr( get_post_meta( $this->id, '_feed_timezone', true ) ); |
494
|
|
|
// One may be using a non standard timezone in GMT (UTC) offset format. |
495
|
|
|
if ( ( strpos( $custom_timezone, 'UTC+' ) === 0 ) || ( strpos( $custom_timezone, 'UTC-' ) === 0 ) ) { |
496
|
|
|
$tz = simcal_get_timezone_from_gmt_offset( substr( $custom_timezone, 3 ) ); |
497
|
|
|
} else { |
498
|
|
|
$tz = ! empty( $custom_timezone ) ? $custom_timezone : 'UTC'; |
499
|
|
|
} |
500
|
|
|
} |
501
|
|
|
|
502
|
|
|
$this->timezone = empty( $tz ) ? 'UTC' : $tz; |
503
|
|
|
return; |
504
|
|
|
} |
505
|
|
|
|
506
|
|
|
$this->site_timezone = $site_tz; |
507
|
|
|
$this->timezone = simcal_esc_timezone( $tz, $this->timezone ); |
508
|
|
|
} |
509
|
|
|
|
510
|
|
|
/** |
511
|
|
|
* Set date format. |
512
|
|
|
* |
513
|
|
|
* @since 3.0.0 |
514
|
|
|
* |
515
|
|
|
* @param string $format PHP datetime format. |
516
|
|
|
*/ |
517
|
|
View Code Duplication |
public function set_date_format( $format = '' ) { |
|
|
|
|
518
|
|
|
|
519
|
|
|
$date_format_custom = $date_format_default = $format; |
520
|
|
|
|
521
|
|
|
if ( empty( $date_format_custom ) ) { |
522
|
|
|
|
523
|
|
|
$date_format_option = esc_attr( get_post_meta( $this->id, '_calendar_date_format_setting', true ) ); |
524
|
|
|
$date_format_default = esc_attr( get_option( 'date_format' ) ); |
525
|
|
|
$date_format_custom = ''; |
526
|
|
|
|
527
|
|
|
if ( 'use_custom' == $date_format_option ) { |
528
|
|
|
$date_format_custom = esc_attr( get_post_meta( $this->id, '_calendar_date_format', true ) ); |
529
|
|
|
} elseif ( 'use_custom_php' == $date_format_option ) { |
530
|
|
|
$date_format_custom = esc_attr( get_post_meta( $this->id, '_calendar_date_format_php', true ) ); |
531
|
|
|
} |
532
|
|
|
} |
533
|
|
|
|
534
|
|
|
$this->date_format = $date_format_custom ? $date_format_custom : $date_format_default; |
535
|
|
|
} |
536
|
|
|
|
537
|
|
|
/** |
538
|
|
|
* Set time format. |
539
|
|
|
* |
540
|
|
|
* @since 3.0.0 |
541
|
|
|
* |
542
|
|
|
* @param string $format PHP datetime format. |
543
|
|
|
*/ |
544
|
|
View Code Duplication |
public function set_time_format( $format = '' ) { |
|
|
|
|
545
|
|
|
|
546
|
|
|
$time_format_custom = $time_format_default = $format; |
547
|
|
|
|
548
|
|
|
if ( empty( $time_format_custom ) ) { |
549
|
|
|
|
550
|
|
|
$time_format_option = esc_attr( get_post_meta( $this->id, '_calendar_time_format_setting', true ) ); |
551
|
|
|
$time_format_default = esc_attr( get_option( 'time_format' ) ); |
552
|
|
|
$time_format_custom = ''; |
553
|
|
|
|
554
|
|
|
if ( 'use_custom' == $time_format_option ) { |
555
|
|
|
$time_format_custom = esc_attr( get_post_meta( $this->id, '_calendar_time_format', true ) ); |
556
|
|
|
} elseif ( 'use_custom_php' == $time_format_option ) { |
557
|
|
|
$time_format_custom = esc_attr( get_post_meta( $this->id, '_calendar_time_format_php', true ) ); |
558
|
|
|
} |
559
|
|
|
} |
560
|
|
|
|
561
|
|
|
$this->time_format = $time_format_custom ? $time_format_custom : $time_format_default; |
562
|
|
|
} |
563
|
|
|
|
564
|
|
|
/** |
565
|
|
|
* Set date-time separator. |
566
|
|
|
* |
567
|
|
|
* @since 3.0.0 |
568
|
|
|
* |
569
|
|
|
* @param string $separator A UTF8 character used as separator. |
570
|
|
|
*/ |
571
|
|
|
public function set_datetime_separator( $separator = '' ) { |
572
|
|
|
|
573
|
|
|
if ( empty( $separator ) ) { |
574
|
|
|
$separator = get_post_meta( $this->id, '_calendar_datetime_separator', true ); |
575
|
|
|
} |
576
|
|
|
|
577
|
|
|
$this->datetime_separator = esc_attr( $separator ); |
578
|
|
|
} |
579
|
|
|
|
580
|
|
|
/** |
581
|
|
|
* Set start of week. |
582
|
|
|
* |
583
|
|
|
* @since 3.0.0 |
584
|
|
|
* |
585
|
|
|
* @param int $weekday From 0 (Sunday) to 6 (Friday). |
586
|
|
|
*/ |
587
|
|
|
public function set_start_of_week( $weekday = -1 ) { |
588
|
|
|
|
589
|
|
|
$week_starts = is_int( $weekday ) ? $weekday : -1; |
590
|
|
|
|
591
|
|
|
if ( $week_starts < 0 || $week_starts > 6 ) { |
592
|
|
|
|
593
|
|
|
$week_starts_setting = get_post_meta( $this->id, '_calendar_week_starts_on_setting', true ); |
594
|
|
|
$week_starts = intval( get_option( 'start_of_week' ) ); |
595
|
|
|
|
596
|
|
|
if ( 'use_custom' == $week_starts_setting ) { |
597
|
|
|
$week_starts_on = get_post_meta( $this->id, '_calendar_week_starts_on', true ); |
598
|
|
|
$week_starts = is_numeric( $week_starts_on ) ? intval( $week_starts_on ) : $week_starts; |
599
|
|
|
} |
600
|
|
|
} |
601
|
|
|
|
602
|
|
|
$this->week_starts = $week_starts; |
603
|
|
|
} |
604
|
|
|
|
605
|
|
|
/** |
606
|
|
|
* Set calendar start. |
607
|
|
|
* |
608
|
|
|
* @since 3.0.0 |
609
|
|
|
* |
610
|
|
|
* @param int $timestamp |
611
|
|
|
*/ |
612
|
|
|
public function set_start( $timestamp = 0 ) { |
613
|
|
|
|
614
|
|
|
if ( is_int( $timestamp ) && $timestamp !== 0 ) { |
615
|
|
|
$this->start = $timestamp; |
616
|
|
|
return; |
617
|
|
|
} |
618
|
|
|
|
619
|
|
|
$start_dt = Carbon::now( $this->timezone ); |
620
|
|
|
|
621
|
|
|
$calendar_begins = esc_attr( get_post_meta( $this->id, '_calendar_begins', true ) ); |
622
|
|
|
$nth = max( absint( get_post_meta( $this->id, '_calendar_begins_nth', true ) ), 1 ); |
623
|
|
|
|
624
|
|
|
// Start date/time is sometimes 1 hour too early, which puts in the previous month. |
625
|
|
|
// Maybe due to daylight savings changes in different timezones? |
626
|
|
|
// Adding 1 hour is hackish, but fixes this. |
627
|
|
|
|
628
|
|
|
if ( 'today' == $calendar_begins ) { |
629
|
|
|
$start_dt = Carbon::today( $this->timezone )->addHour(); |
630
|
|
|
} elseif ( 'days_before' == $calendar_begins ) { |
631
|
|
|
$start_dt = Carbon::today( $this->timezone )->subDays( $nth )->addHour(); |
632
|
|
|
} elseif ( 'days_after' == $calendar_begins ) { |
633
|
|
|
$start_dt = Carbon::today( $this->timezone )->addDays( $nth )->addHour(); |
634
|
|
View Code Duplication |
} elseif ( 'this_week' == $calendar_begins ) { |
|
|
|
|
635
|
|
|
$week = new Carbon( 'now', $this->timezone ); |
636
|
|
|
$week->setWeekStartsAt( $this->week_starts ); |
637
|
|
|
$start_dt = $week->startOfWeek()->addHour(); |
638
|
|
|
} elseif ( 'weeks_before' == $calendar_begins ) { |
639
|
|
|
$week = new Carbon( 'now', $this->timezone ); |
640
|
|
|
$week->setWeekStartsAt( $this->week_starts ); |
641
|
|
|
$start_dt = $week->startOfWeek()->subWeeks( $nth )->addHour(); |
642
|
|
View Code Duplication |
} elseif ( 'weeks_after' == $calendar_begins ) { |
|
|
|
|
643
|
|
|
$week = new Carbon( 'now', $this->timezone ); |
644
|
|
|
$week->setWeekStartsAt( $this->week_starts ); |
645
|
|
|
$start_dt = $week->startOfWeek()->addWeeks( $nth )->addHour(); |
646
|
|
|
} elseif ( 'this_month' == $calendar_begins ) { |
647
|
|
|
$start_dt = Carbon::today( $this->timezone )->startOfMonth()->addHour(); |
648
|
|
|
} elseif ( 'months_before' == $calendar_begins ) { |
649
|
|
|
$start_dt = Carbon::today( $this->timezone )->subMonths( $nth )->startOfMonth()->addHour(); |
650
|
|
|
} elseif ( 'months_after' == $calendar_begins ) { |
651
|
|
|
$start_dt = Carbon::today( $this->timezone )->addMonths( $nth )->startOfMonth()->addHour(); |
652
|
|
|
} elseif ( 'this_year' == $calendar_begins ) { |
653
|
|
|
$start_dt = Carbon::today( $this->timezone )->startOfYear()->addHour(); |
654
|
|
|
} elseif ( 'years_before' == $calendar_begins ) { |
655
|
|
|
$start_dt = Carbon::today( $this->timezone )->subYears( $nth )->startOfYear()->addHour(); |
656
|
|
|
} elseif ( 'years_after' == $calendar_begins ) { |
657
|
|
|
$start_dt = Carbon::today( $this->timezone )->addYears( $nth )->startOfYear()->addHour(); |
658
|
|
|
} elseif ( 'custom_date' == $calendar_begins ) { |
659
|
|
|
if ( $date = get_post_meta( $this->id, '_calendar_begins_custom_date', true ) ) { |
660
|
|
|
$start_dt = Carbon::createFromFormat( 'Y-m-d', esc_attr( $date ), $this->timezone )->setTimezone( $this->timezone )->startOfDay()->addHour(); |
661
|
|
|
} |
662
|
|
|
} |
663
|
|
|
|
664
|
|
|
$this->start = $start_dt->timestamp; |
665
|
|
|
} |
666
|
|
|
|
667
|
|
|
/** |
668
|
|
|
* Set calendar end. |
669
|
|
|
* |
670
|
|
|
* @since 3.0.0 |
671
|
|
|
* |
672
|
|
|
* @param int $timestamp |
673
|
|
|
*/ |
674
|
|
|
public function set_end( $timestamp = 0 ) { |
675
|
|
|
$latest = is_int( $timestamp ) && $timestamp !== 0 ? $timestamp : $this->latest_event; |
676
|
|
|
$this->end = $latest > $this->start ? $latest : $this->start; |
677
|
|
|
} |
678
|
|
|
|
679
|
|
|
/** |
680
|
|
|
* Set the calendar to static. |
681
|
|
|
* |
682
|
|
|
* @since 3.0.0 |
683
|
|
|
* |
684
|
|
|
* @param string|bool $static |
685
|
|
|
*/ |
686
|
|
|
public function set_static( $static = '' ) { |
687
|
|
|
|
688
|
|
|
if ( ! empty( $static ) && is_bool( $static ) ) { |
689
|
|
|
$this->static = $static; |
690
|
|
|
return; |
691
|
|
|
} |
692
|
|
|
|
693
|
|
|
if ( 'yes' == get_post_meta( $this->id, '_calendar_is_static', true ) ) { |
694
|
|
|
$this->static = true; |
695
|
|
|
return; |
696
|
|
|
} |
697
|
|
|
|
698
|
|
|
$this->static = false; |
699
|
|
|
} |
700
|
|
|
|
701
|
|
|
/** |
702
|
|
|
* Input fields for settings page. |
703
|
|
|
* |
704
|
|
|
* @since 3.0.0 |
705
|
|
|
* |
706
|
|
|
* @return array |
707
|
|
|
*/ |
708
|
|
|
public function settings_fields() { |
709
|
|
|
return $this->settings; |
710
|
|
|
} |
711
|
|
|
|
712
|
|
|
/** |
713
|
|
|
* Get a calendar view. |
714
|
|
|
* |
715
|
|
|
* @since 3.0.0 |
716
|
|
|
* |
717
|
|
|
* @param string $view |
718
|
|
|
* |
719
|
|
|
* @return Calendar_View |
720
|
|
|
*/ |
721
|
|
|
abstract public function get_view( $view = '' ); |
722
|
|
|
|
723
|
|
|
/** |
724
|
|
|
* Get event HTML parsed by template. |
725
|
|
|
* |
726
|
|
|
* @since 3.0.0 |
727
|
|
|
* |
728
|
|
|
* @param Event $event Event object to be parsed. |
729
|
|
|
* @param string $template (optional) To use another template or a partial. |
730
|
|
|
* |
731
|
|
|
* @return string |
732
|
|
|
*/ |
733
|
|
|
public function get_event_html( Event $event, $template = '' ) { |
734
|
|
|
$event_builder = new Event_Builder( $event, $this ); |
735
|
|
|
// Use the event template to parse tags; if empty, fallback to calendar post content. |
736
|
|
|
$template = empty( $template ) ? ( empty( $event->template ) ? $this->events_template : $event->template ) : $template; |
737
|
|
|
return $event_builder->parse_event_template_tags( $template ); |
738
|
|
|
} |
739
|
|
|
|
740
|
|
|
/** |
741
|
|
|
* Get "Add to Google Calendar" link. |
742
|
|
|
* |
743
|
|
|
* @since 3.1.3 |
744
|
|
|
* |
745
|
|
|
* @param Event $event Event object to be parsed. |
746
|
|
|
* |
747
|
|
|
* @return string |
748
|
|
|
*/ |
749
|
|
|
public function get_add_to_gcal_url( Event $event ) { |
750
|
|
|
$base_url = 'https://calendar.google.com/calendar/render'; |
751
|
|
|
// Was https://www.google.com/calendar/render |
752
|
|
|
|
753
|
|
|
// Start & end date/time in specific format for GCal. |
754
|
|
|
// &dates=20160504T110000/20160504T170000 |
755
|
|
|
// No "Z"s tacked on to preserve source timezone. |
756
|
|
|
// All day events remove time component, but need to add a full day to show up correctly. |
757
|
|
|
$is_all_day = ( true == $event->whole_day ); |
|
|
|
|
758
|
|
|
$gcal_dt_format = $is_all_day ? 'Ymd' : 'Ymd\THi00'; |
759
|
|
|
$gcal_begin_dt = $event->start_dt->format( $gcal_dt_format ); |
760
|
|
|
$end_dt_raw = $is_all_day ? $event->end_dt->addDay() : $event->end_dt; |
761
|
|
|
$gcal_end_dt = $end_dt_raw->format( $gcal_dt_format ); |
762
|
|
|
$gcal_dt_string = $gcal_begin_dt . '/' . $gcal_end_dt; |
763
|
|
|
|
764
|
|
|
// "details" (description) should work even when blank. |
765
|
|
|
// "location" (address) should work with an address, just a name or blank. |
766
|
|
|
$params = array( |
767
|
|
|
'action' => 'TEMPLATE', |
768
|
|
|
'text' => urlencode( strip_tags( $event->title ) ), |
769
|
|
|
'dates' => $gcal_dt_string, |
770
|
|
|
'details' => urlencode( $event->description ), |
771
|
|
|
'location' => urlencode( $event->start_location['address'] ), |
772
|
|
|
'trp' => 'false', |
773
|
|
|
); |
774
|
|
|
|
775
|
|
|
// "ctz" (timezone) arg should be included unless all-day OR 'UTC'. |
776
|
|
|
if ( ! $is_all_day && ( 'UTC' !== $event->timezone ) ) { |
777
|
|
|
$params['ctz'] = urlencode( $event->timezone ); |
778
|
|
|
} |
779
|
|
|
|
780
|
|
|
$url = add_query_arg( $params, $base_url ); |
781
|
|
|
|
782
|
|
|
return $url; |
783
|
|
|
} |
784
|
|
|
|
785
|
|
|
/** |
786
|
|
|
* Output the calendar markup. |
787
|
|
|
* |
788
|
|
|
* @since 3.0.0 |
789
|
|
|
* |
790
|
|
|
* @param string $view The calendar view to display. |
791
|
|
|
*/ |
792
|
|
|
public function html( $view = '' ) { |
793
|
|
|
|
794
|
|
|
$view = empty( $view ) ? $this->view : $this->get_view( $view ); |
795
|
|
|
|
796
|
|
|
if ( $view instanceof Calendar_View ) { |
797
|
|
|
|
798
|
|
|
if ( ! empty( $this->errors ) ) { |
799
|
|
|
|
800
|
|
|
if ( current_user_can( 'manage_options' ) ) { |
801
|
|
|
echo '<pre><code>'; |
802
|
|
|
foreach ( $this->errors as $error ) { echo $error; } |
803
|
|
|
echo '</code></pre>'; |
804
|
|
|
} |
805
|
|
|
|
806
|
|
|
} else { |
807
|
|
|
|
808
|
|
|
// Get a CSS class from the class name of the calendar view (minus namespace part). |
809
|
|
|
$view_name = implode( '-', array_map( 'lcfirst', explode( '_', strtolower( get_class( $view ) ) ) ) ); |
810
|
|
|
$view_class = substr( $view_name, strrpos( $view_name, '\\' ) + 1 ); |
811
|
|
|
|
812
|
|
|
$calendar_class = trim( implode( ' simcal-', apply_filters( 'simcal_calendar_class', array( |
813
|
|
|
'simcal-calendar', |
814
|
|
|
$this->type, |
815
|
|
|
$view_class, |
816
|
|
|
), $this->id ) ) ); |
817
|
|
|
|
818
|
|
|
echo '<div class="' . $calendar_class . '" ' |
819
|
|
|
. 'data-calendar-id="' . $this->id . '" ' |
820
|
|
|
. 'data-timezone="' . $this->timezone . '" ' |
821
|
|
|
. 'data-offset="' . $this->offset . '" ' |
822
|
|
|
. 'data-week-start="' . $this->week_starts . '" ' |
823
|
|
|
. 'data-calendar-start="' . $this->start .'" ' |
824
|
|
|
. 'data-calendar-end="' . $this->end . '" ' |
825
|
|
|
. 'data-events-first="' . $this->earliest_event .'" ' |
826
|
|
|
. 'data-events-last="' . $this->latest_event . '"' |
827
|
|
|
. '>'; |
828
|
|
|
|
829
|
|
|
do_action( 'simcal_calendar_html_before', $this->id ); |
830
|
|
|
|
831
|
|
|
$view->html(); |
832
|
|
|
|
833
|
|
|
do_action( 'simcal_calendar_html_after', $this->id ); |
834
|
|
|
|
835
|
|
|
//$settings = get_option( 'simple-calendar_settings_calendars' ); |
|
|
|
|
836
|
|
|
$poweredby = get_post_meta( $this->id, '_poweredby', true ); |
837
|
|
|
|
838
|
|
|
if ( 'yes' == $poweredby ) { |
839
|
|
|
$align = is_rtl() ? 'left' : 'right'; |
840
|
|
|
echo '<small class="simcal-powered simcal-align-' . $align .'">' . |
841
|
|
|
sprintf( __( 'Powered by <a href="%s" target="_blank">Simple Calendar</a>', 'google-calendar-events' ), simcal_get_url( 'home' ) ) . |
842
|
|
|
'</small>'; |
843
|
|
|
} |
844
|
|
|
|
845
|
|
|
echo '</div>'; |
846
|
|
|
|
847
|
|
|
} |
848
|
|
|
|
849
|
|
|
} |
850
|
|
|
|
851
|
|
|
} |
852
|
|
|
|
853
|
|
|
} |
854
|
|
|
|
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.