Completed
Push — master ( 86ffa1...615d80 )
by
unknown
04:34
created

Calendar   D

Complexity

Total Complexity 102

Size/Duplication

Total Lines 782
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 6

Importance

Changes 4
Bugs 0 Features 1
Metric Value
wmc 102
c 4
b 0
f 1
lcom 1
cbo 6
dl 0
loc 782
rs 4.4444

22 Methods

Rating   Name   Duplication   Size   Complexity  
A __isset() 0 3 1
A get_title() 0 4 2
A get_post_data() 0 3 1
A get_events() 0 3 1
C __construct() 0 70 11
A __get() 0 7 2
B set_post_object() 0 15 6
A set_taxonomies() 0 14 3
B set_events() 0 14 5
B set_events_template() 0 22 5
D set_timezone() 0 32 9
B set_date_format() 0 19 5
B set_time_format() 0 19 5
A set_datetime_separator() 0 8 2
B set_start_of_week() 0 17 6
D set_start() 0 48 17
A set_end() 0 4 4
A set_static() 0 14 4
A settings_fields() 0 3 1
get_view() 0 1 ?
A get_event_html() 0 6 3
C html() 0 62 9

How to fix   Complexity   

Complex Class

Complex classes like Calendar often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use Calendar, and based on these observations, apply Extract Interface, too.

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
0 ignored issues
show
Documentation introduced by
Should the return type not be string|null?

This check compares the return type specified in the @return annotation of a function or method doc comment with the types returned by the function and raises an issue if they mismatch.

Loading history...
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 ) {
0 ignored issues
show
introduced by
Space after opening control structure is required
Loading history...
introduced by
No space before opening parenthesis is prohibited
Loading history...
457
			case 'none':
458
				$this->events_template =  wp_kses_post( trim( $template ) );
0 ignored issues
show
introduced by
Expected 1 space after "="; 2 found
Loading history...
459
				break;
460
			case 'no_linebreaks':
461
				$this->events_template =  wpautop( wp_kses_post( trim( $template ) ), false );
0 ignored issues
show
introduced by
Expected 1 space after "="; 2 found
Loading history...
462
				break;
463
			default:
464
				$this->events_template =  wpautop( wp_kses_post( trim( $template ) ), true );
0 ignored issues
show
introduced by
Expected 1 space after "="; 2 found
Loading history...
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' ) {
0 ignored issues
show
introduced by
Found "=== '". Use Yoda Condition checks, you must
Loading history...
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 ) ) {
0 ignored issues
show
introduced by
Found "=== 0". Use Yoda Condition checks, you must
Loading history...
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
	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
	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 ) {
0 ignored issues
show
introduced by
Found "!== 0". Use Yoda Condition checks, you must
Loading history...
615
			$this->start = $timestamp;
616
			return;
617
		}
618
619
		$this->start = Carbon::now( $this->timezone )->getTimestamp();
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
		if ( 'today' == $calendar_begins ) {
625
			$this->start = Carbon::today( $this->timezone )->getTimestamp();
626
		} elseif ( 'days_before' == $calendar_begins ) {
627
			$this->start = Carbon::today( $this->timezone )->subDays( $nth )->getTimestamp();
628
		} elseif ( 'days_after' == $calendar_begins ) {
629
			$this->start = Carbon::today( $this->timezone )->addDays( $nth )->getTimestamp();
630
		} elseif ( 'this_week' == $calendar_begins ) {
631
			$week = new Carbon( 'now', $this->timezone );
632
			$week->setWeekStartsAt( $this->week_starts );
633
			$this->start = $week->startOfWeek()->getTimestamp();
634
		} elseif ( 'weeks_before' == $calendar_begins ) {
635
			$week = new Carbon( 'now', $this->timezone );
636
			$week->setWeekStartsAt( $this->week_starts );
637
			$this->start = $week->startOfWeek()->subWeeks( $nth )->getTimestamp();
638
		} elseif ( 'weeks_after' == $calendar_begins ) {
639
			$week = new Carbon( 'now', $this->timezone );
640
			$week->setWeekStartsAt( $this->week_starts );
641
			$this->start = $week->startOfWeek()->addWeeks( $nth )->getTimestamp();
642
		} elseif ( 'this_month' == $calendar_begins ) {
643
			$this->start = Carbon::today( $this->timezone )->startOfMonth()->getTimeStamp();
644
		} elseif ( 'months_before' == $calendar_begins ) {
645
			$this->start = Carbon::today( $this->timezone )->subMonths( $nth )->startOfMonth()->getTimeStamp();
646
		} elseif ( 'months_after' == $calendar_begins ) {
647
			$this->start = Carbon::today( $this->timezone )->addMonths( $nth )->startOfMonth()->getTimeStamp();
648
		} elseif ( 'this_year' == $calendar_begins ) {
649
			$this->start = Carbon::today( $this->timezone )->startOfYear()->getTimestamp();
650
		} elseif ( 'years_before' == $calendar_begins ) {
651
			$this->start = Carbon::today( $this->timezone )->subYears( $nth )->startOfYear()->getTimeStamp();
652
		} elseif ( 'years_after' == $calendar_begins ) {
653
			$this->start = Carbon::today( $this->timezone )->addYears( $nth )->startOfYear()->getTimeStamp();
654
		} elseif ( 'custom_date' == $calendar_begins ) {
655
			if ( $date = get_post_meta( $this->id, '_calendar_begins_custom_date', true ) ) {
656
				$this->start = Carbon::createFromFormat( 'Y-m-d', esc_attr( $date ), $this->timezone )->setTimezone( $this->timezone )->startOfDay()->getTimestamp();
657
			}
658
		}
