PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.10
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.10
4.4.10 4.4.9.1 4.4.9 4.4.8 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 All 142 releases
learnpress / inc / TemplateHooks / CourseBuilder / Lesson / BuilderListLessonsTemplate.php

BuilderListLessonsTemplate.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.10, at inc/TemplateHooks/CourseBuilder/Lesson/BuilderListLessonsTemplate.php

409 lines 13.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Template hooks Tab Course in Course Builder.
4 *
5 * @since 4.3.0
6 * @version 1.0.0
7 */
8
9 namespace LearnPress\TemplateHooks\CourseBuilder\Lesson;
10
11 use LearnPress\CourseBuilder\CourseBuilder;
12 use LearnPress\Helpers\Response;
13 use LearnPress\Helpers\Singleton;
14 use LearnPress\Helpers\Template;
15 use LearnPress\Models\LessonPostModel;
16 use LearnPress\Models\PostModel;
17 use LearnPress\Models\UserModel;
18 use LearnPress\TemplateHooks\CourseBuilder\BuilderPopupTemplate;
19 use LearnPress\TemplateHooks\CourseBuilder\Course\BuilderCourseTemplate;
20 use LearnPress\TemplateHooks\CourseBuilder\CourseBuilderTemplate;
21 use LearnPress\TemplateHooks\TemplateAJAX;
22 use LearnPress\TemplateHooks\Table\TableListTemplate;
23 use LP_WP_Filesystem;
24 use Throwable;
25 use WP_Query;
26
27 class BuilderListLessonsTemplate {
28 use Singleton;
29
30 public function init() {
31 add_action( 'learn-press/course-builder/list-lessons/layout', [ $this, 'layout' ] );
32 }
33
34 public function layout( array $data = [] ) {
35 $list_lesson = $this->tab_list_lessons();
36 $popup_template = sprintf(
37 '<script type="text/template" id="lp-tmpl-builder-popup-lesson-list"><div class="lp-builder-popup-overlay"></div><div class="lp-builder-popup lp-builder-popup--loading">%s</div></script>',
38 TemplateAJAX::load_content_via_ajax(
39 [
40 'id_url' => 'builder-popup-lesson-list',
41 'lesson_id' => 0,
42 'html_no_load_ajax_first' => sprintf(
43 '<div class="lp-builder-popup__loader"><div class="lp-loading-circle"></div><span>%s</span></div>',
44 esc_html__( 'Loading...', 'learnpress' )
45 ),
46 ],
47 [
48 'class' => BuilderPopupTemplate::class,
49 'method' => 'render_lesson_popup',
50 ]
51 )
52 );
53
54 $tab = [
55 'wrapper' => '<div class="cb-tab-lesson">',
56 'header' => $this->html_header(),
57 'filter_bar' => $this->html_filter_bar(),
58 'lessons' => $list_lesson,
59 'popup_template' => $popup_template,
60 'wrapper_end' => '</div>',
61 ];
62
63 echo Template::combine_components( $tab );
64 }
65
66 public function html_header(): string {
67 $section = [
68 'wrapper' => '<div class="cb-tab-header">',
69 'title' => sprintf( '<h2 class="lp-cb-tab__title">%s</h2>', __( 'Lessons', 'learnpress' ) ),
70 'actions' => sprintf(
71 '<div class="cb-tab-header-actions" style="display:flex;align-items:center;gap:8px;">%s</div>',
72 CourseBuilderTemplate::instance()->html_btn_add_new()
73 ),
74 'wrapper_end' => '</div>',
75 ];
76
77 return Template::combine_components( $section );
78 }
79
80 public function html_filter_bar(): string {
81 $section = [
82 'wrapper_action' => '<div class="cb-tab-lesson__action">',
83 'search_lesson' => $this->html_search(),
84 'wrapper_action_end' => '</div>',
85 ];
86
87 return Template::combine_components( $section );
88 }
89
90 public function html_search() {
91 $args = lp_archive_skeleton_get_args();
92 $link_tab = CourseBuilder::get_tab_link( 'lessons' );
93
94 $search = [
95 'wrapper' => sprintf( '<form class="cb-search-form" method="get" action="%s">', $link_tab ),
96 'search_lesson' => '<button class="lp-button cb-search-btn" type="submit"> <i class="lp-icon-search"> </i></button>',
97 'input' => sprintf( '<input class="cb-input-search-lesson" type="search" placeholder="%s" name="c_search" value="%s">', __( 'Search', 'learnpress' ), esc_attr( $args['c_search'] ?? '' ) ),
98 'wrapper_end' => '</form>',
99 ];
100
101 return Template::combine_components( $search );
102 }
103
104 public function tab_list_lessons(): string {
105 $content = '';
106
107 try {
108 // Query lessons of user
109 $param = lp_archive_skeleton_get_args();
110 $param['id_url'] = 'tab-list-lessons';
111
112 $query_args = array(
113 'post_type' => LP_LESSON_CPT,
114 'post_status' => array( 'publish', 'private', 'draft', 'pending', 'trash' ),
115 'posts_per_page' => 12,
116 'paged' => $GLOBALS['wp_query']->get( 'paged', 1 ) ? $GLOBALS['wp_query']->get( 'paged', 1 ) : 1,
117 's' => ! empty( $param['c_search'] ) ? sanitize_text_field( $param['c_search'] ) : '',
118
119 );
120
121 $user_id = get_current_user_id();
122 $userModel = UserModel::find( $user_id, true );
123 if ( ! $userModel instanceof UserModel ) {
124 return '';
125 }
126
127 if ( ! current_user_can( ADMIN_ROLE ) ) {
128 $query_args['author'] = $user_id;
129 }
130
131 $query = new WP_Query();
132 $result = $query->query( $query_args );
133 $total_lessons = $query->found_posts ?? 0;
134
135 if ( $total_lessons < 1 ) {
136 unset( $query_args['paged'] );
137 $count_query = new WP_Query();
138 $count_query->query( $query_args );
139 $total_lessons = $count_query->found_posts;
140 }
141
142 $lessons = array();
143
144 if ( $query->have_posts() ) {
145 while ( $query->have_posts() ) {
146 $query->the_post();
147
148 $lesson_model = LessonPostModel::find( get_the_ID(), true );
149 $lessons[] = $lesson_model;
150 }
151 }
152 wp_reset_postdata();
153
154 $html_lessons = $this->list_lessons( $lessons );
155
156 $total_pages = \LP_Database::get_total_pages( $query_args['posts_per_page'], $total_lessons );
157 $link_tab = CourseBuilder::get_tab_link( 'lessons' );
158 $data_pagination = [
159 'paged' => max( 1, $query_args['paged'] ?? 1 ),
160 'total_pages' => $total_pages,
161 'base' => trailingslashit( $link_tab ) . 'page/%#%',
162 'format' => '',
163 ];
164
165 $pagination = Template::instance()->html_pagination( $data_pagination );
166
167 $sections = apply_filters(
168 'learn-press/course-builder/lessons/sections',
169 [
170 'wrapper' => '<div class="courses-builder__lesson-tab learn-press-lessons">',
171 'lessons' => $html_lessons,
172 'wrapper_end' => '</div>',
173 'pagination' => $pagination,
174 ],
175 $lessons,
176 $userModel
177 );
178
179 $content = Template::combine_components( $sections );
180 } catch ( Throwable $e ) {
181 error_log( __METHOD__ . ': ' . $e->getMessage() );
182 }
183
184 return $content;
185 }
186
187 /**
188 * Display list lessons.
189 *
190 * @param $lessons
191 *
192 * @return string
193 */
194 public function list_lessons( $lessons ): string {
195 $content = '';
196
197 try {
198 $html_list_lesson = '';
199
200 if ( empty( $lessons ) ) {
201 return Template::print_message(
202 __( 'No lessons found', 'learnpress' ),
203 'info',
204 false
205 );
206 }
207
208 foreach ( $lessons as $lesson_model ) {
209 $html_list_lesson .= self::render_lesson( $lesson_model );
210 }
211
212 $table_args = [
213 'class_table' => 'cb-list-table cb-list-lesson',
214 'header' => [
215 'title' => [
216 'class' => 'cb-col-title',
217 'title' => __( 'Lesson Title', 'learnpress' ),
218 ],
219 'courses' => [
220 'class' => 'cb-col-assigned',
221 'title' => __( 'Courses', 'learnpress' ),
222 ],
223 'date' => [
224 'class' => 'cb-col-date',
225 'title' => __( 'Create Date', 'learnpress' ),
226 ],
227 'status' => [
228 'class' => 'cb-col-status',
229 'title' => __( 'Status', 'learnpress' ),
230 ],
231 'preview' => [
232 'class' => 'cb-col-preview',
233 'title' => __( 'Preview', 'learnpress' ),
234 ],
235 'actions' => [
236 'class' => 'cb-col-actions',
237 'title' => __( 'Actions', 'learnpress' ),
238 ],
239 ],
240 'body' => [
241 'rows_html' => $html_list_lesson,
242 ],
243 ];
244
245 $content = TableListTemplate::instance()->html_table( $table_args );
246 } catch ( Throwable $e ) {
247 $content = Template::print_message( $e->getMessage(), Response::STATUS_ERROR );
248 }
249
250 return $content;
251 }
252
253 /**
254 * Render lesson in course builder
255 *
256 * @param $lesson
257 * @param array $settings
258 *
259 * @return string
260 * @since 4.3.0
261 * @version 1.0.0
262 */
263 public static function render_lesson( LessonPostModel $lesson_model, array $settings = [] ): string {
264 $author = get_user_by( 'ID', $lesson_model->post_author );
265 $author_name = $author && isset( $author->display_name ) ? $author->display_name : '--';
266
267 $lesson = array(
268 'id' => $lesson_model->get_id(),
269 'title' => $lesson_model->post_title,
270 'status' => $lesson_model->post_status,
271 'courses' => BuilderEditLessonTemplate::instance()->get_assigned( $lesson_model->get_id() ),
272 'author' => $author_name,
273 'preview' => get_post_meta( $lesson_model->get_id(), '_lp_preview', true ),
274 'date_modified' => lp_jwt_prepare_date_response( $lesson_model->post_date_gmt ),
275 );
276
277 try {
278 $html_courses = '';
279 $assigned = '--';
280 if ( ! empty( $lesson['courses'] ) ) {
281 $courses = is_array( $lesson['courses'] ) && isset( $lesson['courses']['id'] )
282 ? array( $lesson['courses'] )
283 : $lesson['courses'];
284
285 $course_htmls = array();
286 foreach ( $courses as $course ) {
287 $course_id = $course['id'] ?? 0;
288 $course_title = $course['title'] ?? '';
289
290 if ( $course_id && $course_title ) {
291 $course_link = BuilderCourseTemplate::instance()->get_link_edit( $course_id );
292 $course_htmls[] = sprintf(
293 '<a href="%s" target="_blank">%s</a>',
294 esc_url( $course_link ),
295 esc_html( $course_title )
296 );
297 }
298 }
299
300 if ( ! empty( $course_htmls ) ) {
301 $assigned = implode( ', ', $course_htmls );
302 }
303 }
304
305 $html_courses = sprintf(
306 '<div class="lesson-assigned-courses"><span class="label">%s:</span> %s</div>',
307 __( 'Assigned', 'learnpress' ),
308 $assigned
309 );
310
311 $status = $lesson_model->post_status ?? '';
312
313 $html_content = apply_filters(
314 'learn-press/course-builder/list-lessons/item/section/bottom',
315 [
316 'title' => sprintf(
317 '<h3 class="wap-lesson-title"><button data-popup-lesson="%1$s" data-popup-type="lesson" data-popup-id="%1$s" data-template="#lp-tmpl-builder-popup-lesson-list">%2$s</button></h3>',
318 $lesson_model->get_id(),
319 $lesson['title']
320 ),
321 'courses' => $html_courses,
322 'date' => sprintf( '<span class="lesson__date">%s</span>', ! empty( $lesson['date_modified'] ) ? date_i18n( 'm/d/Y', strtotime( $lesson['date_modified'] ) ) : '--' ),
323 'lesson_status' => ! empty( $status ) ? sprintf( '<span class="lesson-status %1$s">%1$s</span>', $status ) : '<span></span>',
324 'preview' => sprintf(
325 '<span class="lesson__preview lp-button lp-btn-set-preview-item" data-id="%s" title="%s"><a class="%s"></a></span>',
326 $lesson['id'],
327 __( 'Toggle preview', 'learnpress' ),
328 $lesson['preview'] === 'yes' ? 'lp-icon-eye' : 'lp-icon-eye-slash'
329 ),
330 ],
331 $lesson,
332 $settings
333 );
334
335 $edit_icon = LP_WP_Filesystem::get_icon_svg( 'ico-cb-edit.svg' );
336 $more_actions_icon = LP_WP_Filesystem::get_icon_svg( 'ico-cb-more.svg' );
337
338 $html_action = apply_filters(
339 'learn-press/course-builder/list-lessons/item/action',
340 [
341 'wrapper' => '<div class="lesson-action">',
342 'edit' => $status !== PostModel::STATUS_TRASH ? sprintf(
343 '<div class="lesson-action-editor"><button class="lp-button btn-edit-lesson lesson-edit-permalink" data-popup-lesson="%1$s" data-popup-type="lesson" data-popup-id="%1$s" data-template="#lp-tmpl-builder-popup-lesson-list">%2$s %3$s</button></div>',
344 $lesson['id'],
345 $edit_icon,
346 __( 'Edit', 'learnpress' )
347 ) : '',
348 'action_expanded_button' => sprintf(
349 '<button type="button" class="lp-button lesson-action-expanded">%s</button>',
350 $more_actions_icon
351 ),
352 'action_expanded_wrapper' => '<div style="display:none;" class="lesson-action-expanded__items">',
353 'action_expanded_duplicate' => sprintf( '<span class="lp-button lesson-action-expanded__duplicate" data-title="%s" data-content="%s">%s</span>', __( 'Are you sure?', 'learnpress' ), __( 'Are you sure you want to duplicate this lesson?', 'learnpress' ), __( 'Duplicate', 'learnpress' ) ),
354 'action_expanded_publish' => sprintf( '<span class="lp-button lesson-action-expanded__publish">%s</span>', __( 'Publish', 'learnpress' ) ),
355 'action_expanded_trash' => sprintf(
356 '<span class="lp-button lesson-action-expanded__trash"%s>%s</span>',
357 $status === 'trash' ? ' style="display:none"' : '',
358 __( 'Trash', 'learnpress' )
359 ),
360 'action_expanded_restore' => sprintf(
361 '<span class="lp-button lesson-action-expanded__restore"%s>%s</span>',
362 $status !== 'trash' ? ' style="display:none"' : '',
363 __( 'Restore', 'learnpress' )
364 ),
365 'action_expanded_delete' => sprintf( '<span class="lp-button lesson-action-expanded__delete" data-title="%s" data-content="%s">%s</span>', __( 'Are you sure?', 'learnpress' ), __( 'Are you sure you want to delete this lesson? This action cannot be undone.', 'learnpress' ), __( 'Delete', 'learnpress' ) ),
366 'action_expanded_wrapper_end' => '</div>',
367 'wrapper_end' => '</div>',
368 ],
369 $lesson,
370 $settings
371 );
372
373 $cell_classes = [
374 'courses' => 'assigned',
375 'lesson_status' => 'status',
376 ];
377 $html_cells = [];
378 foreach ( $html_content as $key => $html ) {
379 $cell_class = $cell_classes[ $key ] ?? $key;
380 $html_cells[ $key ] = sprintf(
381 '<td class="cb-col-%s">%s</td>',
382 esc_attr( sanitize_html_class( $cell_class ) ),
383 $html
384 );
385 }
386
387 $section = apply_filters(
388 'learn-press/course-builder/list-lessons/item-li',
389 [
390 'wrapper_li' => sprintf( '<tr class="lesson lesson-item" data-lesson-id="%s" data-status="%s">', $lesson['id'], $status ),
391 'wrapper_div' => '',
392 'lesson_info' => Template::combine_components( $html_cells ),
393 'lesson_action' => sprintf( '<td class="cb-col-actions">%s</td>', Template::combine_components( $html_action ) ),
394 'wrapper_div_end' => '',
395 'wrapper_li_end' => '</tr>',
396 ],
397 $lesson,
398 $settings
399 );
400
401 $html_item = Template::combine_components( $section );
402 } catch ( Throwable $e ) {
403 $html_item = $e->getMessage();
404 }
405
406 return $html_item;
407 }
408 }
409