PluginProbe ʕ •ᴥ•ʔ
OttoKit: All-in-One Automation Platform / 1.1.36
OttoKit: All-in-One Automation Platform v1.1.36
1.1.37 1.1.36 1.1.35 1.1.34 1.1.33 1.1.32 1.1.31 1.1.30 1.1.29 1.1.28 1.1.27 1.1.9 trunk 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.17 1.0.18 1.0.19 1.0.20 1.0.21 1.0.22 1.0.23 1.0.24 1.0.25 1.0.26 1.0.27 1.0.28 1.0.29 1.0.30 1.0.31 1.0.32 1.0.33 1.0.34 1.0.35 1.0.36 1.0.37 1.0.38 1.0.39 1.0.40 1.0.41 1.0.42 1.0.43 1.0.44 1.0.45 1.0.46 1.0.47 1.0.48 1.0.49 1.0.50 1.0.51 1.0.52 1.0.53 1.0.54 1.0.55 1.0.56 1.0.57 1.0.58 1.0.59 1.0.60 1.0.61 1.0.62 1.0.63 1.0.64 1.0.65 1.0.66 1.0.67 1.0.68 1.0.69 1.0.7 1.0.70 1.0.71 1.0.72 1.0.73 1.0.74 1.0.75 1.0.76 1.0.77 1.0.78 1.0.79 1.0.8 1.0.80 1.0.81 1.0.82 1.0.83 1.0.84 1.0.85 1.0.86 1.0.87 1.0.88 1.0.89 1.0.9 1.0.90 1.1.0 1.1.1 1.1.10 1.1.11 1.1.12 1.1.13 1.1.14 1.1.15 1.1.16 1.1.17 1.1.18 1.1.19 1.1.2 1.1.20 1.1.21 1.1.22 1.1.23 1.1.24 1.1.25 1.1.26 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8
suretriggers / src / Integrations / learndash / actions / mark-quiz-complete-for-user.php
suretriggers / src / Integrations / learndash / actions Last commit date
add-user-group.php 11 months ago enroll-to-course.php 11 months ago find-course-taxonomy.php 11 months ago find-user-group-leader-groups.php 5 months ago find-user-groups.php 11 months ago list-user-enrolled-courses.php 11 months ago make-user-group-leader.php 2 years ago mark-course-complete-for-user.php 11 months ago mark-lesson-complete-for-user.php 11 months ago mark-quiz-complete-for-user.php 11 months ago mark-topic-complete-for-user.php 11 months ago remove-from-course.php 11 months ago remove-user-from-group-leader.php 11 months ago remove-user-group.php 11 months ago reset-user-course-progress.php 11 months ago
mark-quiz-complete-for-user.php
362 lines
1 <?php
2 /**
3 * MarkQuizCompleteForUser.
4 * php version 5.6
5 *
6 * @category MarkQuizCompleteForUser
7 * @package SureTriggers
8 * @author BSF <username@example.com>
9 * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3
10 * @link https://www.brainstormforce.com/
11 * @since 1.0.0
12 */
13
14 namespace SureTriggers\Integrations\LearnDash\Actions;
15
16 use SureTriggers\Integrations\AutomateAction;
17 use SureTriggers\Integrations\LearnDash\LearnDash;
18 use SureTriggers\Traits\SingletonLoader;
19 use Exception;
20
21 /**
22 * MarkQuizCompleteForUser
23 *
24 * @category MarkQuizCompleteForUser
25 * @package SureTriggers
26 * @author BSF <username@example.com>
27 * @license https://www.gnu.org/licenses/gpl-3.0.html GPLv3
28 * @link https://www.brainstormforce.com/
29 * @since 1.0.0
30 */
31 class MarkQuizCompleteForUser extends AutomateAction {
32
33 /**
34 * Integration type.
35 *
36 * @var string
37 */
38 public $integration = 'LearnDash';
39
40 /**
41 * Action name.
42 *
43 * @var string
44 */
45 public $action = 'ld_mark_quiz_complete_for_user';
46
47 use SingletonLoader;
48
49 /**
50 * Register a action.
51 *
52 * @param array $actions actions.
53 * @return array
54 */
55 public function register( $actions ) {
56 $actions[ $this->integration ][ $this->action ] = [
57 'label' => __( 'Mark Quiz Complete For User', 'suretriggers' ),
58 'action' => $this->action,
59 'function' => [ $this, 'action_listener' ],
60 ];
61 return $actions;
62 }
63
64 /**
65 * Action listener.
66 *
67 * @param int $user_id user_id.
68 * @param int $automation_id automation_id.
69 * @param array $fields fields.
70 * @param array $selected_options selectedOptions.
71 * @psalm-suppress UndefinedMethod
72 * @throws Exception Error.
73 * @return bool|array
74 */
75 public function _action_listener( $user_id, $automation_id, $fields, $selected_options ) {
76 if ( ! function_exists( 'learndash_process_mark_complete' ) ||
77 ! function_exists( 'learndash_user_get_course_progress' ) ||
78 ! function_exists( 'learndash_process_user_course_progress_update' ) ) {
79 return false;
80 }
81 if ( ! $user_id ) {
82 return [
83 'status' => 'error',
84 'message' => 'User email not exists.',
85 ];
86 }
87
88 $course_id = ( isset( $selected_options['sfwd-courses'] ) ) ? $selected_options['sfwd-courses'] : '0';
89 $lesson_id = ( isset( $selected_options['sfwd_lessons_topics'] ) ) ? $selected_options['sfwd_lessons_topics'] : '0';
90 $quiz_id = ( isset( $selected_options['sfwd-quiz'] ) ) ? $selected_options['sfwd-quiz'] : '0';
91
92 $course_progress = self::get_user_current_course_progress( $user_id, $course_id );
93 $course_updates = self::course_progress_updates( $course_progress, $quiz_id, $lesson_id );
94
95 // If the course progress is empty, then there is nothing to update.
96 if ( empty( $course_updates ) ) {
97 return [
98 'status' => 'error',
99 'message' => 'Lesson/Topic not associated with quiz.',
100 ];
101 }
102
103 $update = [
104 'course' => [
105 $course_id => $course_updates,
106 ],
107 'quiz' => [
108 $course_id => [
109 $quiz_id => 1,
110 ],
111 ],
112 ];
113
114 // Update the user progress.
115 $updated_course_ids = learndash_process_user_course_progress_update( $user_id, $update );
116
117 $user_data = LearnDash::get_user_pluggable_data( $user_id );
118 $lesson = get_post( (int) $lesson_id, ARRAY_A );
119 $lesson_data = [];
120 $quiz_data = [];
121 if ( is_array( $lesson ) ) {
122 $lesson_data = [
123 'ID' => $lesson['ID'],
124 'title' => $lesson['post_title'],
125 'URL' => get_permalink( $lesson['ID'] ),
126 ];
127 }
128 $quiz = get_post( (int) $quiz_id, ARRAY_A );
129 if ( is_array( $quiz ) ) {
130 $quiz_data = [
131 'ID' => $quiz['ID'],
132 'title' => $quiz['post_title'],
133 'URL' => get_permalink( $quiz['ID'] ),
134 ];
135 }
136 return [
137 'user' => $user_data,
138 'course' => LearnDash::get_course_pluggable_data( $course_id ),
139 'lesson' => $lesson_data,
140 'quiz' => $quiz_data,
141 ];
142 }
143
144 /**
145 * Get current course progress for a user.
146 *
147 * @param int $user_id User ID.
148 * @param int $course_id Course ID.
149 *
150 * @return array
151 */
152 public function get_user_current_course_progress( $user_id, $course_id ) {
153
154 if ( ! function_exists( 'learndash_course_status' ) ||
155 ! function_exists( 'learndash_get_course_quiz_list' ) ||
156 ! function_exists( 'learndash_is_quiz_complete' ) ||
157 ! function_exists( 'learndash_get_course_lessons_list' ) ||
158 ! function_exists( 'learndash_topic_dots' ) ||
159 ! function_exists( 'learndash_get_lesson_quiz_list' ) ) {
160 return [];
161 }
162
163 $status = learndash_course_status( $course_id, $user_id );
164 $progress = [
165 'is_completed' => 'completed' === $status ? 1 : 0,
166 'lessons' => [],
167 'quiz' => [],
168 'course' => [
169 'lessons' => [],
170 'topics' => [],
171 ],
172 ];
173
174 // Get all quizzes for the course.
175 $quizzes = learndash_get_course_quiz_list( $course_id );
176 if ( ! empty( $quizzes ) ) {
177 foreach ( $quizzes as $key => $quiz ) {
178 $quiz_id = $quiz['post']->ID;
179 $quiz_completed = learndash_is_quiz_complete( $user_id, $quiz_id, $course_id );
180 $progress['quiz'][ $quiz_id ] = $quiz_completed ? 1 : 0;
181 }
182 }
183
184 // Get all lessons for the course.
185 $lessons = learndash_get_course_lessons_list( $course_id, $user_id, [ 'per_page' => 9999 ] );
186 if ( ! empty( $lessons ) ) {
187 foreach ( $lessons as $lesson ) {
188 $lesson_id = $lesson['post']->ID;
189 $lesson_completed = 'completed' === $lesson['status'] ? 1 : 0;
190 $progress['course']['lessons'][ $lesson_id ] = $lesson_completed;
191 // Build Lesson Progress.
192 $progress['lessons'][ $lesson_id ] = ! empty( $progress['lessons'][ $lesson_id ] ) ? $progress['lessons'][ $lesson_id ] : [];
193 $progress['lessons'][ $lesson_id ]['is_completed'] = $lesson_completed;
194 $progress['lessons'][ $lesson_id ]['topics'] = ! empty( $progress['lessons'][ $lesson_id ]['topics'] ) ? $progress['lessons'][ $lesson_id ]['topics'] : [];
195 $progress['lessons'][ $lesson_id ]['quizzes'] = ! empty( $progress['lessons'][ $lesson_id ]['quizzes'] ) ? $progress['lessons'][ $lesson_id ]['quizzes'] : [];
196
197 // Get all topics for the lesson.
198 $topics = learndash_topic_dots( $lesson_id, false, 'array', $user_id, $course_id );
199 if ( ! empty( $topics ) ) {
200 $progress['course']['topics'][ $lesson_id ] = ! empty( $progress['course']['topics'][ $lesson_id ] ) ? $progress['course']['topics'][ $lesson_id ] : [];
201 foreach ( $topics as $topic ) {
202 $topic_id = $topic->ID;
203 $topic_completed = ! empty( $topic->completed ) ? 1 : 0;
204
205 // Build Topic Progress.
206 $progress['lessons'][ $lesson_id ]['topics'][ $topic_id ] = ! empty( $progress['lessons'][ $lesson_id ]['topics'][ $topic_id ] ) ? $progress['lessons'][ $lesson_id ]['topics'][ $topic_id ] : [];
207 $progress['lessons'][ $lesson_id ]['topics'][ $topic_id ]['is_completed'] = $topic_completed;
208 $progress['course']['topics'][ $lesson_id ][ $topic_id ] = $topic_completed;
209 $progress['lessons'][ $lesson_id ]['topics'][ $topic_id ]['quizzes'] = ! empty( $progress['lessons'][ $lesson_id ]['topics'][ $topic_id ]['quizzes'] ) ? $progress['lessons'][ $lesson_id ]['topics'][ $topic_id ]['quizzes'] : [];
210
211 // Get all quizzes for the topic.
212 $topic_quizzes = learndash_get_lesson_quiz_list( $topic_id, null, $course_id );
213 if ( ! empty( $topic_quizzes ) ) {
214 foreach ( $topic_quizzes as $key => $quiz ) {
215 $quiz_id = $quiz['post']->ID;
216 $quiz_completed = learndash_is_quiz_complete( $user_id, $quiz_id, $course_id ) ? 1 : 0;
217 $progress['lessons'][ $lesson_id ]['topics'][ $topic_id ]['quizzes'][ $quiz_id ] = $quiz_completed;
218 $progress['quiz'][ $quiz_id ] = $quiz_completed;
219 }
220 }
221 }
222 }
223
224 // Lesson Quizzes.
225 $lesson_quizzes = learndash_get_lesson_quiz_list( $lesson_id, $user_id, $course_id );
226 if ( ! empty( $lesson_quizzes ) ) {
227 foreach ( $lesson_quizzes as $key => $quiz ) {
228 $quiz_id = $quiz['post']->ID;
229 $quiz_completed = learndash_is_quiz_complete( $user_id, $quiz_id, $course_id ) ? 1 : 0;
230 $progress['lessons'][ $lesson_id ]['quizzes'][ $quiz_id ] = $quiz_completed;
231 $progress['quiz'][ $quiz_id ] = $quiz_completed;
232 }
233 }
234 }
235 }
236
237 return $progress;
238 }
239
240 /**
241 * Update course progress array.
242 *
243 * @param array $course_progress Course Progress.
244 * @param int $quiz_id Quiz ID.
245 * @param int $step_id Step ID.
246 *
247 * @return array
248 */
249 public function course_progress_updates( $course_progress, $quiz_id, $step_id ) {
250
251 $updates = $course_progress['course'];
252 $lessons = $course_progress['lessons'];
253
254 $quiz_lesson_id = 0;
255 $quiz_topic_id = 0;
256 foreach ( $lessons as $lesson_id => $lesson ) {
257 if ( ! empty( $lesson['quizzes'] ) ) {
258 if ( array_key_exists( $quiz_id, $lesson['quizzes'] ) ) {
259 $quiz_lesson_id = $lesson_id;
260 }
261 }
262 if ( ! empty( $lesson['topics'] ) ) {
263 foreach ( $lesson['topics'] as $topic_id => $topic ) {
264 if ( ! empty( $topic['quizzes'] ) ) {
265 if ( array_key_exists( $quiz_id, $topic['quizzes'] ) ) {
266 $quiz_lesson_id = $lesson_id;
267 $quiz_topic_id = $topic_id;
268 }
269 }
270 }
271 }
272 }
273
274 $quiz_step_ids = [
275 'lesson' => $quiz_lesson_id,
276 'topic' => $quiz_topic_id,
277 ];
278 $lesson_id = $quiz_step_ids['lesson'];
279 $topic_id = $quiz_step_ids['topic'];
280
281 if ( $step_id > 0 ) {
282 if ( ! in_array( $step_id, $quiz_step_ids, true ) ) {
283 return [];
284 }
285 }
286
287 if ( ! empty( $topic_id ) ) {
288 $lessons[ $lesson_id ]['topics'][ $topic_id ]['quizzes'][ $quiz_id ] = 1;
289 if ( self::all_step_quizzes_completed( $lessons[ $lesson_id ]['topics'][ $topic_id ] ) ) {
290 $updates['topics'][ $lesson_id ][ $topic_id ] = 1;
291 $lessons[ $lesson_id ]['topics'][ $topic_id ]['is_completed'] = 1;
292 }
293 }
294
295 if ( self::all_lesson_steps_completed( $lessons[ $lesson_id ], $quiz_id, $topic_id ) ) {
296 $updates['lessons'][ $lesson_id ] = 1;
297 }
298
299 return $updates;
300 }
301
302 /**
303 * Check if all quizzes in a step are completed.
304 *
305 * @param array $step Step.
306 * @param int $complete_quiz_id Complete Quiz ID.
307 *
308 * @return bool
309 */
310 public function all_step_quizzes_completed( $step, $complete_quiz_id = 0 ) {
311 foreach ( $step['quizzes'] as $quiz_id => $status ) {
312 if ( empty( $status ) ) {
313 if ( ! empty( $complete_quiz_id ) ) {
314 if ( $quiz_id !== $complete_quiz_id ) {
315 return false;
316 }
317 } else {
318 return false;
319 }
320 }
321 }
322 return true;
323 }
324
325 /**
326 * Check if all lesson steps are completed.
327 *
328 * @param array $lesson Lesson.
329 * @param int $quiz_id Quiz ID.
330 * @param int $quiz_topic_id Quiz Post ID.
331 *
332 * @return bool
333 */
334 public function all_lesson_steps_completed( $lesson, $quiz_id, $quiz_topic_id ) {
335
336 if ( ! empty( $lesson['topics'] ) ) {
337 foreach ( $lesson['topics'] as $topic_id => $topic ) {
338 if ( ! self::all_step_quizzes_completed( $topic, $quiz_id ) ) {
339 return false;
340 }
341 }
342
343 foreach ( $lesson['topics'] as $topic_id => $topic ) {
344 if ( empty( $topic['is_completed'] ) && $topic_id !== $quiz_topic_id ) {
345 return false;
346 }
347 }
348 }
349
350 if ( ! empty( $lesson['quizzes'] ) ) {
351 if ( ! self::all_step_quizzes_completed( $lesson, $quiz_id ) ) {
352 return false;
353 }
354 }
355
356 return true;
357 }
358
359 }
360
361 MarkQuizCompleteForUser::get_instance();
362