PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 2.7.7
Tutor LMS – eLearning and online course solution v2.7.7
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 2 years ago Admin.php 2 years ago Ajax.php 1 year ago Announcements.php 1 year ago Assets.php 2 years ago Backend_Page_Trait.php 3 years 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 3 years ago Course_Widget.php 3 years ago Custom_Validation.php 3 years ago Dashboard.php 3 years ago FormHandler.php 2 years ago Frontend.php 2 years ago Gutenberg.php 3 years ago Input.php 3 years 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 3 years ago Q_And_A.php 1 year ago Question_Answers_List.php 3 years ago Quiz.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 Student.php 2 years ago Students_List.php 3 years ago Taxonomies.php 3 years ago Template.php 2 years ago Theme_Compatibility.php 3 years ago Tools.php 3 years ago Tools_V2.php 2 years ago Tutor.php 2 years ago TutorEDD.php 2 years ago Tutor_Base.php 2 years ago Tutor_Setup.php 2 years ago Upgrader.php 2 years ago User.php 2 years ago Utils.php 1 year ago Video_Stream.php 3 years ago WhatsNew.php 2 years ago Withdraw.php 2 years ago Withdraw_Requests_List.php 3 years ago WooCommerce.php 1 year ago
Assets.php
685 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 if ( ! defined( 'ABSPATH' ) ) {
14 exit;
15 }
16
17 /**
18 * Assets class
19 *
20 * @since 1.0.0
21 */
22 class Assets {
23
24 /**
25 * Constructor
26 *
27 * @since 1.0.0
28 * @return void
29 */
30 public function __construct() {
31 /**
32 * Common scripts loading
33 */
34 add_action( 'admin_enqueue_scripts', array( $this, 'common_scripts' ) );
35 add_action( 'wp_enqueue_scripts', array( $this, 'common_scripts' ) );
36 /**
37 * Front and backend script enqueue
38 */
39 add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
40 add_action( 'wp_enqueue_scripts', array( $this, 'frontend_scripts' ) );
41
42 add_action( 'admin_enqueue_scripts', array( $this, 'load_meta_data' ) );
43 add_action( 'wp_enqueue_scripts', array( $this, 'load_meta_data' ) );
44
45 /**
46 * Text domain loading
47 */
48 add_action( 'admin_enqueue_scripts', array( $this, 'tutor_script_text_domain' ), 100 );
49 add_action( 'wp_enqueue_scripts', array( $this, 'tutor_script_text_domain' ), 100 );
50 add_filter( 'tutor_localize_data', array( $this, 'modify_localize_data' ) );
51
52 /**
53 * Register translatable function to load
54 * Handled script with text domain attached to
55 *
56 * @since 1.9.0
57 */
58 add_action( 'admin_head', array( $this, 'tutor_add_mce_button' ) );
59 add_filter( 'get_the_generator_html', array( $this, 'tutor_generator_tag' ), 10, 2 );
60 add_filter( 'get_the_generator_xhtml', array( $this, 'tutor_generator_tag' ), 10, 2 );
61
62 /**
63 * Add translation support for external tinyMCE button
64 *
65 * @since 1.9.7
66 */
67 add_filter( 'mce_external_languages', array( $this, 'tutor_tinymce_translate' ) );
68
69 /**
70 * Identifier class to body tag
71 *
72 * @since v1.9.9
73 */
74 add_filter( 'body_class', array( $this, 'add_identifier_class_to_body' ) );
75 add_filter( 'admin_body_class', array( $this, 'add_identifier_class_to_body' ) );
76
77 /**
78 * Add edit with front end builder button on Gutenberg editor
79 *
80 * @since v2.0.5
81 */
82 add_action( 'enqueue_block_editor_assets', __CLASS__ . '::add_frontend_editor_button' );
83 }
84
85 /**
86 * Load default localized data
87 *
88 * @since 1.0.0
89 * @return array
90 */
91 private function get_default_localized_data() {
92 $home_url = get_home_url();
93 $parsed = parse_url( $home_url );
94
95 $base_path = ( is_array( $parsed ) && isset( $parsed['path'] ) ) ? $parsed['path'] : '/';
96 $base_path = rtrim( $base_path, '/' ) . '/';
97
98 $post_id = get_the_ID();
99 $post_type = get_post_type( $post_id );
100
101 $current_page = tutor_utils()->get_current_page_slug();
102
103 /**
104 * Only required current user data.
105 *
106 * @since 2.6.2
107 */
108 $current_user = array();
109 $userdata = get_userdata( get_current_user_id() );
110
111 if ( $userdata ) {
112 $current_user = array(
113 'roles' => $userdata->roles,
114 'data' => array(
115 'id' => $userdata->ID,
116 'display_name' => $userdata->display_name,
117 ),
118 );
119 }
120
121 return array(
122 'ajaxurl' => admin_url( 'admin-ajax.php' ),
123 'home_url' => get_home_url(),
124 'site_title' => get_bloginfo( 'title' ),
125 'base_path' => tutor()->basepath,
126 'tutor_url' => tutor()->url,
127 'tutor_pro_url' => function_exists( 'tutor_pro' ) ? tutor_pro()->url : null,
128 'nonce_key' => tutor()->nonce,
129 tutor()->nonce => wp_create_nonce( tutor()->nonce_action ),
130 'loading_icon_url' => get_admin_url() . 'images/wpspin_light.gif',
131 'placeholder_img_src' => tutor_placeholder_img_src(),
132 'enable_lesson_classic_editor' => get_tutor_option( 'enable_lesson_classic_editor' ),
133 'tutor_frontend_dashboard_url' => tutor_utils()->get_tutor_dashboard_page_permalink(),
134 'wp_date_format' => tutor_js_date_format_against_wp(),
135 'is_admin' => is_admin(),
136 'is_admin_bar_showing' => is_admin_bar_showing(),
137 'addons_data' => tutor_utils()->prepare_free_addons_data(),
138 'current_user' => $current_user,
139 'content_change_event' => 'tutor_content_changed_event',
140 'is_tutor_course_edit' => isset( $_GET['action'] ) && 'edit' === $_GET['action'] && tutor()->course_post_type === get_post_type( get_the_ID() ) ? true : false,
141 'assignment_max_file_allowed' => 'tutor_assignments' === $post_type ? (int) tutor_utils()->get_assignment_option( $post_id, 'upload_files_limit' ) : 0,
142 'current_page' => $current_page,
143 'quiz_answer_display_time' => 1000 * (int) tutor_utils()->get_option( 'quiz_answer_display_time' ),
144 'is_ssl' => is_ssl(),
145 'course_list_page_url' => admin_url( 'admin.php?page=tutor' ),
146 'course_post_type' => tutor()->course_post_type,
147 );
148 }
149
150 /**
151 * Enqueue scripts for admin
152 *
153 * @since 1.0.0
154 * @return void
155 */
156 public function admin_scripts() {
157 wp_enqueue_style( 'tutor-select2', tutor()->url . 'assets/packages/select2/select2.min.css', array(), TUTOR_VERSION );
158 wp_enqueue_style( 'tutor-admin', tutor()->url . 'assets/css/tutor-admin.min.css', array(), TUTOR_VERSION );
159 /**
160 * Scripts
161 */
162 wp_enqueue_media();
163
164 wp_enqueue_script( 'wp-color-picker' );
165 wp_enqueue_style( 'wp-color-picker' );
166
167 wp_enqueue_script( 'jquery-ui-slider' );
168 wp_enqueue_script( 'jquery-ui-datepicker' );
169
170 wp_enqueue_script( 'tutor-select2', tutor()->url . 'assets/packages/select2/select2.full.min.js', array( 'jquery' ), TUTOR_VERSION, true );
171 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 );
172 }
173
174 /**
175 * Load frontend scripts
176 *
177 * @since 1.0.0
178 * @return void
179 */
180 public function frontend_scripts() {
181 global $post, $wp_query;
182
183 /**
184 * We checked wp_enqueue_editor() in condition because it conflicting with Divi Builder
185 * condition updated @since v.1.7.4
186 *
187 * @since 2.7.0 is_user_logged_in() check added to remove duplicate H1 tag on each single post.
188 */
189 if ( is_single() && is_user_logged_in() ) {
190 if ( function_exists( 'et_pb_is_pagebuilder_used' ) ) {
191 $is_page_builder_used = et_pb_is_pagebuilder_used( get_the_ID() );
192 if ( ! $is_page_builder_used ) {
193 wp_enqueue_editor();
194 }
195 } else {
196 wp_enqueue_editor();
197 }
198 }
199
200 /**
201 * Initializing quicktags script to use in wp_editor();
202 */
203 wp_enqueue_script( 'quicktags' );
204
205 $tutor_dashboard_page_id = (int) tutor_utils()->get_option( 'tutor_dashboard_page_id' );
206 if ( get_the_ID() === $tutor_dashboard_page_id ) {
207 wp_enqueue_media();
208 }
209
210 /**
211 * Enabling Sorting, draggable, droppable...
212 */
213 wp_enqueue_script( 'jquery-ui-sortable' );
214 wp_enqueue_script( 'jquery-touch-punch', array( 'jquery-ui-sortable' ) ); //phpcs:ignore
215
216 // Plyr.
217 if ( is_single_course( true ) ) {
218 wp_enqueue_style( 'tutor-plyr', tutor()->url . 'assets/packages/plyr/plyr.css', array(), TUTOR_VERSION );
219 wp_enqueue_script( 'tutor-plyr', tutor()->url . 'assets/packages/plyr/plyr.polyfilled.min.js', array( 'jquery' ), TUTOR_VERSION, true );
220 }
221
222 // Social Share.
223 wp_enqueue_script( 'tutor-social-share', tutor()->url . 'assets/packages/SocialShare/SocialShare.min.js', array( 'jquery' ), TUTOR_VERSION, true );
224
225 /**
226 * Chart Data
227 */
228 if ( ! empty( $wp_query->query_vars['tutor_dashboard_page'] ) ) {
229 wp_enqueue_script( 'jquery-ui-slider' );
230
231 wp_enqueue_style( 'tutor-select2', tutor()->url . 'assets/packages/select2/select2.min.css', array(), TUTOR_VERSION );
232 wp_enqueue_script( 'tutor-select2', tutor()->url . 'assets/packages/select2/select2.full.min.js', array( 'jquery' ), TUTOR_VERSION, true );
233
234 if ( 'earning' === $wp_query->query_vars['tutor_dashboard_page'] ) {
235 wp_enqueue_script( 'tutor-front-chart-js', tutor()->url . 'assets/js/lib/Chart.bundle.min.js', array(), TUTOR_VERSION );
236 wp_enqueue_script( 'jquery-ui-datepicker' );
237 }
238 }
239 /**
240 * Dependency wp-i18n added for translate js file
241 *
242 * @since 1.9.0
243 */
244 wp_enqueue_style( 'tutor-frontend', tutor()->url . 'assets/css/tutor-front.min.css', array(), TUTOR_VERSION );
245 wp_enqueue_script( 'tutor-frontend', tutor()->url . 'assets/js/tutor-front.min.js', array( 'jquery', 'wp-i18n' ), TUTOR_VERSION, true );
246
247 /**
248 * Load frontend dashboard style
249 *
250 * @since v1.9.8
251 */
252 $should_load_dashboard_styles = apply_filters( 'tutor_should_load_dashboard_styles', tutor_utils()->is_tutor_frontend_dashboard() );
253 if ( $should_load_dashboard_styles ) {
254 wp_enqueue_style( 'tutor-frontend-dashboard-css', tutor()->url . 'assets/css/tutor-frontend-dashboard.min.css', array(), TUTOR_VERSION );
255 }
256
257 // Load date picker for announcement at frontend.
258 wp_enqueue_script( 'jquery-ui-datepicker' );
259 $css = '.mce-notification.mce-notification-error{display: none !important;}';
260 wp_add_inline_style( 'tutor-frontend', $css );
261 }
262
263 /**
264 * Modify localize data
265 *
266 * @since 1.0.0
267 *
268 * @param array $localize_data localize data.
269 * @return array
270 */
271 public function modify_localize_data( $localize_data ) {
272 global $post;
273
274 if ( is_admin() ) {
275 $taxonomy = Input::get( 'taxonomy' );
276 if ( 'course-category' === $taxonomy || 'course-tag' === $taxonomy ) {
277 $localize_data['open_tutor_admin_menu'] = true;
278 }
279 } else {
280
281 // Assign quiz option.
282 if ( ! empty( $post->post_type ) && 'tutor_quiz' === $post->post_type ) {
283 $single_quiz_options = (array) tutor_utils()->get_quiz_option( $post->ID );
284 $saved_quiz_options = array(
285 'quiz_when_time_expires' => tutor_utils()->get_option( 'quiz_when_time_expires' ),
286 );
287
288 $quiz_options = array_merge( $single_quiz_options, $saved_quiz_options );
289
290 $previous_attempts = tutor_utils()->quiz_attempts();
291
292 if ( $previous_attempts && count( $previous_attempts ) ) {
293 $quiz_options['quiz_auto_start'] = 0;
294 }
295
296 $localize_data['quiz_options'] = $quiz_options;
297 }
298
299 // Including player assets if video exists.
300 if ( tutor_utils()->has_video_in_single() ) {
301 $localize_data['post_id'] = get_the_ID();
302 $localize_data['best_watch_time'] = 0;
303
304 $best_watch_time = tutor_utils()->get_lesson_reading_info( get_the_ID(), 0, 'video_best_watched_time' );
305 if ( $best_watch_time > 0 ) {
306 $localize_data['best_watch_time'] = $best_watch_time;
307 }
308 }
309 }
310
311 return $localize_data;
312 }
313
314 /**
315 * Load common scripts for frontend and backend
316 *
317 * @since 1.0.0
318 * @return void
319 */
320 public function common_scripts() {
321
322 /**
323 * Load TinyMCE for tutor settings page if tutor pro is not available.
324 *
325 * @since v2.0.8
326 */
327 $baseurl = includes_url( 'js/tinymce' );
328 $current_page = Input::get( 'page' );
329
330 // If it is settings page & tutor pro not activated.
331 if ( 'tutor_settings' === $current_page && ! wp_script_is( 'wp-tinymce-root' ) ) {
332 wp_enqueue_script( 'tutor-tiny', $baseurl . '/tinymce.min.js', array( 'jquery' ), TUTOR_VERSION, true );
333 }
334 wp_enqueue_style( 'tutor-icon', tutor()->url . 'assets/css/tutor-icon.min.css', array(), TUTOR_VERSION );
335
336 // Common css library.
337 if ( is_rtl() ) {
338 wp_enqueue_style( 'tutor', tutor()->url . 'assets/css/tutor.rtl.min.css', array(), TUTOR_VERSION );
339 } else {
340 wp_enqueue_style( 'tutor', tutor()->url . 'assets/css/tutor.min.css', array(), TUTOR_VERSION );
341 }
342
343 // Load course builder resources.
344 $load_course_builder_scripts = apply_filters( 'tutor_load_course_builder_scripts', tutor_utils()->get_course_builder_screen() );
345 if ( $load_course_builder_scripts ) {
346 wp_enqueue_script( 'tutor-course-builder', tutor()->url . 'assets/js/tutor-course-builder.min.js', array( 'jquery', 'wp-i18n' ), TUTOR_VERSION, true );
347 wp_enqueue_style( 'tutor-course-builder-css', tutor()->url . 'assets/css/tutor-course-builder.min.css', array(), TUTOR_VERSION );
348 }
349 /**
350 * Load tutor common scripts both backend and frontend
351 *
352 * @since v2.0.0
353 */
354 wp_enqueue_script( 'tutor-script', tutor()->url . 'assets/js/tutor.min.js', array( 'jquery', 'wp-i18n' ), TUTOR_VERSION, true );
355
356 /**
357 * Enqueue datetime countdown scripts & styles
358 *
359 * Add filter to enqueue countdown scripts & styles
360 * don't return false if it is true to prevent conflict
361 * with other filters
362 *
363 * @since v2.1.0
364 */
365 $should_enqueue = apply_filters( 'tutor_should_enqueue_countdown_scripts', false );
366 if ( $should_enqueue ) {
367 wp_enqueue_script( 'tutor-moment', tutor()->url . 'assets/js/lib/countdown/moment.min.js', array(), TUTOR_VERSION, true );
368
369 wp_enqueue_script( 'tutor-moment-timezone', tutor()->url . 'assets/js/lib/countdown/moment-timezone-with-data.min.js', array(), TUTOR_VERSION, true );
370
371 wp_enqueue_script( 'tutor-jquery-countdown', tutor()->url . 'assets/js/lib/countdown/jquery.countdown.min.js', array( 'jquery' ), TUTOR_VERSION, true );
372
373 wp_enqueue_script( 'tutor-countdown', tutor()->url . 'assets/js/lib/countdown/tutor-countdown.min.js', array( 'jquery' ), TUTOR_VERSION, true );
374
375 wp_enqueue_style( 'tutor-countdown', tutor()->url . 'assets/js/lib/countdown/tutor-countdown.min.css', '', TUTOR_VERSION );
376 }
377 }
378
379 /**
380 * Load meta data
381 *
382 * @since 1.0.0
383 * @return void
384 */
385 public function load_meta_data() {
386 // Localize scripts.
387 $localize_data = apply_filters( 'tutor_localize_data', $this->get_default_localized_data() );
388 wp_localize_script( 'tutor-frontend', '_tutorobject', $localize_data );
389 wp_localize_script( 'tutor-admin', '_tutorobject', $localize_data );
390 wp_localize_script( 'tutor-course-builder', '_tutorobject', $localize_data );
391 wp_localize_script( 'tutor-script', '_tutorobject', $localize_data );
392
393 // Inline styles.
394 wp_add_inline_style( 'tutor-frontend', $this->load_color_palette() );
395 wp_add_inline_style( 'tutor-admin', $this->load_color_palette() );
396 }
397
398 /**
399 * Load color palette
400 *
401 * @since 1.0.0
402 * @return string
403 */
404 private function load_color_palette() {
405 $colors = array(
406 'tutor_primary_color' => '--tutor-color-primary',
407 'tutor_primary_hover_color' => '--tutor-color-primary-hover',
408 'tutor_text_color' => '--tutor-body-color',
409 'tutor_border_color' => '--tutor-border-color',
410 'tutor_gray_color' => '--tutor-color-gray',
411 );
412
413 // Admin colors.
414 $admin_colors = array();
415 if ( is_admin() ) {
416 $admin_color = get_user_option( 'admin_color' );
417
418 switch ( $admin_color ) {
419 case 'light':
420 $admin_color_codes = array( '#04a4cc', '#04b0db' );
421 break;
422
423 case 'modern':
424 $admin_color_codes = array( '#3858e9', '#4664eb' );
425 break;
426
427 case 'blue':
428 $admin_color_codes = array( '#e1a948', '#e3af55' );
429 break;
430
431 case 'coffee':
432 $admin_color_codes = array( '#c7a589', '#ccad93' );
433 break;
434
435 case 'ectoplasm':
436 $admin_color_codes = array( '#a3b745', '#a9bd4f' );
437 break;
438
439 case 'midnight':
440 $admin_color_codes = array( '#e14d43', '#e35950' );
441 break;
442
443 case 'ocean':
444 $admin_color_codes = array( '#9ebaa0', '#a7c0a9' );
445 break;
446
447 case 'sunrise':
448 $admin_color_codes = array( '#dd823b', '#df8a48' );
449 break;
450
451 default:
452 $admin_color_codes = array( '#007cba', '#006ba1' );
453 break;
454 }
455
456 $admin_colors = array(
457 '--tutor-color-primary' => $admin_color_codes[0],
458 '--tutor-color-primary-hover' => $admin_color_codes[1],
459 );
460 }
461
462 $fallback_colors = array(
463 'tutor_primary_color' => '#3E64DE',
464 'tutor_primary_hover_color' => '#395BCA',
465 'tutor_text_color' => '#212327',
466 'tutor_border_color' => '#E3E5EB',
467 'tutor_gray_color' => '#CDCFD5',
468 );
469
470 $color_string = '';
471 foreach ( $colors as $key => $property ) {
472 $fallback_color = isset( $fallback_colors[ $key ] ) ? $fallback_colors[ $key ] : '#212327';
473 $color = tutor_utils()->get_option( $key, $fallback_color );
474 $color_rgb = tutor_utils()->hex2rgb( $color );
475
476 if ( is_admin() && isset( $admin_colors[ $property ] ) ) {
477 $color = $admin_colors[ $property ];
478 $color_rgb = tutor_utils()->hex2rgb( $admin_colors[ $property ] );
479 }
480
481 if ( $color ) {
482 $color_string .= $property . ':' . $color . ';';
483 }
484
485 if ( $color_rgb ) {
486 $color_string .= $property . '-rgb:' . $color_rgb . ';';
487 }
488 }
489
490 return ':root{' . $color_string . '}';
491 }
492
493 /**
494 * Add Tinymce button for placing shortcode
495 *
496 * @since 1.0.0
497 * @return void|null
498 */
499 public function tutor_add_mce_button() {
500 // Check user permissions.
501 if ( ! current_user_can( 'edit_posts' ) && ! current_user_can( 'edit_pages' ) ) {
502 return;
503 }
504 // Check if WYSIWYG is enabled.
505 if ( 'true' == get_user_option( 'rich_editing' ) ) {
506 add_filter( 'mce_external_plugins', array( $this, 'tutor_add_tinymce_js' ) );
507 add_filter( 'mce_buttons', array( $this, 'tutor_register_mce_button' ) );
508 }
509 }
510
511 /**
512 * Add tinymce button
513 *
514 * @since 1.0.0
515 *
516 * @param array $plugin_array plugin array.
517 * @return array
518 */
519 public function tutor_add_tinymce_js( $plugin_array ) {
520 $plugin_array['tutor_button'] = tutor()->url . 'assets/js/lib/mce-button.js';
521 return $plugin_array;
522 }
523
524 /**
525 * Register new button in the editor
526 *
527 * @since 1.0.0
528 *
529 * @param array $buttons buttons.
530 * @return array
531 */
532 public function tutor_register_mce_button( $buttons ) {
533 array_push( $buttons, 'tutor_button' );
534 return $buttons;
535 }
536
537 /**
538 * Output generator tag to aid debugging.
539 *
540 * @since 1.0.0
541 *
542 * @param string $gen Generator.
543 * @param string $type Type.
544 *
545 * @return string
546 */
547 public function tutor_generator_tag( $gen, $type ) {
548 switch ( $type ) {
549 case 'html':
550 $gen .= "\n" . '<meta name="generator" content="TutorLMS ' . TUTOR_VERSION . '">';
551 break;
552 case 'xhtml':
553 $gen .= "\n" . '<meta name="generator" content="TutorLMS ' . TUTOR_VERSION . '" />';
554 break;
555 }
556 return $gen;
557 }
558
559 /**
560 * Load text domain handled script after all enqueue_scripts
561 * registered functions
562 *
563 * @since 1.9.0
564 * @return void
565 */
566 public function tutor_script_text_domain() {
567 wp_set_script_translations( 'tutor-frontend', 'tutor', tutor()->path . 'languages/' );
568 wp_set_script_translations( 'tutor-admin', 'tutor', tutor()->path . 'languages/' );
569 wp_set_script_translations( 'tutor-course-builder', 'tutor', tutor()->path . 'languages/' );
570 }
571
572 /**
573 * Add translation support for external tinyMCE button
574 *
575 * @since 1.9.7
576 * @return array
577 */
578 public function tutor_tinymce_translate() {
579 $locales['tutor_button'] = tutor()->path . 'includes/tinymce_translate.php';
580 return $locales;
581 }
582
583 /**
584 * Add an identifier class to body
585 *
586 * @since 1.0.0
587 *
588 * @param mixed $classes classes.
589 * @return mixed
590 */
591 public function add_identifier_class_to_body( $classes ) {
592 $course_builder_screen = tutor_utils()->get_course_builder_screen();
593 $to_add = array( 'tutor-lms' );
594
595 // Add backend course editor identifier class to body.
596 if ( $course_builder_screen ) {
597 $to_add[] = is_admin() ? 'tutor-backend' : 'tutor-frontend';
598 $to_add[] = ' tutor-screen-course-builder tutor-screen-course-builder-' . $course_builder_screen . ' ';
599 }
600
601 // Add frontend course builder identifier class.
602 if ( ! $course_builder_screen && tutor_utils()->is_tutor_frontend_dashboard() ) {
603 $to_add[] = 'tutor-screen-frontend-dashboard';
604 }
605
606 if ( is_post_type_archive( tutor()->course_post_type ) ) {
607 $to_add[] = 'tutor-frontend';
608 }
609
610 if ( tutor_utils()->is_tutor_frontend_dashboard() ) {
611 $to_add[] = 'tutor-frontend';
612 }
613
614 if ( is_single() ) {
615 global $post;
616
617 $post_types = array(
618 tutor()->course_post_type,
619 tutor()->lesson_post_type,
620 tutor()->quiz_post_type,
621 tutor()->assignment_post_type,
622 tutor()->zoom_post_type,
623 tutor()->meet_post_type,
624 );
625
626 if ( isset( $post->post_type ) && in_array( $post->post_type, $post_types, true ) ) {
627 $to_add[] = 'tutor-frontend';
628 }
629 }
630
631 if ( is_admin() ) {
632 $screen = function_exists( 'get_current_screen' ) ? get_current_screen() : null;
633 $base = ( $screen && is_object( $screen ) && property_exists( $screen, 'base' ) ) ? $screen->base : '';
634 $index = strpos( $base, 'tutor' );
635
636 if ( 0 === $index || $index > 0 ) {
637 $to_add[] = 'tutor-backend';
638
639 $page = Input::get( 'page' );
640 if ( 'tutor_settings' === $page ) {
641 $to_add[] = 'tutor-screen-backend-settings ';
642 }
643 if ( ! empty( $page ) ) {
644 $to_add[] = 'tutor-backend-' . $page;
645 }
646 }
647 }
648
649 // Remove duplicate classes if any.
650 $to_add = array_unique( $to_add );
651
652 if ( is_array( $classes ) ) {
653 $classes = array_merge( $classes, $to_add );
654 } else {
655 $classes .= implode( ' ', $to_add );
656 }
657
658 return $classes;
659 }
660
661 /**
662 * Enqueue script for adding edit with frontend course builder button
663 * on the Gutenberg editor
664 *
665 * @since 2.0.5
666 * @return void
667 */
668 public static function add_frontend_editor_button() {
669 $wp_screen = get_current_screen();
670
671 if ( is_a( $wp_screen, 'WP_Screen' ) && tutor()->course_post_type === $wp_screen->post_type ) {
672 wp_enqueue_script( 'tutor-gutenberg', tutor()->url . 'assets/js/tutor-gutenberg.min.js', array(), TUTOR_VERSION, true );
673 $data = array(
674 'frontend_dashboard_url' => esc_url( trailingslashit( tutor_utils()->tutor_dashboard_url( 'create-course' ) ) ) . '?course_ID=' . get_the_ID(),
675 );
676
677 wp_add_inline_script(
678 'tutor-gutenberg',
679 'const tutorInlineData =' . json_encode( $data ),
680 'before'
681 );
682 }
683 }
684 }
685