PluginProbe
Timetics – Appointment Booking Calendar & Scheduling / 1.0.44
Timetics – Appointment Booking Calendar & Scheduling v1.0.44
1.0.61 1.0.60 1.0.59 1.0.58 1.0.57 1.0.56 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.2 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 All 62 releases
timetics / bootstrap.php

bootstrap.php in Timetics – Appointment Booking Calendar & Scheduling 1.0.44, at bootstrap.php

467 lines 14.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Bootstrap Class
4 *
5 * @package Timetics
6 */
7 namespace Timetics;
8
9 defined( 'ABSPATH' ) || exit;
10
11 /**
12 * Bootstrap class.
13 *
14 * @since 1.0.0
15 */
16 final class Bootstrap {
17 /**
18 * @var Bootstrap The Actual Timetics instance
19 * @since 1.0.0
20 */
21 private static $instance;
22
23
24 private $file;
25 public $version;
26 private $has_pro;
27
28 /**
29 * Throw Error While Trying To Clone Object
30 *
31 * @since 1.0.0
32 * @return void
33 */
34 public function __clone() {
35 _doing_it_wrong( __FUNCTION__, esc_html__( 'Cloning is forbidden.', 'timetics' ), '1.0.0' );
36 }
37
38 /**
39 * Disabling Un-serialization Of This Class
40 */
41 public function __wakeup() {
42 _doing_it_wrong( __FUNCTION__, esc_html__( 'Unserializing instances of this class is forbidden.', 'timetics' ), '1.0.0' );
43 }
44
45 /**
46 * The actual TimeTics instance
47 *
48 * @since 1.0.0
49 * @param string $file
50 * @return void
51 */
52 public static function instantiate( $file = '' ) {
53
54 // Return if already instantiated
55 if ( self::instantiated() ) {
56 return self::$instance;
57 }
58
59 self::prepare_instance( $file );
60
61 self::$instance->initialize_constants();
62 self::$instance->define_tables();
63 self::$instance->include_files();
64 self::$instance->initialize_components();
65
66 return self::$instance;
67 }
68
69 /**
70 * Return If The Main Class has Already Been Instantiated Or Not
71 *
72 * @since 1.0.0
73 * @return boolean
74 */
75 private static function instantiated() {
76 if ( ( null !== self::$instance ) && ( self::$instance instanceof Bootstrap ) ) {
77 return true;
78 }
79
80 return false;
81 }
82
83 /**
84 * Prepare Singleton Instance
85 *
86 * @since 1.0.0
87 * @param string $file
88 * @return void
89 */
90 private static function prepare_instance( $file = '' ) {
91 self::$instance = new self();
92 self::$instance->file = $file;
93 self::$instance->version = \Timetics::get_version();
94 }
95
96 /**
97 * Assets Directory URL
98 *
99 * @since 1.0.0
100 * @return void
101 */
102 public function get_assets_url() {
103 return trailingslashit( TIMETICS_PLUGIN_URL . 'assets' );
104 }
105
106 /**
107 * Assets Directory Path
108 *
109 * @since 1.0.0
110 * @return void
111 */
112 public function get_assets_dir() {
113 return trailingslashit( TIMETICS_PLUGIN_DIR . 'assets' );
114 }
115
116 /**
117 * Plugin Directory URL
118 *
119 * @return void
120 */
121 public function get_plugin_url() {
122 return trailingslashit( plugin_dir_url( TIMETICS_PLUGIN_FILE ) );
123 }
124
125 /**
126 * Plugin Directory Path
127 *
128 * @return void
129 */
130 public function get_plugin_dir() {
131 return \Timetics::get_plugin_dir();
132 }
133
134 /**
135 * Plugin Basename
136 *
137 * @return void
138 */
139 public function get_plugin_basename() {
140 return plugin_basename( TIMETICS_PLUGIN_FILE );
141 }
142
143 /**
144 * Setup Plugin Constants
145 *
146 * @since 1.0.0
147 * @return void
148 */
149 private function initialize_constants() {
150 // Plugin Version
151 self::$instance->define( 'TIMETICS_VERSION', \Timetics::get_version() );
152
153 // Plugin Main File
154 self::$instance->define( 'TIMETICS_PLUGIN_FILE', $this->file );
155
156 // Plugin File Basename
157 self::$instance->define( 'TIMETICS_PLUGIN_BASE', $this->get_plugin_basename() );
158
159 // Plugin Main Directory Path
160 self::$instance->define( 'TIMETICS_PLUGIN_DIR', $this->get_plugin_dir() );
161
162 // Plugin Main Directory URL
163 self::$instance->define( 'TIMETICS_PLUGIN_URL', $this->get_plugin_url() );
164
165 // Plugin Assets Directory URL
166 self::$instance->define( 'TIMETICS_ASSETS_URL', $this->get_assets_url() );
167
168 // Plugin Assets Directory Path
169 self::$instance->define( 'TIMETICS_ASSETS_DIR', $this->get_assets_dir() );
170
171
172 }
173
174 /**
175 * Define constant if not already set.
176 *
177 * @since 1.0.0
178 * @param string $name Constant name.
179 * @param string|bool $value Constant value.
180 */
181 private function define( $name, $value ) {
182 if ( ! defined( $name ) ) {
183 define( $name, $value );
184 }
185 }
186
187 /**
188 * Define DB Tables Required For This Plugin
189 *
190 * @since 1.0.0
191 * @return void
192 */
193 private function define_tables() {
194 // To Be Implemented
195 }
196
197 /**
198 * Include All Required Files
199 *
200 * @since 1.0.0
201 * @return void
202 */
203 private function include_files() {
204 // require_once TIMETICS_PLUGIN_DIR . 'includes/post-types.php';
205 // require_once TIMETICS_PLUGIN_DIR . 'includes/widgets/manifest.php';
206 // require_once TIMETICS_PLUGIN_DIR . 'includes/template-functions.php';
207 // require_once TIMETICS_PLUGIN_DIR . 'includes/shortcodes.php';
208 // require_once TIMETICS_PLUGIN_DIR . 'includes/install.php';
209
210 /**
211 * Core helpers.
212 */
213 require_once TIMETICS_PLUGIN_DIR . 'utils/global-helper.php';
214 require_once TIMETICS_PLUGIN_DIR . 'core/staffs/calendars/CalendarSyncFacade.php';
215 require_once TIMETICS_PLUGIN_DIR . 'core/staffs/calendars/CalendarSyncFactory.php';
216 require_once TIMETICS_PLUGIN_DIR . 'core/staffs/calendars/CalendarSyncInterface.php';
217 require_once TIMETICS_PLUGIN_DIR . 'core/staffs/calendars/GoogleCalendarSync.php';
218 }
219
220 /**
221 * Initialize All Components
222 *
223 * @since 1.0.0
224 * @return void
225 */
226 private function initialize_components() {
227
228 // Register scripts and styles first
229 if ( $this->is_request( 'admin' ) ) {
230 add_action( 'admin_enqueue_scripts', [ $this, 'admin_scripts' ] );
231 }
232
233 if ( $this->is_request( 'frontend' ) ) {
234 add_action( 'wp_enqueue_scripts', array( $this, 'frontend_scripts' ) );
235 }
236
237 // Register admin menu
238 Core\Admin\Menu::instance()->init();
239 Core\Base::instance()->init();
240 Core\Services\Hooks::instance()->init();
241 Base\Custom_Endpoint::instance()->init();
242
243 global $current_screen;
244 $this->has_pro = class_exists('TimeticsPro');
245
246 $this->handle_buy_pro_module();
247
248 if ( function_exists('WC') ) {
249 Core\Integrations\Woocommerce\Hooks::instance()->init();
250 }
251 }
252
253 /**
254 * demo url for set pro button
255 *
256 * @return void
257 */
258 public function demo_url(){
259 return "https://arraytics.com/timetics/";
260 }
261
262 /**
263 * Register scripts and styles for admin
264 *
265 * @return void
266 */
267 public function admin_scripts( $handle ) {
268
269 if('plugins.php' === $handle){
270
271 wp_register_script( 'timetics-feedback-modal', TIMETICS_ASSETS_URL . 'js/feedback-modal.js', [ 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
272 wp_enqueue_script( 'timetics-feedback-modal', TIMETICS_ASSETS_URL . 'js/feedback-modal.js', [], TIMETICS_VERSION, true );
273 wp_register_style( 'timetics-feedback-modal', TIMETICS_ASSETS_URL . 'css/feedback-modal.css', [], TIMETICS_VERSION, 'all' );
274 wp_enqueue_style( 'timetics-feedback-modal', TIMETICS_ASSETS_URL . 'css/feedback-modal.css', [], TIMETICS_VERSION, 'all' );
275
276 $feedback_obj = array(
277 'site_url' => site_url(),
278 'admin_email' => get_option( 'admin_email' )
279 );
280
281 wp_localize_script( 'timetics-feedback-modal', 'timetics_feedback', $feedback_obj );
282
283 }
284
285 if ( 'toplevel_page_timetics' !== $handle) {
286 return;
287 }
288 global $wp_locale;
289
290 wp_enqueue_media();
291 wp_enqueue_style( 'wp-color-picker' );
292 wp_enqueue_style( 'timetics-admin-style', TIMETICS_ASSETS_URL . 'css/admin.css', [], TIMETICS_VERSION, 'all' );
293 wp_enqueue_style( 'timetics-vendor', TIMETICS_ASSETS_URL . 'css/vendor.css', [], TIMETICS_VERSION, 'all' );
294 wp_enqueue_script( 'timetics-flatpickr-scripts', TIMETICS_ASSETS_URL . 'js/vendors/flatpickr.js', [ 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
295 wp_enqueue_script( 'timetics-packages', TIMETICS_ASSETS_URL . 'js/packages.js', [ 'timetics-flatpickr-scripts' ], TIMETICS_VERSION, true );
296
297 $calendar_locale = timetics_get_option('calendar_locale');
298 if (!empty($calendar_locale)) {
299 wp_enqueue_script( 'calendar-locale', TIMETICS_ASSETS_URL . "js/local/{$calendar_locale}.js", [ 'jquery', 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
300 }
301
302 wp_enqueue_script( 'timetics-dashboard-scripts', TIMETICS_ASSETS_URL . 'js/dashboard.js', [ 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data', 'wp-color-picker' ], TIMETICS_VERSION, true );
303
304
305 $localize_obj = array(
306 'site_url' => site_url(),
307 'admin_url' => admin_url(),
308 'nonce' => wp_create_nonce( 'wp_rest' ),
309 'timezone' => timetics_get_timezone_list(),
310 'stripe_pub_key' => timetics_get_option( 'stripe_pub_key' ),
311 'date_format' => get_option( 'date_format' ),
312 'date_format_string' => date_i18n( get_option( 'date_format' ) ),
313 'time_format' => get_option( 'time_format' ),
314 'time_format_string' => date_i18n( get_option( 'time_format' ) ),
315 'start_of_week' => get_option( 'start_of_week', 0 ),
316
317 'default_timezone' => timetics_get_default_timezone(),
318 'currency_list' => timetics_get_currencies(),
319 'current_user_id' => get_current_user_id(),
320 'timeticsPro' => class_exists('TimeticsPro') ? true : false,
321 'demo_url' => $this->demo_url(),
322 'current_user' => timetics_get_current_user(),
323 );
324
325 $localize_obj = apply_filters( 'timetics_admin_localize_data', $localize_obj );
326
327 wp_localize_script( 'timetics-dashboard-scripts', 'timetics', $localize_obj );
328 }
329
330 /**
331 * Register scripts and styles for frontend
332 *
333 * @return void
334 */
335 public function frontend_scripts() {
336
337 wp_register_style( 'timetics-vendor', TIMETICS_ASSETS_URL . 'css/vendor.css', [], TIMETICS_VERSION, 'all' );
338 wp_register_style( 'timetics-frontend', TIMETICS_ASSETS_URL . 'css/frontend.css', [], TIMETICS_VERSION, 'all' );
339
340 wp_register_script( 'timetics-flatpickr-scripts', TIMETICS_ASSETS_URL . 'js/vendors/flatpickr.js', [ 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
341 wp_enqueue_script( 'timetics-packages', TIMETICS_ASSETS_URL . 'js/packages.js', [ 'timetics-flatpickr-scripts' ], TIMETICS_VERSION, true );
342
343 wp_register_script( 'timetics-frontend-scripts', TIMETICS_ASSETS_URL . 'js/frontend.js', [ 'jquery', 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
344
345 $calendar_locale = timetics_get_option('calendar_locale');
346 if (!empty($calendar_locale)) {
347 wp_register_script( 'calendar-locale', "https://npmcdn.com/flatpickr/dist/l10n/{$calendar_locale}.js", [ 'jquery', 'wp-plugins', 'wp-i18n', 'wp-element', 'wp-dom', 'wp-data' ], TIMETICS_VERSION, true );
348 }
349
350 // load text domain
351 wp_set_script_translations( 'timetics-frontend-scripts', 'timetics', TIMETICS_PLUGIN_DIR . 'languages/' );
352
353 global $wp_locale;
354
355 $stripe_pub_key = timetics_get_option( 'stripe_pub_key' );
356 $stripe_secret_key = timetics_get_option( 'stripe_secret_key' );
357 $stripe_configure = $stripe_pub_key && $stripe_secret_key;
358
359 $localize_obj = array(
360 'site_url' => site_url(),
361 'nonce' => wp_create_nonce( 'wp_rest' ),
362 'date_format' => get_option( 'date_format' ),
363 'time_format' => get_option( 'time_format' ),
364 'stripe_pub_key' => $stripe_pub_key,
365 'currency' => apply_filters( 'timetics_currency', timetics_get_option( 'currency', 'USD' ) ),
366 'stripe_configure' => $stripe_configure,
367 'current_user_id' => get_current_user_id(),
368 'start_of_week' => get_option( 'start_of_week', 0 ),
369 'currency_list' => timetics_get_currencies(),
370 'locale_name' => strtolower( str_replace( '_', '-', get_locale() ) )
371
372 );
373
374 $localize_obj = apply_filters( 'timetics_frontned_localize_data', $localize_obj );
375
376 wp_localize_script( 'timetics-frontend-scripts', 'timetics', $localize_obj );
377 }
378
379 /**
380 * What type of request
381 *
382 * @param string $type admin,frontend, ajax, cron
383 * @return boolean
384 */
385 private function is_request( $type ) {
386 switch ( $type ) {
387 case 'admin':
388 return is_admin();
389 case 'ajax':
390 return defined( 'DOING_AJAX' );
391 case 'cron':
392 return defined( 'DOING_CRON' );
393 case 'frontend':
394 return ( ! is_admin() || defined( 'DOING_AJAX' ) ) && ! defined( 'DOING_CRON' ) && ! $this->is_rest_api_request();
395 }
396 }
397
398 /**
399 * Returns if the request is non-legacy REST API request.
400 *
401 * @return boolean
402 */
403 private function is_rest_api_request() {
404 $server_request = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : false;
405
406 if ( ! $server_request ) {
407 return false;
408 }
409
410 $rest_prefix = trailingslashit( rest_get_url_prefix() );
411 $is_rest_request = ( false !== strpos( $server_request, $rest_prefix ) );
412
413 return apply_filters( 'timetics_is_rest_api_request', $is_rest_request );
414 }
415
416
417 /**
418 * Show buy-pro menu if pro plugin not active
419 *
420 * @return void
421 */
422 public function handle_buy_pro_module() {
423 $page = isset( $_GET['page'] ) ? sanitize_text_field( $_GET['page'] ) : '';
424
425
426 if ( 'timetics' !== $page ) {
427 return;
428 }
429
430
431 /**
432 * Show banner (codename: jhanda)
433 */
434 $filter_string = 'timetics,timetics-free-only';
435
436 if( $this->has_pro ) {
437
438 $filter_string .= ',timetics-pro';
439 $filter_string = str_replace(',timetics-free-only', '', $filter_string);
440
441 }
442
443
444 \Wpmet\Libs\Banner::instance('timetics')
445 ->is_test(true)
446 ->set_filter(ltrim($filter_string, ','))
447 ->set_api_url('https://product.themewinter.com/auth/public/jhanda')
448 ->set_plugin_screens('timetics')
449 ->set_plugin_screens('toplevel_page_timetics')
450 ->call();
451 // show get-help and upgrade-to-premium menu.
452 // $this->handle_get_help_and_upgrade_menu();
453 }
454
455 }
456
457 /**
458 * Returns The Instance Of Timetics.
459 * The main function that is responsible for returning Timetics instance.
460 *
461 * @since 1.0.0
462 * @return Timetics
463 */
464 function timetics() {
465 return Bootstrap::instantiate();
466 }
467