PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.1
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.1
4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 4.2.1 All 138 releases
learnpress / inc / TemplateHooks / Course / SingleCourseModernLayout.php

SingleCourseModernLayout.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.1, at inc/TemplateHooks/Course/SingleCourseModernLayout.php

608 lines 20.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Template hooks Single Course Online.
4 *
5 * @since 4.2.7
6 * @version 1.0.0
7 */
8
9 namespace LearnPress\TemplateHooks\Course;
10
11 use LearnPress\Helpers\Singleton;
12 use LearnPress\Helpers\Template;
13 use LearnPress\Models\CourseModel;
14 use LearnPress\Models\UserItems\UserCourseModel;
15 use LearnPress\Models\UserItems\UserItemModel;
16 use LearnPress\TemplateHooks\UserItem\UserCourseTemplate;
17 use LearnPress\Models\UserModel;
18 use LearnPress\TemplateHooks\Instructor\SingleInstructorTemplate;
19 use LP_Datetime;
20
21 class SingleCourseModernLayout {
22 use Singleton;
23
24 /**
25 * @var SingleCourseTemplate
26 */
27 public $singleCourseTemplate;
28
29 public function init() {
30 $this->singleCourseTemplate = SingleCourseTemplate::instance();
31
32 add_action(
33 'learn-press/single-course/layout',
34 [ $this, 'course_model_layout' ]
35 );
36 }
37
38 /**
39 * Single course layout model
40 *
41 * @param $course
42 *
43 * @return void
44 */
45 public function course_model_layout( $course ) {
46 if ( ! $course instanceof CourseModel ) {
47 return;
48 }
49
50 $user = UserModel::find( get_current_user_id(), true );
51
52 // Related courses
53 ob_start();
54 do_action( 'learn-press/single-course/courses-related/layout', $course, 4 );
55 $html_courses_related = ob_get_clean();
56
57 // Global message
58 ob_start();
59 learn_press_show_message();
60 $global_message = ob_get_clean();
61
62 $sections = apply_filters(
63 'learn-press/single-course/modern/sections',
64 [
65 'wrapper' => '<div class="lp-single-course">',
66 'section_header' => $this->header_sections( $course, $user ),
67 'wrapper_container' => '<div class="lp-content-area">',
68 'wrapper_main' => '<div class="lp-single-course-main">',
69 'global_message' => $global_message,
70 'section_left' => $this->section_left( $course, $user ),
71 'section_right' => $this->section_right( $course, $user ),
72 'wrapper_main_end' => '</div>',
73 'related_courses' => $html_courses_related,
74 'wrapper_container_end' => '</div>',
75 'wrapper_end' => '</div>',
76 ]
77 );
78
79 echo Template::combine_components( $sections );
80 }
81
82 /**
83 * HTML header section
84 *
85 * @param $course
86 * @param $user
87 *
88 * @return string
89 */
90 public function header_sections( $course, $user ): string {
91 $html_categories = $this->singleCourseTemplate->html_categories( $course );
92 if ( ! empty( $html_categories ) ) {
93 $html_categories = sprintf(
94 '<div>%s %s</div>',
95 sprintf( '<label>%s</label>', esc_html__( 'in', 'learnpress' ) ),
96 $html_categories
97 );
98 }
99
100 $section_info_one = apply_filters(
101 'learn-press/single-course/modern/header/info-meta',
102 [
103 'wrapper' => '<div class="lp-single-course-info-one">',
104 'author' => '',
105 'last_update' => sprintf(
106 '<div class="item-meta">%s: %s</div>',
107 esc_html__( 'Last updated', 'learnpress' ),
108 esc_attr( get_post_modified_time( get_option( 'date_format' ), true ) )
109 ),
110 'wrapper_end' => '</div>',
111 ],
112 $course,
113 $user
114 );
115 if ( ! has_filter( 'learn-press/single-course/modern/header/info-meta' ) ) {
116 // Do not use this hook, this hook only for handle hook without update from Addon, when handle on Addon, will remove this hook
117 $section_info_one = apply_filters(
118 'learn-press/single-course/offline/info-bar',
119 $section_info_one,
120 $course,
121 $user
122 );
123 }
124
125 $html_instructor = sprintf(
126 '<div>%s %s</div>',
127 sprintf( '<label>%s</label>', esc_html__( 'by', 'learnpress' ) ),
128 $this->singleCourseTemplate->html_instructor( $course )
129 );
130
131 $header_sections = apply_filters(
132 'learn-press/single-course/modern/header/sections',
133 [
134 'wrapper_header' => '<div class="lp-single-course__header">',
135 'wrapper_container' => '<div class="lp-single-course__header__inner">',
136 'breadcrumb' => Template::html_breadcrumb(),
137 'title' => $this->singleCourseTemplate->html_title( $course, 'h1' ),
138 'wrapper_instructor_cate' => '<div class="course-instructor-category">',
139 'instructor' => $html_instructor,
140 'category' => $html_categories,
141 'wrapper_instructor_cate_end' => '</div>',
142 'info_one' => Template::combine_components( $section_info_one ),
143 'wrapper_container_end' => '</div>',
144 'wrapper_header_end' => '</div>',
145 ],
146 $course,
147 $user
148 );
149
150 return Template::combine_components( $header_sections );
151 }
152
153 /**
154 * HTML left section
155 *
156 * @param $course
157 * @param $user
158 *
159 * @return string
160 */
161 public function section_left( $course, $user ): string {
162 $section = apply_filters(
163 'learn-press/single-course/modern/section_left',
164 [
165 'wrapper' => '<div class="lp-single-course-main__left">',
166 'description' => $this->singleCourseTemplate->html_description( $course ),
167 'features' => $this->singleCourseTemplate->html_features( $course ),
168 'target' => $this->singleCourseTemplate->html_target( $course ),
169 'requirements' => $this->singleCourseTemplate->html_requirements( $course ),
170 'curriculum' => $this->singleCourseTemplate->html_curriculum( $course, $user ),
171 'material' => $this->singleCourseTemplate->html_material( $course, $user ),
172 'faqs' => $this->singleCourseTemplate->html_faqs( $course ),
173 'instructor' => $this->html_instructor_info( $course, $user ),
174 'featured_review_mobile' => $this->singleCourseTemplate->html_feature_review( $course, $user, [ 'lp_display_on' => 'lp-is-mobile' ] ),
175 'comment' => $this->singleCourseTemplate->html_comment( $course, $user ),
176 'sidebar_mobile' => $this->singleCourseTemplate->html_sidebar( $course, [ 'lp_display_on' => 'lp-is-mobile' ] ),
177 'wrapper_end' => '</div>',
178 ],
179 $course,
180 $user
181 );
182
183 return Template::combine_components( $section );
184 }
185
186 /**
187 * HTML right section
188 *
189 * @param $course
190 * @param $user
191 *
192 * @return string
193 */
194 public function section_right( $course, $user ): string {
195 $user_id = 0;
196 if ( $user instanceof UserModel ) {
197 $user_id = $user->get_id();
198 }
199 $userCourseModel = UserCourseModel::find( $user_id, $course->get_id(), true );
200
201 $data_info_meta = [
202 'student' => [
203 'label' => sprintf( '<i class="lp-icon-user-graduate"></i>%s:', esc_html__( 'Student', 'learnpress' ) ),
204 'value' => $this->singleCourseTemplate->html_count_student( $course ),
205 ],
206 'lesson' => [
207 'label' => sprintf( '<i class="lp-icon-file-o"></i>%s:', esc_html__( 'Lesson', 'learnpress' ) ),
208 'value' => $this->singleCourseTemplate->html_count_item( $course, LP_LESSON_CPT ),
209 ],
210 'duration' => [
211 'label' => sprintf( '<i class="lp-icon-clock-o"></i>%s:', esc_html__( 'Duration', 'learnpress' ) ),
212 'value' => $this->singleCourseTemplate->html_duration( $course ),
213 ],
214 'quiz' => [
215 'label' => sprintf( '<i class="lp-icon-puzzle-piece"></i>%s:', esc_html__( 'Quiz', 'learnpress' ) ),
216 'value' => $this->singleCourseTemplate->html_count_item( $course, LP_QUIZ_CPT ),
217 ],
218 'level' => [
219 'label' => sprintf( '<i class="lp-icon-signal"></i>%s:', esc_html__( 'Level', 'learnpress' ) ),
220 'value' => $this->singleCourseTemplate->html_level( $course ),
221 ],
222 ];
223
224 $data_info_meta = apply_filters( 'learn-press/single-course/modern/info-meta', $data_info_meta, $course, $user );
225 $html_info_meta = '';
226 if ( ! empty( $data_info_meta ) ) {
227 foreach ( $data_info_meta as $info_meta ) {
228 $label = $info_meta['label'];
229 $value = $info_meta['value'];
230 $html_info_two_item = sprintf(
231 '<div class="info-meta-item">
232 <span class="info-meta-left">%s</span>
233 <span class="info-meta-right">%s</span>
234 </div>',
235 $label,
236 $value
237 );
238 $html_info_meta .= $html_info_two_item;
239 }
240 }
241
242 $section_info_meta = apply_filters(
243 'learn-press/single-course/modern/section-right/info-meta',
244 [
245 'wrapper' => '<div class="info-metas">',
246 'featured' => $this->singleCourseTemplate->html_featured( $course ),
247 'meta' => $html_info_meta,
248 'wrapper_end' => '</div>',
249 ],
250 $course,
251 $user
252 );
253
254 $html_price = '';
255 if ( ! $userCourseModel || $user_id === 0
256 || $userCourseModel->get_status() === UserItemModel::STATUS_CANCEL ) {
257 $html_price = $this->singleCourseTemplate->html_price( $course );
258 }
259
260 $section = apply_filters(
261 'learn-press/single-course/modern/section_right',
262 [
263 'wrapper' => '<div class="lp-single-course-main__right">',
264 'wrapper_inner' => '<div class="lp-single-course-main__right__inner">',
265 'image' => $this->singleCourseTemplate->html_image( $course ),
266 'price' => $html_price,
267 'info_learning' => $this->html_info_learning( $course, $user ),
268 //'sale_discount' => $this->singleCourseTemplate->html_sale_discount( $course ), to do
269 'metas' => Template::combine_components( $section_info_meta ),
270 'buttons' => $this->html_buttons( $course, $user ),
271 'share' => $this->html_share( $course ),
272 'featured_review' => $this->singleCourseTemplate->html_feature_review( $course, $user, [ 'lp_display_on' => 'lp-is-pc' ] ),
273 'sidebar' => $this->singleCourseTemplate->html_sidebar( $course, [ 'lp_display_on' => 'lp-is-pc' ] ),
274 'wrapper_inner_end' => '</div>',
275 'wrapper_end' => '</div>',
276 ],
277 $course,
278 $user
279 );
280
281 return Template::combine_components( $section );
282 }
283
284 /**
285 * HTML share social.
286 *
287 * @param CourseModel $courseModel
288 * @param array $data
289 *
290 * @return string
291 * @since 4.2.7.6
292 * @version 1.0.1
293 */
294 public function html_share( CourseModel $courseModel, array $data = [] ): string {
295 $list_socials = apply_filters(
296 'learn-press/single-course/social-share',
297 [
298 'facebook' => [
299 'label' => esc_html__( 'Facebook', 'learnpress' ),
300 'icon' => '<i class="lp-icon-facebook"></i>',
301 'url' => sprintf(
302 'https://www.facebook.com/sharer.php?u=%s',
303 urlencode( $courseModel->get_permalink() )
304 ),
305 ],
306 'twitter' => [
307 'label' => esc_html__( 'Twitter', 'learnpress' ),
308 'icon' => '<i class="lp-icon-twitter"></i>',
309 'url' => sprintf(
310 'https://twitter.com/share?url=%1$s&amp;text=%2$s',
311 urlencode( $courseModel->get_permalink() ),
312 rawurlencode( esc_attr( $courseModel->get_title() ) )
313 ),
314 ],
315 'pinterest' => [
316 'label' => esc_html__( 'Pinterest', 'learnpress' ),
317 'icon' => '<i class="lp-icon-pinterest-p"></i>',
318 'url' => sprintf(
319 'https://pinterest.com/pin/create/button/?url=%1$s&amp;description=%2$s&amp;media=%3$s',
320 urlencode( $courseModel->get_permalink() ),
321 rawurlencode( esc_attr( $courseModel->get_short_description() ) ),
322 urlencode( $courseModel->get_image_url() )
323 ),
324 ],
325 'linkedin' => [
326 'label' => esc_html__( 'Linkedin', 'learnpress' ),
327 'icon' => '<i class="lp-icon-linkedin"></i>',
328 'url' => sprintf(
329 'https://www.linkedin.com/shareArticle?mini=true&url=%1$s&title=%2$s&summary=&source=%3$s',
330 urlencode( $courseModel->get_permalink() ),
331 esc_attr( $courseModel->get_title() ),
332 esc_attr( $courseModel->get_short_description() )
333 ),
334 ],
335 ]
336 );
337
338 $html_social = '';
339 if ( ! empty( $list_socials ) ) {
340 foreach ( $list_socials as $key => $social ) {
341 $html_social .= sprintf(
342 '<li>
343 <a target="_blank" href="%s" title="%s">%s<span>%s</span></a>
344 </li>',
345 esc_url_raw( $social['url'] ?? '' ),
346 esc_attr( $social['label'] ?? '' ),
347 Template::sanitize_html_content( $social['icon'] ?? '' ),
348 esc_html( $social['label'] ?? '' )
349 );
350 }
351 } else {
352 return '';
353 }
354
355 $social_media = apply_filters(
356 'learn-press/single-course/social-share/ul',
357 [
358 'wrapper' => '<ul class="lp-social-media">',
359 'content' => $html_social,
360 'wrapper_end' => '</ul>',
361 ]
362 );
363
364 $clipboard = [
365 'wrapper' => '<div class="clipboard-post">',
366 'input' => sprintf(
367 '<input class="clipboard-value" type="text" value="%s">',
368 $courseModel->get_permalink()
369 ),
370 'button' => sprintf(
371 '<button class="btn-clipboard" data-copied="%s">%s<span class="tooltip">%s</span></button>',
372 esc_html__( 'Copied!', 'learnpress' ),
373 esc_html__( 'Copy', 'learnpress' ),
374 esc_html__( 'Copy to Clipboard', 'learnpress' )
375 ),
376 'wrapper_end' => '</div>',
377 ];
378
379 $section = apply_filters(
380 'learn-press/single-course/social-share/sections',
381 [
382 'wrapper' => '<div class="social-swapper social-share-toggle">',
383 'toggle' => '<div class="share-toggle-icon">',
384 'toggle_icon' => sprintf(
385 '<i class="lp-icon-share-alt"></i>
386 <label class="share-label">%s</label>',
387 esc_html__( 'Share', 'learnpress' )
388 ),
389 'toggle_end' => '</div>',
390 'wrapper_content' => '<div class="wrapper-content-widget">',
391 'wrapper_content_inner' => '<div class="content-widget-social-share">',
392 'clipboard' => Template::combine_components( $clipboard ),
393 'social' => Template::combine_components( $social_media ),
394 'wrapper_content_inner_end' => '</div>',
395 'wrapper_content_end' => '</div>',
396 'wrapper_end' => '</div>',
397 ],
398 $courseModel,
399 $data
400 );
401
402 return Template::combine_components( $section );
403 }
404
405 /**
406 * Get html instructor info
407 *
408 * @param CourseModel $course
409 * @param UserModel|false $user
410 *
411 * @return string
412 * @since 4.2.8.3
413 * @version 1.0.0
414 */
415 public function html_instructor_info( CourseModel $course, $user ): string {
416 $html_instructor = '';
417 $singleInstructorTemplate = SingleInstructorTemplate::instance();
418 $author = $course->get_author_model();
419
420 if ( ! $author ) {
421 return $html_instructor;
422 }
423
424 $html_instructor_image = sprintf(
425 '<a href="%s" title="%s">%s</a>',
426 $author->get_url_instructor(),
427 $author->get_display_name(),
428 $singleInstructorTemplate->html_avatar( $author )
429 );
430 $section_instructor_meta = [
431 'wrapper' => '<div class="lp-instructor-meta">',
432 'count_students' => sprintf(
433 '<div class="instructor-item-meta">%s</div>',
434 $singleInstructorTemplate->html_count_students( $author )
435 ),
436 'count_courses' => sprintf(
437 '<div class="instructor-item-meta">%s</div>',
438 $singleInstructorTemplate->html_count_courses( $author )
439 ),
440 'wrapper_end' => '</div>',
441 ];
442 $section_instructor_right = apply_filters(
443 'learn-press/single-course/modern/section-instructor/right',
444 [
445 'wrapper' => '<div class="lp-section-instructor">',
446 'name' => sprintf(
447 '<a href="%s">%s</a>',
448 $author->get_url_instructor(),
449 $singleInstructorTemplate->html_display_name( $author )
450 ),
451 'meta' => Template::combine_components( $section_instructor_meta ),
452 'description' => $singleInstructorTemplate->html_description( $author ),
453 'social' => $singleInstructorTemplate->html_social( $author ),
454 'wrapper_end' => '</div>',
455 ],
456 $course,
457 $user
458 );
459 $section_instructor = apply_filters(
460 'learn-press/single-course/modern/section-instructor',
461 [
462 'wrapper' => '<div class="lp-section-instructor">',
463 'header' => sprintf(
464 '<h3 class="section-title">%s</h3>',
465 esc_html__( 'Instructor', 'learnpress' )
466 ),
467 'wrapper_info' => '<div class="lp-instructor-info">',
468 'image' => $html_instructor_image,
469 'instructor_right' => Template::combine_components( $section_instructor_right ),
470 'wrapper_info_end' => '</div>',
471 'wrapper_end' => '</div>',
472 ],
473 $course,
474 $user
475 );
476
477 if ( ! has_filter( 'learn-press/single-course/modern/section-instructor' ) ) {
478 // Do not use this hook, this hook only for handle hook without update from Addon, when handle on Addon, will remove this hook
479 $section_instructor = apply_filters(
480 'learn-press/single-course/offline/section-instructor',
481 $section_instructor,
482 $course,
483 $user
484 );
485 }
486
487 return Template::combine_components( $section_instructor );
488 }
489
490 /**
491 * Get html course info learning
492 *
493 * @param CourseModel $course
494 * @param UserModel|false $user
495 *
496 * @return string
497 * @since 4.2.8.3
498 * @version 1.0.2
499 */
500 public function html_info_learning( CourseModel $course, $user = false ): string {
501 $html_info_learning = '';
502 $user_id = 0;
503 if ( $user instanceof UserModel ) {
504 $user_id = $user->get_id();
505 } else {
506 return $html_info_learning;
507 }
508
509 $userCourseModel = UserCourseModel::find( $user_id, $course->get_id(), true );
510 if ( $userCourseModel instanceof UserCourseModel
511 && $userCourseModel->get_status() !== UserItemModel::STATUS_CANCEL
512 && $userCourseModel->get_status() !== UserCourseModel::STATUS_PURCHASED ) {
513 $userCourseTemplate = UserCourseTemplate::instance();
514 $html_end_date = '';
515 $html_graduation = '';
516 $html_will_end_date = '';
517
518 if ( $userCourseModel->has_finished() ) {
519 $html_end_date = sprintf(
520 '<div class="end-date">%s: %s</div>',
521 esc_html__( 'End date', 'learnpress' ),
522 $userCourseTemplate->html_end_date_time( $userCourseModel, false )
523 );
524 $html_graduation = $userCourseTemplate->html_graduation( $userCourseModel );
525 } else {
526 $started_date = $userCourseModel->get_start_time();
527 $duration = $course->get_duration();
528 $will_end_date = new LP_Datetime( strtotime( "+ $duration", strtotime( $started_date ) ) );
529 $will_end_date = $will_end_date->format( LP_Datetime::I18N_FORMAT );
530 $html_will_end_date = sprintf(
531 '<div class="will-end-date">%s: %s</div>',
532 esc_html__( 'Will end date', 'learnpress' ),
533 $will_end_date
534 );
535 }
536
537 $section_info_learning = apply_filters(
538 'learn-press/single-course/modern/section-info-learning',
539 [
540 'wrapper' => '<div class="info-learning">',
541 'message_lock' => $userCourseTemplate->html_message_lock( $userCourseModel ),
542 'graduation' => $html_graduation,
543 'progress' => $userCourseTemplate->html_progress( $userCourseModel ),
544 'start_date' => sprintf(
545 '<div class="start-date">%s: %s</div>',
546 esc_html__( 'Start date', 'learnpress' ),
547 $userCourseTemplate->html_start_date_time( $userCourseModel, false )
548 ),
549 'will_end_date' => $html_will_end_date,
550 'end_date' => $html_end_date,
551 'count_items_completed' => $userCourseTemplate->html_count_items_completed( $userCourseModel ),
552 'wrapper_end' => '</div>',
553 ],
554 $course,
555 $user
556 );
557
558 $html_info_learning = Template::combine_components( $section_info_learning );
559 }
560
561 return $html_info_learning;
562 }
563
564 /**
565 * Get html button
566 *
567 * @param CourseModel $course
568 * @param UserModel|false $user
569 *
570 * @return string
571 * @since 4.2.8.3
572 * @version 1.0.1
573 */
574 public function html_buttons( CourseModel $course, $user = false ): string {
575 $user_id = 0;
576 if ( $user instanceof UserModel ) {
577 $user_id = $user->get_id();
578 }
579
580 $userCourseModel = UserCourseModel::find( $user_id, $course->get_id(), true );
581 $btn_continue_and_finish = [];
582 if ( $userCourseModel instanceof UserCourseModel ) {
583 $userCourseTemplate = UserCourseTemplate::instance();
584 $btn_continue_and_finish = [
585 'btn_continue' => $userCourseTemplate->html_btn_continue( $userCourseModel ),
586 'btn_finish' => $userCourseTemplate->html_btn_finish( $userCourseModel ),
587 'btn_retake' => $userCourseTemplate->html_btn_retake( $userCourseModel ),
588 ];
589 }
590
591 $section_buttons = apply_filters(
592 'learn-press/single-course/modern/section-right/buttons',
593 [
594 'wrapper' => '<div class="course-buttons">',
595 'btn_contact' => SingleCourseTemplate::instance()->html_btn_external( $course, $user ),
596 'btn_buy' => SingleCourseTemplate::instance()->html_btn_purchase_course( $course, $user ),
597 'btn_enroll' => SingleCourseTemplate::instance()->html_btn_enroll_course( $course, $user ),
598 'btn_learning' => Template::combine_components( $btn_continue_and_finish ),
599 'wrapper_end' => '</div>',
600 ],
601 $course,
602 $user
603 );
604
605 return Template::combine_components( $section_buttons );
606 }
607 }
608