PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.2
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.2
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 4.1.7.3.1 4.1.7.3.2 4.2.0 All 139 releases
learnpress / inc / TemplateHooks / CourseBuilder / Quiz / BuilderEditQuizTemplate.php

BuilderEditQuizTemplate.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.2, at inc/TemplateHooks/CourseBuilder/Quiz/BuilderEditQuizTemplate.php

610 lines 20.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Template hooks Course Builder.
4 *
5 * @since 4.3.0
6 * @version 1.0.0
7 */
8
9 namespace LearnPress\TemplateHooks\CourseBuilder\Quiz;
10
11 use Exception;
12 use LearnPress\CourseBuilder\CourseBuilderAccessPolicy;
13 use LearnPress\Models\UserModel;
14 use LearnPress\TemplateHooks\CourseBuilder\Course\BuilderCourseTemplate;
15 use LearnPress\CourseBuilder\CourseBuilder;
16 use LearnPress\Helpers\Singleton;
17 use LearnPress\Helpers\Template;
18 use LearnPress\Models\PostModel;
19 use LearnPress\Models\QuizPostModel;
20 use LearnPress\TemplateHooks\Admin\AdminEditQizTemplate;
21 use LearnPress\TemplateHooks\Admin\AdminTemplate;
22 use LearnPress\TemplateHooks\Course\AdminEditCurriculumTemplate;
23 use LearnPress\TemplateHooks\TemplateAJAX;
24 use LP_Settings;
25 use LP_WP_Filesystem;
26 use Throwable;
27 use WP_User;
28
29 class BuilderEditQuizTemplate {
30 use Singleton;
31
32 public function init() {
33 add_filter( 'lp/rest/ajax/allow_callback', [ $this, 'allow_callback' ] );
34 }
35
36 /**
37 * Display layout edit/create quiz.
38 *
39 * @param array $data [ 'userModel' => UserModel, 'item_id' => int|string ]
40 *
41 * @throws Exception
42 */
43 public function layout( array $data = [] ) {
44 try {
45 $userModel = $data['userModel'] ?? false;
46 if ( ! $userModel || ! $userModel->is_instructor() ) {
47 throw new Exception( __( 'You do not have permission to create or edit quizzes', 'learnpress' ) );
48 }
49
50 $item_id = $data['item_id'] ?? '';
51 if ( empty( $item_id ) ) {
52 throw new Exception( __( 'Invalid quiz ID', 'learnpress' ) );
53 }
54
55 /*if ( ! CourseBuilderAccessPolicy::can_access_tab_post( 'quizzes', $item_id ) ) {
56 throw new Exception( __( "Sorry, you don't have permission to access this content", 'learnpress' ) );
57 }*/
58
59 $is_create_new = $item_id === CourseBuilder::POST_NEW;
60 $quizModel = false;
61
62 if ( ! $is_create_new ) {
63 $quizModel = QuizPostModel::find( (int) $item_id, true );
64 if ( ! $quizModel ) {
65 throw new Exception( __( 'Quiz not found', 'learnpress' ) );
66 }
67
68 $quizModel->check_capabilities_update_item_course();
69
70 if ( $quizModel->post_status === PostModel::STATUS_TRASH ) {
71 throw new Exception(
72 __(
73 'You cannot edit this item because it is in the Trash. Please restore it and try again.',
74 'learnpress'
75 )
76 );
77 }
78 } else {
79 $quizModelNew = new QuizPostModel();
80 $quizModelNew->check_capabilities_create_item_course();
81 }
82
83 $data['quizModel'] = $quizModel;
84
85 $section = [
86 'wrap' => sprintf(
87 '<div class="lp-cb-content" data-post-id="%1$s">',
88 esc_attr( $item_id )
89 ),
90 'header' => $this->html_header( $data ),
91 'tabs' => $this->html_tabs( $data ),
92 'wrap_end' => '</div>',
93 ];
94
95 echo Template::combine_components( $section );
96
97 } catch ( Throwable $e ) {
98 Template::print_message( $e->getMessage(), 'error' );
99 }
100 }
101
102 public function html_header( array $data = [] ): string {
103 $userModel = $data['userModel'] ?? false;
104 if ( ! $userModel instanceof UserModel ) {
105 return '';
106 }
107
108 $quizModel = $data['quizModel'] ?? false;
109 $hide_instructor_access_admin_screen = LP_Settings::is_hide_instructor_access_admin_screen();
110 $more_actions_icon = LP_WP_Filesystem::get_icon_svg( 'ico-cb-more.svg' );
111 $title = $quizModel ? $quizModel->get_the_title() : __( 'Add New Quiz', 'learnpress' );
112 $status = $quizModel ? $quizModel->post_status : '';
113 $status_label = 'future' === $status ? __( 'scheduled', 'learnpress' ) : $status;
114 $main_action_status = in_array( $status, [ 'publish', 'draft', 'pending', 'future', 'private' ], true ) ? $status : 'publish';
115 $wp_user = new WP_User( $userModel );
116 $hide_wp_edit_link = $hide_instructor_access_admin_screen && user_can( $wp_user, UserModel::ROLE_INSTRUCTOR );
117
118 $section = [
119 'header_wrap' => '<div class="lp-cb-header">',
120 'header_left' => '<div class="lp-cb-header__left">',
121 'title' => sprintf(
122 '<h1 class="lp-cb-header__title">%s</h1>',
123 esc_html( $title )
124 ),
125 'status_badge' => $quizModel && $status ? sprintf(
126 '<span class="quiz-status %1$s">%2$s</span>',
127 esc_attr( $status ),
128 esc_html( $status_label )
129 ) : '',
130 'link_edit_on_wp' => $quizModel && ! $hide_wp_edit_link ? sprintf(
131 '<a href="%1$s" class="lp-cb-admin-link" target="_blank" title="%2$s"%3$s>
132 <span class="dashicons dashicons-wordpress"></span>
133 <span>%2$s</span>
134 </a>',
135 esc_url( admin_url( 'post.php?post=' . $quizModel->get_id() . '&action=edit' ) ),
136 esc_attr__( 'Edit with WordPress', 'learnpress' ),
137 'trash' === $status ? ' style="display:none"' : ''
138 ) : '',
139 'header_left_end' => '</div>',
140 'header_actions' => '<div class="lp-cb-header__actions">',
141 'dropdown_wrap' => '<div class="cb-header-actions-dropdown cb-header-actions-dropdown--single">',
142 'update_btn' => sprintf(
143 '<div class="cb-btn-update lp-button cb-btn-primary cb-btn-main-action"
144 data-status="%1$s"
145 data-title-update="%2$s"
146 data-title-publish="%3$s"
147 data-title-draft="%4$s">%5$s</div>',
148 esc_attr( $main_action_status ),
149 esc_attr__( 'Update', 'learnpress' ),
150 esc_attr__( 'Publish', 'learnpress' ),
151 esc_attr__( 'Save Draft', 'learnpress' ),
152 esc_html__( 'Update', 'learnpress' )
153 ),
154 'dropdown_wrap_end' => '</div>',
155 'expanded_actions' => $quizModel ? sprintf(
156 '<div class="cb-header-action-expanded">
157 <button type="button" class="lp-button course-action-expanded" aria-haspopup="true" aria-expanded="false" aria-label="%1$s">
158 %2$s
159 </button>
160 <div class="cb-header-action-expanded__items">
161 <div class="cb-header-action-expanded__duplicate lp-button cb-btn-duplicate-quiz"
162 data-title="%3$s"
163 data-content="%4$s">
164 <span class="dashicons dashicons-admin-page"></span>
165 %5$s
166 </div>
167 <div class="cb-header-action-expanded__trash lp-button cb-btn-trash">
168 <span class="dashicons dashicons-trash"></span>
169 %6$s
170 </div>
171 </div>
172 </div>',
173 esc_attr__( 'More actions', 'learnpress' ),
174 $more_actions_icon,
175 esc_attr__( 'Are you sure?', 'learnpress' ),
176 esc_attr__( 'Are you sure you want to duplicate this quiz?', 'learnpress' ),
177 esc_html__( 'Duplicate', 'learnpress' ),
178 esc_html__( 'Move to Trash', 'learnpress' )
179 ) : '',
180 'header_actions_end' => '</div>',
181 'header_end' => '</div>',
182 ];
183
184 return Template::combine_components( $section );
185 }
186
187 public function html_tabs( array $data = [] ): string {
188 $section_tab = [
189 'tabs_wrap' => '<div class="lp-cb-tabs">',
190 'tabs' => '',
191 'tabs_end' => '</div>',
192 ];
193
194 $section_content = [
195 'wrap' => '<div class="lp-cb-tab-content">',
196 'content' => '',
197 'wrap-end' => '</div>',
198 ];
199
200 $tabs = apply_filters(
201 'learn-press/course-builder/quizzes/edit/tabs',
202 [
203 'overview' => [
204 'title' => esc_html__( 'Overview', 'learnpress' ),
205 'html' => $this->html_tab_overview( $data ),
206 ],
207 'question' => [
208 'title' => esc_html__( 'Question', 'learnpress' ),
209 'html' => $this->html_tab_question( $data ),
210 ],
211 'settings' => [
212 'title' => esc_html__( 'Settings', 'learnpress' ),
213 'html' => $this->html_tab_settings( $data ),
214 ],
215 ],
216 $data
217 );
218
219 $tab_sections = [];
220 foreach ( $tabs as $key => $tab ) {
221 $tab_sections[ $key ] = $tab['slug'] ?? $key;
222 }
223
224 $tab_active = (string) reset( $tab_sections );
225 if ( isset( $_GET['tab'] ) ) {
226 $requested_tab = sanitize_key( wp_unslash( $_GET['tab'] ) );
227 if ( in_array( $requested_tab, $tab_sections, true ) ) {
228 $tab_active = $requested_tab;
229 }
230 }
231
232 foreach ( $tabs as $key => $tab ) {
233 $tab_section = $tab_sections[ $key ];
234 $is_active = $tab_section === $tab_active;
235
236 $section_tab['tabs'] .= sprintf(
237 '<a href="#" class="lp-cb-tabs__item %s" data-tab-section="%s">%s</a>',
238 $is_active ? 'is-active' : '',
239 esc_attr( $tab_section ),
240 esc_html( $tab['title'] ?? '' )
241 );
242
243 /**
244 * @uses html_tab_overview
245 * @uses html_tab_question
246 * @uses html_tab_settings
247 */
248 $section_content['content'] .= sprintf(
249 '<div class="lp-cb-tab-panel %s" data-section="%s">%s</div>',
250 $is_active ? '' : 'lp-hidden',
251 esc_attr( $tab_section ),
252 $tab['html'] ?? ''
253 );
254 }
255
256 return Template::combine_components(
257 [
258 'tabs' => Template::combine_components( $section_tab ),
259 'contents' => Template::combine_components( $section_content ),
260 ]
261 );
262 }
263
264 public function html_tab_overview( array $data = [] ): string {
265 wp_enqueue_script( 'lp-course-builder' );
266
267 $quiz_model = $data['quizModel'] ?? false;
268 $quiz_id = $data['item_id'] ?? ( $quiz_model ? $quiz_model->get_id() : CourseBuilder::POST_NEW );
269
270 if ( absint( $quiz_id ) && ! $quiz_model ) {
271 $quiz_model = QuizPostModel::find( absint( $quiz_id ), true );
272 if ( empty( $quiz_model ) ) {
273 return '';
274 }
275 }
276
277 $html_assigned = $this->assigned_course( $quiz_model );
278 $html_edit_title = $this->edit_title( $quiz_model );
279 $html_permalink = $this->edit_permalink( $quiz_model );
280 $html_publish = $this->edit_publish( $quiz_model );
281 $html_edit_desc = $this->edit_desc( $quiz_model );
282 $section = [
283 'wrapper' => sprintf( '<div class="cb-section__quiz-edit" data-quiz-id="%s">', $quiz_id ),
284 'content_wrapper' => '<div class="cb-item-edit-content">',
285 'left_column' => '<div class="cb-item-edit-column cb-item-edit-column--left">',
286 'edit_title' => $html_edit_title,
287 'assigned_course' => $html_assigned,
288 'edit_permalink' => $html_permalink,
289 'edit_publish' => $html_publish,
290 'left_column_end' => '</div>',
291 'right_column' => '<div class="cb-item-edit-column cb-item-edit-column--right">',
292 'edit_desc' => $html_edit_desc,
293 'right_column_end' => '</div>',
294 'content_wrapper_end' => '</div>',
295 'wrapper_end' => '</div>',
296 ];
297
298 return Template::combine_components( $section );
299 }
300
301 public function html_tab_question( array $data = [] ): string {
302 wp_enqueue_style( 'lp-edit-quiz' );
303
304 $quiz_model = $data['quizModel'] ?? false;
305 $quiz_id = $data['item_id'] ?? ( $quiz_model ? $quiz_model->get_id() : CourseBuilder::POST_NEW );
306
307 if ( $quiz_id === CourseBuilder::POST_NEW || absint( $quiz_id ) <= 0 ) {
308 return sprintf( '<span class="lp-message lp-message--info">%s</span>', __( 'Please save Quiz before add question', 'learnpress' ) );
309 }
310
311 if ( ! $quiz_model ) {
312 $quiz_model = QuizPostModel::find( absint( $quiz_id ), true );
313 if ( empty( $quiz_model ) ) {
314 return '';
315 }
316 }
317
318 $args = [
319 'id_url' => 'edit-quiz',
320 'quiz_id' => $quiz_model->ID,
321 ];
322 $call_back = [
323 'class' => AdminEditQizTemplate::class,
324 'method' => 'render_edit_quiz',
325 ];
326
327 return TemplateAJAX::load_content_via_ajax( $args, $call_back );
328 }
329
330 public function html_tab_settings( array $data = [] ): string {
331 wp_enqueue_script( 'lp-cb-edit-curriculum' );
332 wp_enqueue_script( 'lp-tom-select' );
333 wp_enqueue_style( 'lp-cb-edit-curriculum' );
334 wp_enqueue_script( 'lp-cb-learnpress' );
335
336 $quiz_model = $data['quizModel'] ?? false;
337 $quiz_id = $data['item_id'] ?? ( $quiz_model ? $quiz_model->get_id() : CourseBuilder::POST_NEW );
338
339 if ( $quiz_id === CourseBuilder::POST_NEW || absint( $quiz_id ) <= 0 ) {
340 return sprintf( '<span class="lp-message lp-message--info">%s</span>', __( 'Please save Quiz before setting quiz', 'learnpress' ) );
341 }
342
343 if ( ! $quiz_model ) {
344 $quiz_model = QuizPostModel::find( absint( $quiz_id ), true );
345 if ( empty( $quiz_model ) ) {
346 return '';
347 }
348 }
349
350 if ( ! class_exists( 'LP_Meta_Box_Quiz' ) ) {
351 require_once LP_PLUGIN_PATH . 'inc/admin/views/meta-boxes/quiz/settings.php';
352 }
353
354 $metabox = new \LP_Meta_Box_Quiz();
355 ob_start();
356 $metabox->output( $quiz_model );
357 $settings = ob_get_clean();
358
359 $output = [
360 'wrapper' => sprintf( '<div class="cb-section__quiz-edit" data-quiz-id="%s">', $quiz_id ),
361 'form_setting' => '<form name="lp-form-setting-quiz" class="lp-form-setting-quiz" method="post" enctype="multipart/form-data">',
362 'settings' => $settings,
363 'form_setting_end' => '</form>',
364 'wrapper_end' => '</div>',
365 ];
366
367 return Template::combine_components( $output );
368 }
369
370 /**
371 * Allow callback for AJAX.
372 * @use self::render_edit_course_curriculum
373 * @use self::render_html
374 *
375 * @param array $callbacks
376 *
377 * @return array
378 */
379 public function allow_callback( array $callbacks ): array {
380 $callbacks[] = AdminEditCurriculumTemplate::class . ':render_edit_course_curriculum';
381
382 return $callbacks;
383 }
384
385 public function assigned_course( $quiz_model ) {
386 $assign_course = ! empty( $quiz_model ) ? $this->get_assigned( $quiz_model->get_id() ) : '';
387 $html_courses = '';
388 $assigned = sprintf( '<span class="quiz-not-assigned">%s</span>', __( 'Not assigned yet', 'learnpress' ) );
389 if ( ! empty( $assign_course ) ) {
390 $courses = is_array( $assign_course ) && isset( $assign_course['id'] )
391 ? array( $assign_course )
392 : $assign_course;
393
394 $course_htmls = array();
395 foreach ( $courses as $course ) {
396 $course_id = $course['id'] ?? 0;
397 $course_title = $course['title'] ?? '';
398
399 if ( $course_id && $course_title ) {
400 $course_link = BuilderCourseTemplate::instance()->get_link_edit( $course_id );
401 $course_htmls[] = sprintf(
402 '<a href="%s" target="_blank">%s</a>',
403 esc_url( $course_link ),
404 esc_html( $course_title )
405 );
406 }
407 }
408
409 if ( ! empty( $course_htmls ) ) {
410 $assigned = implode( ', ', $course_htmls );
411 }
412 }
413
414 $html_courses = sprintf(
415 '<div class="cb-item-edit-assigned quiz-assigned-courses"><span class="label">%s</span> %s</div>',
416 __( 'Assigned', 'learnpress' ),
417 $assigned
418 );
419
420 return $html_courses;
421 }
422
423
424 public function edit_title( $quiz_model ) {
425 $title = ! empty( $quiz_model ) ? $quiz_model->get_the_title() : '';
426 $edit = [
427 'wrapper' => '<div class="cb-quiz-edit-title">',
428 'label' => sprintf( '<label for="title" class="cb-quiz-edit-title__label">%s</label>', __( 'Title', 'learnpress' ) ),
429 'input' => sprintf( '<input type="text" name="quiz_title" size="30" value="%s" id="title" class="cb-quiz-edit-title__input">', esc_attr( $title ) ),
430 'wrapper_end' => '</div>',
431 ];
432
433 return Template::combine_components( $edit );
434 }
435
436 public function edit_desc( $quiz_model ) {
437 $desc = ! empty( $quiz_model ) ? $quiz_model->get_the_content() : '';
438 $editor_id = 'quiz_description_editor';
439 $editor_settings = array(
440 'textarea_name' => 'quiz_description',
441 'textarea_rows' => 10,
442 'teeny' => false,
443 'media_buttons' => true,
444 'tinymce' => array(
445 'content_style' => "body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif; font-size: 14px; line-height: 1.6; color: #1e1e1e; }",
446 'toolbar1' => 'formatselect,bold,italic,underline,bullist,numlist,blockquote,alignleft,aligncenter,alignright,link,unlink,spellchecker,wp_adv',
447 'toolbar2' => 'strikethrough,hr,forecolor,pastetext,removeformat,charmap,outdent,indent,undo,redo,wp_help',
448 ),
449 'quicktags' => true,
450 );
451
452 $edit = [
453 'wrapper' => '<div class="cb-quiz-edit-desc">',
454 'label' => sprintf( '<label for="quiz_description" class="cb-quiz-edit-desc__label">%s</label>', __( 'Description', 'learnpress' ) ),
455 'edit' => AdminTemplate::editor_tinymce(
456 $desc,
457 $editor_id,
458 $editor_settings
459 ),
460 'wrapper_end' => '</div>',
461 ];
462
463 return Template::combine_components( $edit );
464 }
465
466 public function edit_permalink( $quiz_model ): string {
467 $post_id = ! empty( $quiz_model ) ? absint( $quiz_model->get_id() ) : 0;
468 $post = $post_id ? get_post( $post_id ) : null;
469 $post_name = $post && ! empty( $post->post_name ) ? (string) $post->post_name : '';
470 $full_url = '';
471 $base_url = '';
472 $display_classes = 'cb-permalink-display';
473 $placeholder_class = 'cb-item-edit-permalink__placeholder';
474 $notice_no_link = __(
475 'Permalink is only available if the item is already assigned to a course.',
476 'learnpress'
477 );
478 $placeholder_text = __( 'Permalink will be available after saving.', 'learnpress' );
479 $show_unavailable = true;
480
481 if ( $post_id ) {
482 $current_status = $post && ! empty( $post->post_status ) ? sanitize_key( $post->post_status ) : '';
483 if ( 'draft' !== $current_status ) {
484 $course_id_of_item = \LP_Course_DB::getInstance()->get_course_by_item_id( $post_id );
485 if ( $course_id_of_item ) {
486 $course = learn_press_get_course( $course_id_of_item );
487 if ( $course ) {
488 $full_url = urldecode( $course->get_item_link( $post_id ) );
489 $base_url = $full_url;
490 $show_unavailable = false;
491
492 if ( ! empty( $post_name ) ) {
493 $base_url = trailingslashit( preg_replace( '/' . preg_quote( $post_name, '/' ) . '\/?$/', '', $full_url ) );
494 }
495 }
496 }
497 }
498 }
499
500 if ( $show_unavailable && $post_id ) {
501 $placeholder_text = $notice_no_link;
502 }
503
504 if ( $show_unavailable ) {
505 $display_classes .= ' lp-hidden';
506 } else {
507 $placeholder_class .= ' lp-hidden';
508 }
509
510 $state_a = sprintf(
511 '<span class="cb-item-edit-permalink__label">%s</span>
512 <div class="%s">
513 <a href="%s" target="_blank" class="cb-permalink-url">%s</a>
514 <button type="button" class="cb-permalink-edit-btn" title="%s">
515 <span class="dashicons dashicons-edit"></span>
516 </button>
517 </div>',
518 __( 'Permalink', 'learnpress' ),
519 esc_attr( $display_classes ),
520 esc_url( $full_url ),
521 esc_html( $full_url ),
522 __( 'Edit', 'learnpress' )
523 );
524
525 $state_b = sprintf(
526 '<div class="cb-permalink-editor lp-hidden">
527 <span class="cb-permalink-prefix">%s</span>
528 <div class="cb-permalink-input-row">
529 <input type="text" name="quiz_permalink" id="quiz_permalink" value="%s" class="cb-permalink-slug-input" placeholder="%s">
530 <div class="cb-permalink-actions">
531 <button type="button" class="cb-permalink-ok-btn">%s</button>
532 <button type="button" class="cb-permalink-cancel-btn">%s</button>
533 </div>
534 </div>
535 </div>',
536 esc_html( $base_url ),
537 esc_attr( $post_name ),
538 esc_attr__( 'your-slug', 'learnpress' ),
539 __( 'OK', 'learnpress' ),
540 __( 'Cancel', 'learnpress' )
541 );
542
543 $hidden_base = sprintf(
544 '<input type="hidden" id="cb-permalink-base-url" value="%s">',
545 esc_attr( $base_url )
546 );
547
548 $placeholder = sprintf(
549 '<span class="%s">%s</span>',
550 esc_attr( $placeholder_class ),
551 esc_html( $placeholder_text )
552 );
553
554 $view = [
555 'wrapper' => '<div class="cb-item-edit-permalink cb-course-edit-permalink">',
556 'state_a' => $state_a,
557 'state_b' => $state_b,
558 'hidden_base' => $hidden_base,
559 'placeholder' => $placeholder,
560 'wrapper_end' => '</div>',
561 ];
562
563 return Template::combine_components( $view );
564 }
565
566 public function edit_publish( $quiz_model ): string {
567 $post_id = ! empty( $quiz_model ) ? absint( $quiz_model->get_id() ) : 0;
568 $post = $post_id ? get_post( $post_id ) : null;
569 $current_status = $post && ! empty( $post->post_status ) ? sanitize_key( $post->post_status ) : 'draft';
570 $status_value = 'draft' === $current_status ? 'draft' : 'publish';
571
572 $status_options_html = sprintf(
573 '<option value="publish" %1$s>%2$s</option><option value="draft" %3$s>%4$s</option>',
574 selected( $status_value, 'publish', false ),
575 esc_html__( 'Published', 'learnpress' ),
576 selected( $status_value, 'draft', false ),
577 esc_html__( 'Draft', 'learnpress' )
578 );
579
580 $publish = [
581 'wrapper' => '<div class="cb-item-edit-publish">',
582 'title' => sprintf( '<h3 class="cb-item-edit-publish__title">%s</h3>', esc_html__( 'Publish', 'learnpress' ) ),
583 'status_row' => sprintf(
584 '<div class="cb-item-edit-publish__row">
585 <label for="cb-quiz-publish-status" class="cb-item-edit-publish__label">%1$s</label>
586 <select id="cb-quiz-publish-status" name="cb_quiz_publish_status" class="cb-item-edit-publish__control">%2$s</select>
587 </div>',
588 esc_html__( 'Status', 'learnpress' ),
589 $status_options_html
590 ),
591 'wrapper_end' => '</div>',
592 ];
593
594 return Template::combine_components( $publish );
595 }
596
597 public function get_assigned( $id ) {
598 $courses = learn_press_get_item_courses( $id );
599
600 if ( empty( $courses ) ) {
601 return array();
602 }
603
604 return array(
605 'id' => $courses[0]->ID,
606 'title' => $courses[0]->post_title ?? '',
607 );
608 }
609 }
610