PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 3.0.1
Tutor LMS – eLearning and online course solution v3.0.1
3.9.14 3.9.13 3.9.12 3.9.11 trunk 1.0.0 1.0.0-alpha 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.2.0 1.2.1 1.2.11 1.2.12 1.2.13 1.2.20 1.3.0 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.4.9 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.6.9 1.7.0 1.7.1 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9 1.8.0 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9.0 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.14 1.9.15 1.9.16 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.10 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.10 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.3.0 2.4.0 2.5.0 2.6.0 2.6.1 2.6.2 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.7.6 2.7.7 3.0.0 3.0.1 3.0.2 3.1.0 3.2.0 3.2.1 3.2.2 3.2.3 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.7.0 3.7.1 3.7.2 3.7.3 3.7.4 3.8.0 3.8.1 3.8.2 3.8.3 3.9.0 3.9.1 3.9.10 3.9.2 3.9.3 3.9.4 3.9.5 3.9.6 3.9.7 3.9.8 3.9.9
tutor / classes / Assets.php
tutor / classes Last commit date
Addons.php 1 year ago Admin.php 1 year ago Ajax.php 1 year ago Announcements.php 1 year ago Assets.php 1 year ago Backend_Page_Trait.php 1 year ago BaseController.php 1 year ago Course.php 1 year ago Course_Embed.php 3 years ago Course_Filter.php 1 year ago Course_List.php 1 year ago Course_Settings_Tabs.php 1 year ago Course_Widget.php 3 years ago Custom_Validation.php 3 years ago Dashboard.php 1 year ago Earnings.php 1 year ago FormHandler.php 2 years ago Frontend.php 1 year ago Gutenberg.php 1 year ago Input.php 1 year ago Instructor.php 1 year ago Instructors_List.php 1 year ago Lesson.php 1 year ago Options_V2.php 1 year ago Permalink.php 2 years ago Post_types.php 2 years ago Private_Course_Access.php 1 year ago Q_And_A.php 1 year ago Question_Answers_List.php 3 years ago Quiz.php 1 year ago QuizBuilder.php 1 year ago Quiz_Attempts_List.php 1 year ago RestAPI.php 2 years ago Reviews.php 3 years ago Rewrite_Rules.php 2 years ago Shortcode.php 1 year ago Singleton.php 1 year ago Student.php 1 year ago Students_List.php 3 years ago Taxonomies.php 3 years ago Template.php 1 year ago Theme_Compatibility.php 3 years ago Tools.php 3 years ago Tools_V2.php 1 year ago Tutor.php 1 year ago TutorEDD.php 1 year ago Tutor_Base.php 2 years ago Tutor_Setup.php 1 year ago Upgrader.php 1 year ago User.php 1 year ago Utils.php 1 year ago Video_Stream.php 3 years ago WhatsNew.php 2 years ago Withdraw.php 1 year ago Withdraw_Requests_List.php 3 years ago WooCommerce.php 1 year ago
Assets.php
711 lines
1 <?php
2 /**
3 * Manage Assets
4 *
5 * @package Tutor
6 * @author Themeum <support@themeum.com>
7 * @link https://themeum.com
8 * @since 1.0.0
9 */
10
11 namespace TUTOR;
12
13 use Tutor\Ecommerce\CouponController;
14 use Tutor\Ecommerce\OptionKeys;
15 use Tutor\Ecommerce\OrderController;
16 use Tutor\Ecommerce\Settings;
17
18 if ( ! defined( 'ABSPATH' ) ) {
19 exit;
20 }
21
22 /**
23 * Assets class
24 *
25 * @since 1.0.0
26 */
27 class Assets {
28
29
30 /**
31 * Constructor
32 *
33 * @since 1.0.0
34 *
35 * @since 3.0.0 register hook param added
36 *
37 * @param bool $register_hooks param added to enable or disable registering hooks.
38 *
39 * @return void
40 */
41 public function __construct( $register_hooks = true ) {
42 if ( ! $register_hooks ) {
43 return;
44 }
45
46 /**
47 * Common scripts loading
48 */
49 add_action( 'admin_enqueue_scripts', array( $this, 'common_scripts' ) );
50 add_action( 'wp_enqueue_scripts', array( $this, 'common_scripts' ) );
51 /**
52 * Front and backend script enqueue
53 */
54 add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
55 add_action( 'wp_enqueue_scripts', array( $this, 'frontend_scripts' ) );
56
57 add_action( 'admin_enqueue_scripts', array( $this, 'load_meta_data' ) );
58 add_action( 'wp_enqueue_scripts', array( $this, 'load_meta_data' ) );
59
60 /**
61 * Text domain loading
62 */
63 add_action( 'admin_enqueue_scripts', array( $this, 'tutor_script_text_domain' ), 100 );
64 add_action( 'wp_enqueue_scripts', array( $this, 'tutor_script_text_domain' ), 100 );
65 add_filter( 'tutor_localize_data', array( $this, 'modify_localize_data' ) );
66
67 /**
68 * Register translatable function to load
69 * Handled script with text domain attached to
70 *
71 * @since 1.9.0
72 */
73 add_action( 'admin_head', array( $this, 'tutor_add_mce_button' ) );
74 add_filter( 'get_the_generator_html', array( $this, 'tutor_generator_tag' ), 10, 2 );
75 add_filter( 'get_the_generator_xhtml', array( $this, 'tutor_generator_tag' ), 10, 2 );
76
77 /**
78 * Add translation support for external tinyMCE button
79 *
80 * @since 1.9.7
81 */
82 add_filter( 'mce_external_languages', array( $this, 'tutor_tinymce_translate' ) );
83
84 /**
85 * Identifier class to body tag
86 *
87 * @since v1.9.9
88 */
89 add_filter( 'body_class', array( $this, 'add_identifier_class_to_body' ) );
90 add_filter( 'admin_body_class', array( $this, 'add_identifier_class_to_body' ) );
91
92 /**
93 * Add edit with front end builder button on Gutenberg editor
94 *
95 * @since v2.0.5
96 */
97 add_action( 'enqueue_block_editor_assets', __CLASS__ . '::add_frontend_editor_button' );
98 }
99
100 /**
101 * Load default localized data
102 *
103 * @since 1.0.0
104 * @return array
105 */
106 public function get_default_localized_data() {
107 $home_url = get_home_url();
108 $parsed = parse_url( $home_url );
109
110 $base_path = ( is_array( $parsed ) && isset( $parsed['path'] ) ) ? $parsed['path'] : '/';
111 $base_path = rtrim( $base_path, '/' ) . '/';
112
113 $post_id = get_the_ID();
114 $post_type = get_post_type( $post_id );
115
116 $current_page = tutor_utils()->get_current_page_slug();
117
118 /**
119 * Only required current user data.
120 *
121 * @since 2.6.2
122 */
123 $current_user = array();
124 $userdata = get_userdata( get_current_user_id() );
125
126 if ( $userdata ) {
127 $current_user = array(
128 'roles' => array_values( $userdata->roles ),
129 'data' => array(
130 'id' => $userdata->ID,
131 'display_name' => $userdata->display_name,
132 ),
133 );
134 }
135
136 $tutor_currency = array(
137 'symbol' => Settings::get_currency_symbol_by_code( tutor_utils()->get_option( OptionKeys::CURRENCY_CODE, 'USD' ) ),
138 'currency' => tutor_utils()->get_option( OptionKeys::CURRENCY_CODE ),
139 'position' => tutor_utils()->get_option( OptionKeys::CURRENCY_POSITION, 'left' ),
140 'thousand_separator' => tutor_utils()->get_option( OptionKeys::THOUSAND_SEPARATOR, ',' ),
141 'decimal_separator' => tutor_utils()->get_option( OptionKeys::DECIMAL_SEPARATOR, '.' ),
142 'no_of_decimal' => tutor_utils()->get_option( OptionKeys::NUMBER_OF_DECIMALS, '2' ),
143 );
144
145 /**
146 * Get only required options.
147 *
148 * @since 3.0.0
149 */
150 $required_options = array(
151 'monetize_by',
152 );
153
154 $tutor_settings = Options_V2::get_only( $required_options );
155
156 return array(
157 'ajaxurl' => admin_url( 'admin-ajax.php' ),
158 'home_url' => get_home_url(),
159 'site_title' => get_bloginfo( 'title' ),
160 'base_path' => tutor()->basepath,
161 'tutor_url' => tutor()->url,
162 'tutor_pro_url' => function_exists( 'tutor_pro' ) ? tutor_pro()->url : null,
163 'nonce_key' => tutor()->nonce,
164 tutor()->nonce => wp_create_nonce( tutor()->nonce_action ),
165 'loading_icon_url' => get_admin_url() . 'images/wpspin_light.gif',
166 'placeholder_img_src' => tutor_placeholder_img_src(),
167 'enable_lesson_classic_editor' => get_tutor_option( 'enable_lesson_classic_editor' ),
168 'tutor_frontend_dashboard_url' => tutor_utils()->get_tutor_dashboard_page_permalink(),
169 'wp_date_format' => tutor_js_date_format_against_wp(),
170 'is_admin' => is_admin(),
171 'is_admin_bar_showing' => is_admin_bar_showing(),
172 'addons_data' => tutor_utils()->prepare_free_addons_data(),
173 'current_user' => $current_user,
174 'content_change_event' => 'tutor_content_changed_event',
175 'is_tutor_course_edit' => isset( $_GET['action'] ) && 'edit' === $_GET['action'] && tutor()->course_post_type === get_post_type( get_the_ID() ) ? true : false,
176 'assignment_max_file_allowed' => 'tutor_assignments' === $post_type ? (int) tutor_utils()->get_assignment_option( $post_id, 'upload_files_limit' ) : 0,
177 'current_page' => $current_page,
178 'quiz_answer_display_time' => 1000 * (int) tutor_utils()->get_option( 'quiz_answer_display_time' ),
179 'is_ssl' => is_ssl(),
180 'course_list_page_url' => admin_url( 'admin.php?page=tutor' ),
181 'course_post_type' => tutor()->course_post_type,
182 'tutor_currency' => $tutor_currency,
183 'local' => get_locale(),
184 'settings' => $tutor_settings,
185 );
186 }
187
188 /**
189 * Enqueue scripts for admin
190 *
191 * @since 1.0.0
192 * @since 3.0.0 Order details & coupon scripts added.
193 *
194 * @return void
195 */
196 public function admin_scripts() {
197 wp_enqueue_style( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.min.css', array(), TUTOR_VERSION );
198 wp_enqueue_style( 'tutor-admin', tutor()->url . 'assets/css/tutor-admin.min.css', array(), TUTOR_VERSION );
199 /**
200 * Scripts
201 */
202 wp_enqueue_media();
203
204 wp_enqueue_script( 'wp-color-picker' );
205 wp_enqueue_style( 'wp-color-picker' );
206
207 wp_enqueue_script( 'jquery-ui-slider' );
208 wp_enqueue_script( 'jquery-ui-datepicker' );
209
210 wp_enqueue_script( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.full.min.js', array( 'jquery' ), TUTOR_VERSION, true );
211 wp_enqueue_script( 'tutor-admin', tutor()->url . 'assets/js/tutor-admin.min.js', array( 'jquery', 'tutor-script', 'wp-color-picker', 'wp-i18n', 'wp-data' ), TUTOR_VERSION, true );
212
213 // Tutor order detail & coupon scripts.
214 $page = Input::get( 'page', '' );
215 $action = Input::get( 'action' );
216
217 $allowed_actions = array( 'add_new', 'edit' );
218
219 if ( tutor_utils()->is_monetize_by_tutor() ) {
220 if ( OrderController::PAGE_SLUG === $page && 'edit' === $action ) {
221 wp_enqueue_script( 'tutor-shared', tutor()->url . 'assets/js/tutor-shared.min.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
222 wp_enqueue_script( 'tutor-order-details', tutor()->url . 'assets/js/tutor-order-details.min.js', array( 'wp-i18n', 'wp-element', 'tutor-shared' ), TUTOR_VERSION, true );
223 }
224
225 if ( CouponController::PAGE_SLUG === $page && in_array( $action, $allowed_actions, true ) ) {
226 wp_enqueue_script( 'tutor-shared', tutor()->url . 'assets/js/tutor-shared.min.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
227 wp_enqueue_script( 'tutor-coupon', tutor()->url . 'assets/js/tutor-coupon.min.js', array( 'wp-i18n', 'wp-element', 'tutor-shared' ), TUTOR_VERSION, true );
228 }
229
230 // @since 3.0.0 add tax react app on the settings page.
231 if ( 'tutor_settings' === $page && ! Input::has( 'edit' ) ) {
232 wp_enqueue_script( 'tutor-shared', tutor()->url . 'assets/js/tutor-shared.min.js', array( 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
233 wp_enqueue_script( 'tutor-tax-settings.min', tutor()->url . 'assets/js/tutor-tax-settings.min.js', array( 'wp-i18n', 'wp-element', 'tutor-shared' ), TUTOR_VERSION, true );
234 wp_enqueue_script( 'tutor-payment-settings.min', tutor()->url . 'assets/js/tutor-payment-settings.min.js', array( 'wp-i18n', 'wp-element', 'tutor-shared' ), TUTOR_VERSION, true );
235 }
236 }
237 }
238
239 /**
240 * Load frontend scripts
241 *
242 * @since 1.0.0
243 * @return void
244 */
245 public function frontend_scripts() {
246 global $post, $wp_query;
247
248 /**
249 * We checked wp_enqueue_editor() in condition because it conflicting with Divi Builder
250 * condition updated @since v.1.7.4
251 *
252 * @since 2.7.0 is_user_logged_in() check added to remove duplicate H1 tag on each single post.
253 */
254 if ( is_single() && is_user_logged_in() ) {
255 if ( function_exists( 'et_pb_is_pagebuilder_used' ) ) {
256 $is_page_builder_used = et_pb_is_pagebuilder_used( get_the_ID() );
257 if ( ! $is_page_builder_used ) {
258 wp_enqueue_editor();
259 }
260 } else {
261 wp_enqueue_editor();
262 }
263 }
264
265 /**
266 * Initializing quicktags script to use in wp_editor();
267 */
268 wp_enqueue_script( 'quicktags' );
269
270 $tutor_dashboard_page_id = (int) tutor_utils()->get_option( 'tutor_dashboard_page_id' );
271 if ( get_the_ID() === $tutor_dashboard_page_id ) {
272 wp_enqueue_media();
273 }
274
275 /**
276 * Enabling Sorting, draggable, droppable...
277 */
278 wp_enqueue_script( 'jquery-ui-sortable' );
279 wp_enqueue_script('jquery-touch-punch', ['jquery-ui-sortable']); //phpcs:ignore
280
281 // Plyr.
282 if ( is_single_course( true ) ) {
283 wp_enqueue_style( 'tutor-plyr', tutor()->url . 'assets/lib/plyr/plyr.css', array(), TUTOR_VERSION );
284 wp_enqueue_script( 'tutor-plyr', tutor()->url . 'assets/lib/plyr/plyr.polyfilled.min.js', array( 'jquery' ), TUTOR_VERSION, true );
285 }
286
287 // Social Share.
288 wp_enqueue_script( 'tutor-social-share', tutor()->url . 'assets/lib/SocialShare/SocialShare.min.js', array( 'jquery' ), TUTOR_VERSION, true );
289
290 /**
291 * Chart Data
292 */
293 if ( ! empty( $wp_query->query_vars['tutor_dashboard_page'] ) ) {
294 wp_enqueue_script( 'jquery-ui-slider' );
295
296 wp_enqueue_style( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.min.css', array(), TUTOR_VERSION );
297 wp_enqueue_script( 'tutor-select2', tutor()->url . 'assets/lib/select2/select2.full.min.js', array( 'jquery' ), TUTOR_VERSION, true );
298
299 if ( 'earning' === $wp_query->query_vars['tutor_dashboard_page'] ) {
300 wp_enqueue_script( 'tutor-front-chart-js', tutor()->url . 'assets/lib/Chart.bundle.min.js', array(), TUTOR_VERSION );
301 wp_enqueue_script( 'jquery-ui-datepicker' );
302 }
303 }
304 /**
305 * Dependency wp-i18n added for translate js file
306 *
307 * @since 1.9.0
308 */
309 wp_enqueue_style( 'tutor-frontend', tutor()->url . 'assets/css/tutor-front.min.css', array(), TUTOR_VERSION );
310 wp_enqueue_script( 'tutor-frontend', tutor()->url . 'assets/js/tutor-front.min.js', array( 'jquery', 'wp-i18n' ), TUTOR_VERSION, true );
311
312 /**
313 * Load frontend dashboard style
314 *
315 * @since v1.9.8
316 */
317 $should_load_dashboard_styles = apply_filters( 'tutor_should_load_dashboard_styles', tutor_utils()->is_tutor_frontend_dashboard() );
318 if ( $should_load_dashboard_styles ) {
319 wp_enqueue_style( 'tutor-frontend-dashboard-css', tutor()->url . 'assets/css/tutor-frontend-dashboard.min.css', array(), TUTOR_VERSION );
320 }
321
322 // Load date picker for announcement at frontend.
323 wp_enqueue_script( 'jquery-ui-datepicker' );
324 $css = '.mce-notification.mce-notification-error{display: none !important;}';
325 wp_add_inline_style( 'tutor-frontend', $css );
326 }
327
328 /**
329 * Modify localize data
330 *
331 * @since 1.0.0
332 *
333 * @param array $localize_data localize data.
334 * @return array
335 */
336 public function modify_localize_data( $localize_data ) {
337 global $post;
338
339 if ( is_admin() ) {
340 $taxonomy = Input::get( 'taxonomy' );
341 if ( 'course-category' === $taxonomy || 'course-tag' === $taxonomy ) {
342 $localize_data['open_tutor_admin_menu'] = true;
343 }
344 } else {
345
346 // Assign quiz option.
347 if ( ! empty( $post->post_type ) && 'tutor_quiz' === $post->post_type ) {
348 $single_quiz_options = (array) tutor_utils()->get_quiz_option( $post->ID );
349 $saved_quiz_options = array(
350 'quiz_when_time_expires' => tutor_utils()->get_option( 'quiz_when_time_expires' ),
351 );
352
353 $quiz_options = array_merge( $single_quiz_options, $saved_quiz_options );
354
355 $previous_attempts = tutor_utils()->quiz_attempts();
356
357 if ( $previous_attempts && count( $previous_attempts ) ) {
358 $quiz_options['quiz_auto_start'] = 0;
359 }
360
361 $localize_data['quiz_options'] = $quiz_options;
362 }
363
364 // Including player assets if video exists.
365 if ( tutor_utils()->has_video_in_single() ) {
366 $localize_data['post_id'] = get_the_ID();
367 $localize_data['best_watch_time'] = 0;
368
369 $best_watch_time = tutor_utils()->get_lesson_reading_info( get_the_ID(), 0, 'video_best_watched_time' );
370 if ( $best_watch_time > 0 ) {
371 $localize_data['best_watch_time'] = $best_watch_time;
372 }
373 }
374 }
375
376 return $localize_data;
377 }
378
379 /**
380 * Load common scripts for frontend and backend
381 *
382 * @since 1.0.0
383 * @return void
384 */
385 public function common_scripts() {
386
387 /**
388 * Load TinyMCE for tutor settings page if tutor pro is not available.
389 *
390 * @since v2.0.8
391 */
392 $baseurl = includes_url( 'js/tinymce' );
393 $current_page = Input::get( 'page' );
394
395 // If it is settings page & tutor pro not activated.
396 if ( 'tutor_settings' === $current_page && ! wp_script_is( 'wp-tinymce-root' ) ) {
397 wp_enqueue_script( 'tutor-tiny', $baseurl . '/tinymce.min.js', array( 'jquery' ), TUTOR_VERSION, true );
398 }
399 wp_enqueue_style( 'tutor-icon', tutor()->url . 'assets/css/tutor-icon.min.css', array(), TUTOR_VERSION );
400
401 // Common css library.
402 if ( is_rtl() ) {
403 wp_enqueue_style( 'tutor', tutor()->url . 'assets/css/tutor.rtl.min.css', array(), TUTOR_VERSION );
404 } else {
405 wp_enqueue_style( 'tutor', tutor()->url . 'assets/css/tutor.min.css', array(), TUTOR_VERSION );
406 }
407
408 /**
409 * Load tutor common scripts both backend and frontend
410 *
411 * @since v2.0.0
412 */
413 wp_enqueue_script( 'tutor-script', tutor()->url . 'assets/js/tutor.min.js', array( 'jquery', 'wp-i18n', 'wp-element' ), TUTOR_VERSION, true );
414
415 /**
416 * Enqueue datetime countdown scripts & styles
417 *
418 * Add filter to enqueue countdown scripts & styles
419 * don't return false if it is true to prevent conflict
420 * with other filters
421 *
422 * @since v2.1.0
423 */
424 $should_enqueue = apply_filters( 'tutor_should_enqueue_countdown_scripts', false );
425 if ( $should_enqueue ) {
426 wp_enqueue_script( 'tutor-moment', tutor()->url . 'assets/lib/countdown/moment.min.js', array(), TUTOR_VERSION, true );
427
428 wp_enqueue_script( 'tutor-moment-timezone', tutor()->url . 'assets/lib/countdown/moment-timezone-with-data.min.js', array(), TUTOR_VERSION, true );
429
430 wp_enqueue_script( 'tutor-jquery-countdown', tutor()->url . 'assets/lib/countdown/jquery.countdown.min.js', array( 'jquery' ), TUTOR_VERSION, true );
431
432 wp_enqueue_script( 'tutor-countdown', tutor()->url . 'assets/lib/countdown/tutor-countdown.min.js', array( 'jquery' ), TUTOR_VERSION, true );
433
434 wp_enqueue_style( 'tutor-countdown', tutor()->url . 'assets/lib/countdown/tutor-countdown.min.css', '', TUTOR_VERSION );
435 }
436 }
437
438 /**
439 * Load meta data
440 *
441 * @since 1.0.0
442 * @return void
443 */
444 public function load_meta_data() {
445 // Localize scripts.
446 $localize_data = apply_filters( 'tutor_localize_data', $this->get_default_localized_data() );
447 wp_localize_script( 'tutor-frontend', '_tutorobject', $localize_data );
448 wp_localize_script( 'tutor-admin', '_tutorobject', $localize_data );
449 wp_localize_script( 'tutor-script', '_tutorobject', $localize_data );
450 wp_localize_script( 'tutor-order-details', '_tutorobject', $localize_data );
451 wp_localize_script( 'tutor-tax-settings', '_tutorobject', $localize_data );
452 wp_localize_script( 'tutor-coupon', '_tutorobject', $localize_data );
453
454 // Inline styles.
455 wp_add_inline_style( 'tutor-frontend', $this->load_color_palette() );
456 wp_add_inline_style( 'tutor-admin', $this->load_color_palette() );
457 }
458
459 /**
460 * Load color palette
461 *
462 * @since 1.0.0
463 * @return string
464 */
465 private function load_color_palette() {
466 $colors = array(
467 'tutor_primary_color' => '--tutor-color-primary',
468 'tutor_primary_hover_color' => '--tutor-color-primary-hover',
469 'tutor_text_color' => '--tutor-body-color',
470 'tutor_border_color' => '--tutor-border-color',
471 'tutor_gray_color' => '--tutor-color-gray',
472 );
473
474 // Admin colors.
475 $admin_colors = array();
476 if ( is_admin() ) {
477 $admin_colors = array(
478 '--tutor-color-primary' => '#3E64DE',
479 '--tutor-color-primary-hover' => '#3A5CCC',
480 '--tutor-body-color' => '#212327',
481 '--tutor-border-color' => '#CDCFD5',
482 '--tutor-color-gray' => '#CDCFD5',
483 );
484 }
485
486 $fallback_colors = array(
487 'tutor_primary_color' => '#3E64DE',
488 'tutor_primary_hover_color' => '#3A5CCC',
489 'tutor_text_color' => '#212327',
490 'tutor_border_color' => '#E3E5EB',
491 'tutor_gray_color' => '#CDCFD5',
492 );
493
494 $color_string = '';
495 foreach ( $colors as $key => $property ) {
496 $fallback_color = isset( $fallback_colors[ $key ] ) ? $fallback_colors[ $key ] : '#212327';
497 $color = tutor_utils()->get_option( $key, $fallback_color );
498 $color_rgb = tutor_utils()->hex2rgb( $color );
499
500 if ( is_admin() && isset( $admin_colors[ $property ] ) ) {
501 $color = $admin_colors[ $property ];
502 $color_rgb = tutor_utils()->hex2rgb( $admin_colors[ $property ] );
503 }
504
505 if ( $color ) {
506 $color_string .= $property . ':' . $color . ';';
507 }
508
509 if ( $color_rgb ) {
510 $color_string .= $property . '-rgb:' . $color_rgb . ';';
511 }
512 }
513
514 return ':root{' . $color_string . '}';
515 }
516
517 /**
518 * Add Tinymce button for placing shortcode
519 *
520 * @since 1.0.0
521 * @return void|null
522 */
523 public function tutor_add_mce_button() {
524 // Check user permissions.
525 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
526 return;
527 }
528 // Check if WYSIWYG is enabled.
529 if ( 'true' == get_user_option( 'rich_editing' ) ) {
530 add_filter( 'mce_external_plugins', array( $this, 'tutor_add_tinymce_js' ) );
531 add_filter( 'mce_buttons', array( $this, 'tutor_register_mce_button' ) );
532 }
533 }
534
535 /**
536 * Add tinymce button
537 *
538 * @since 1.0.0
539 *
540 * @param array $plugin_array plugin array.
541 * @return array
542 */
543 public function tutor_add_tinymce_js( $plugin_array ) {
544 $plugin_array['tutor_button'] = tutor()->url . 'assets/lib/mce-button.js';
545 return $plugin_array;
546 }
547
548 /**
549 * Register new button in the editor
550 *
551 * @since 1.0.0
552 *
553 * @param array $buttons buttons.
554 * @return array
555 */
556 public function tutor_register_mce_button( $buttons ) {
557 array_push( $buttons, 'tutor_button' );
558 return $buttons;
559 }
560
561 /**
562 * Output generator tag to aid debugging.
563 *
564 * @since 1.0.0
565 *
566 * @param string $gen Generator.
567 * @param string $type Type.
568 *
569 * @return string
570 */
571 public function tutor_generator_tag( $gen, $type ) {
572 switch ( $type ) {
573 case 'html':
574 $gen .= "\n" . '<meta name="generator" content="TutorLMS ' . TUTOR_VERSION . '">';
575 break;
576 case 'xhtml':
577 $gen .= "\n" . '<meta name="generator" content="TutorLMS ' . TUTOR_VERSION . '" />';
578 break;
579 }
580 return $gen;
581 }
582
583 /**
584 * Load text domain handled script after all enqueue_scripts
585 * registered functions
586 *
587 * @since 1.9.0
588 * @return void
589 */
590 public function tutor_script_text_domain() {
591 wp_set_script_translations( 'tutor-frontend', 'tutor', tutor()->path . 'languages/' );
592 wp_set_script_translations( 'tutor-admin', 'tutor', tutor()->path . 'languages/' );
593 wp_set_script_translations( 'tutor-order-details', 'tutor', tutor()->path . 'languages/' );
594 wp_set_script_translations( 'tutor-tax-settings', 'tutor', tutor()->path . 'languages/' );
595 wp_set_script_translations( 'tutor-coupon', 'tutor', tutor()->path . 'languages/' );
596 }
597
598 /**
599 * Add translation support for external tinyMCE button
600 *
601 * @since 1.9.7
602 * @return array
603 */
604 public function tutor_tinymce_translate() {
605 $locales['tutor_button'] = tutor()->path . 'includes/tinymce_translate.php';
606 return $locales;
607 }
608
609 /**
610 * Add an identifier class to body
611 *
612 * @since 1.0.0
613 *
614 * @param mixed $classes classes.
615 * @return mixed
616 */
617 public function add_identifier_class_to_body( $classes ) {
618 $course_builder_screen = tutor_utils()->get_course_builder_screen();
619 $to_add = array( 'tutor-lms' );
620
621 // Add backend course editor identifier class to body.
622 if ( $course_builder_screen ) {
623 $to_add[] = is_admin() ? 'tutor-backend' : 'tutor-frontend';
624 $to_add[] = ' tutor-screen-course-builder tutor-screen-course-builder-' . $course_builder_screen . ' ';
625 }
626
627 // Add frontend course builder identifier class.
628 if ( ! $course_builder_screen && tutor_utils()->is_tutor_frontend_dashboard() ) {
629 $to_add[] = 'tutor-screen-frontend-dashboard';
630 }
631
632 if ( is_post_type_archive( tutor()->course_post_type ) ) {
633 $to_add[] = 'tutor-frontend';
634 }
635
636 if ( tutor_utils()->is_tutor_frontend_dashboard() ) {
637 $to_add[] = 'tutor-frontend';
638 }
639
640 if ( is_single() ) {
641 global $post;
642
643 $post_types = array(
644 tutor()->course_post_type,
645 tutor()->lesson_post_type,
646 tutor()->quiz_post_type,
647 tutor()->assignment_post_type,
648 tutor()->zoom_post_type,
649 tutor()->meet_post_type,
650 );
651
652 if ( isset( $post->post_type ) && in_array( $post->post_type, $post_types, true ) ) {
653 $to_add[] = 'tutor-frontend';
654 }
655 }
656
657 if ( is_admin() ) {
658 $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
659 $base = ( $screen && is_object( $screen ) && property_exists( $screen, 'base' ) ) ? $screen->base : '';
660 $index = strpos( $base, 'tutor' );
661
662 if ( 0 === $index || $index > 0 ) {
663 $to_add[] = 'tutor-backend';
664
665 $page = Input::get( 'page' );
666 if ( 'tutor_settings' === $page ) {
667 $to_add[] = 'tutor-screen-backend-settings ';
668 }
669 if ( ! empty( $page ) ) {
670 $to_add[] = 'tutor-backend-' . $page;
671 }
672 }
673 }
674
675 // Remove duplicate classes if any.
676 $to_add = array_unique( $to_add );
677
678 if ( is_array( $classes ) ) {
679 $classes = array_merge( $classes, $to_add );
680 } else {
681 $classes .= implode( ' ', $to_add );
682 }
683
684 return $classes;
685 }
686
687 /**
688 * Enqueue script for adding edit with frontend course builder button
689 * on the Gutenberg editor
690 *
691 * @since 2.0.5
692 * @return void
693 */
694 public static function add_frontend_editor_button() {
695 $wp_screen = get_current_screen();
696
697 if ( is_a( $wp_screen, 'WP_Screen' ) && tutor()->course_post_type === $wp_screen->post_type ) {
698 wp_enqueue_script( 'tutor-gutenberg', tutor()->url . 'assets/js/tutor-gutenberg.min.js', array(), TUTOR_VERSION, true );
699 $data = array(
700 'frontend_dashboard_url' => esc_url( trailingslashit( tutor_utils()->tutor_dashboard_url( 'create-course' ) ) ) . '?course_id=' . get_the_ID(),
701 );
702
703 wp_add_inline_script(
704 'tutor-gutenberg',
705 'const tutorInlineData =' . json_encode( $data ),
706 'before'
707 );
708 }
709 }
710 }
711