Completed
Push — master ( 72dfec...61887c )
by
unknown
06:50
created

Calendar::set_start()   C

Complexity

Conditions 17
Paths 16

Size

Total Lines 54
Code Lines 41

Duplication

Lines 10
Ratio 18.52 %

Importance

Changes 0
Metric Value
cc 17
eloc 41
nc 16
nop 1
dl 10
loc 54
rs 6.6619
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

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 ) ) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->events of type array is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

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.

Loading history...
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 ) {
0 ignored issues
show
Bug introduced by
The class WP_Post does not exist. Did you forget a USE statement, or did you not list all dependencies?

This error could be the result of:

1. Missing dependencies

PHP Analyzer uses your composer.json file (if available) to determine the dependencies of your project and to determine all the available classes and functions. It expects the composer.json to be in the root folder of your repository.

Are you sure this class is defined by one of your dependencies, or did you maybe not list a dependency in either the require or require-dev section?

2. Missing use statement

PHP does not complain about undefined classes in ìnstanceof checks. For example, the following PHP code will work perfectly fine:

if ($x instanceof DoesNotExist) {
    // Do something.
}

If you have not tested against this specific condition, such errors might go unnoticed.

Loading history...
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 ) {
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 );
0 ignored issues
show
Unused Code Comprehensibility introduced by
47% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
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 = '' ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
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 = '' ) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
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 ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
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 ) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
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 );
0 ignored issues
show
Coding Style Best Practice introduced by
It seems like you are loosely comparing two booleans. Considering using the strict comparison === instead.

When comparing two booleans, it is generally considered safer to use the strict comparison operator.

Loading history...
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' );
0 ignored issues
show
Unused Code Comprehensibility introduced by
46% of this comment could be valid code. Did you maybe forget this after debugging?

Sometimes obsolete code just ends up commented out instead of removed. In this case it is better to remove the code once you have checked you do not need it.

The code might also have been commented out for debugging purposes. In this case it is vital that someone uncomments it again or your project may behave in very unexpected ways in production.

This check looks for comments that seem to be mostly valid code and reports them.

Loading history...
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