659
	}
660
661
	/**
662
	 * Set calendar end.
663
	 *
664
	 * @since 3.0.0
665
	 *
666
	 * @param int $timestamp
667
	 */
668
	public function set_end( $timestamp = 0 ) {
669
		$latest = is_int( $timestamp ) && $timestamp !== 0 ? $timestamp : $this->latest_event;
670
		$this->end = $latest > $this->start ? $latest : $this->start;
671
	}
672
673
	/**
674
	 * Set the calendar to static.
675
	 *
676
	 * @since 3.0.0
677
	 *
678
	 * @param string|bool $static
679
	 */
680
	public function set_static( $static = '' ) {
681
682
		if ( ! empty( $static ) && is_bool( $static ) ) {
683
			$this->static = $static;
684
			return;
685
		}
686
687
		if ( 'yes' == get_post_meta( $this->id, '_calendar_is_static', true ) ) {
688
			$this->static = true;
689
			return;
690
		}
691
692
		$this->static = false;
693
	}
694
695
	/**
696
	 * Input fields for settings page.
697
	 *
698
	 * @since 3.0.0
699
	 *
700
	 * @return array
701
	 */
702
	public function settings_fields() {
703
		return $this->settings;
704
	}
705
706
	/**
707
	 * Get a calendar view.
708
	 *
709
	 * @since 3.0.0
710
	 *
711
	 * @param  string $view
712
	 *
713
	 * @return Calendar_View
714
	 */
715
	abstract public function get_view( $view = '' );
716
717
	/**
718
	 * Get event HTML parsed by template.
719
	 *
720
	 * @since  3.0.0
721
	 *
722
	 * @param  Event  $event    Event object to be parsed.
723
	 * @param  string $template (optional) To use another template or a partial.
724
	 *
725
	 * @return string
726
	 */
727
	public function get_event_html( Event $event, $template = '' ) {
728
		$event_builder = new Event_Builder( $event, $this );
729
		// Use the event template to parse tags; if empty, fallback to calendar post content.
730
		$template = empty( $template ) ? ( empty( $event->template ) ? $this->events_template : $event->template ) : $template;
731
		return $event_builder->parse_event_template_tags( $template );
732
	}
733
734
	/**
735
	 * Output the calendar markup.
736
	 *
737
	 * @since 3.0.0
738
	 *
739
	 * @param string $view The calendar view to display.
740
	 */
741
	public function html( $view = '' ) {
742
743
		$view = empty( $view ) ? $this->view : $this->get_view( $view );
744
745
		if ( $view instanceof Calendar_View ) {
746
747
			if ( ! empty( $this->errors ) ) {
748
749
				if ( current_user_can( 'manage_options' )  ) {
750
					echo '<pre><code>';
751
					foreach ( $this->errors as $error ) { echo $error; }
752
					echo '</code></pre>';
753
				}
754
755
			} else {
756
757
				// Get a CSS class from the class name of the calendar view (minus namespace part).
758
				$view_name  = implode( '-', array_map( 'lcfirst', explode( '_', strtolower( get_class( $view ) ) ) ) );
759
				$view_class = substr( $view_name, strrpos( $view_name, '\\' ) + 1 );
760
761
				$calendar_class = trim( implode( ' simcal-', apply_filters( 'simcal_calendar_class', array(
762
					'simcal-calendar',
763
					$this->type,
764
					$view_class,
765
				), $this->id ) ) );
766
767
				echo '<div class="' . $calendar_class . '" '
768
									. 'data-calendar-id="'    . $this->id . '" '
769
									. 'data-timezone="'       . $this->timezone . '" '
770
									. 'data-offset="'         . $this->offset . '" '
771
									. 'data-week-start="'     . $this->week_starts . '" '
772
									. 'data-calendar-start="' . $this->start .'" '
773
									. 'data-calendar-end="'   . $this->end . '" '
774
									. 'data-events-first="'   . $this->earliest_event .'" '
775
									. 'data-events-last="'    . $this->latest_event . '"'
776
									. '>';
777
778
				date_default_timezone_set( $this->timezone );
0 ignored issues
show
introduced by
Using date_default_timezone_set() and similar isn’t allowed, instead use WP internal timezone support.
Loading history...
779
				do_action( 'simcal_calendar_html_before', $this->id );
780
781
				$view->html();
782
783
				do_action( 'simcal_calendar_html_after', $this->id );
784
				date_default_timezone_set( $this->site_timezone );
0 ignored issues
show
introduced by
Using date_default_timezone_set() and similar isn’t allowed, instead use WP internal timezone support.
Loading history...
785
786
				$settings = get_option( 'simple-calendar_settings_calendars' );
787
				$poweredby = isset( $settings['poweredby']['opt_in'] ) ? $settings['poweredby']['opt_in'] : '';
788
789
				if ( 'yes' == $poweredby ) {
790
					$align = is_rtl() ? 'left' : 'right';
791
					echo '<small class="simcal-powered simcal-align-' . $align .'">' .
792
					     sprintf( __( 'Powered by <a href="%s" target="_blank">Simple Calendar</a>', 'google-calendar-events' ), simcal_get_url( 'home' ) ) .
793
					     '</small>';
794
				}
795
796
				echo '</div>';
797
798
			}
799
800
		}
801
802
	}
803
804
}
805