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