PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 1.9.14
Tutor LMS – eLearning and online course solution v1.9.14
4.0.1 4.0.0 3.9.15 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 / views / pages / view_attempt.php
tutor / views / pages Last commit date
tools 4 years ago add_new_instructor.php 4 years ago addons.php 4 years ago announcements.php 4 years ago answer.php 4 years ago enable_disable_addons.php 4 years ago get-pro.php 5 years ago instructors.php 4 years ago question_answer.php 4 years ago quiz_attempts.php 4 years ago students.php 4 years ago tools.php 4 years ago tutor-pro-addons.php 4 years ago uninstall.php 4 years ago view_attempt.php 4 years ago withdraw_requests.php 4 years ago
view_attempt.php
354 lines
1 <?php
2 $attempt_id = (int) $_GET['attempt_id'];
3 $attempt = tutor_utils()->get_attempt( $attempt_id );
4
5 if ( ! $attempt ) {
6 ?>
7 <h1><?php _e( 'Attempt not found', 'tutor' ); ?></h1>
8 <?php
9 return;
10 }
11
12 $quiz_attempt_info = tutor_utils()->quiz_attempt_info( $attempt->attempt_info );
13 $answers = tutor_utils()->get_quiz_answers_by_attempt_id( $attempt->attempt_id );
14
15 $user_id = tutor_utils()->avalue_dot( 'user_id', $attempt );
16 $user = get_userdata( $user_id );
17 ?>
18
19
20 <div class="tutor-quiz-attempt-review-wrap">
21 <div class="attempt-review-title"> <i class="tutor-icon-list"></i> <?php _e( 'View Attempts', 'tutor' ); ?></div>
22
23 <div class="tutor-quiz-attempt-info-row">
24 <div class="attempt-view-top">
25 <div class="attempt-info-col">
26 <div class="attempt-user-details">
27 <div class="attempt-user-avatar">
28 <img src="<?php echo esc_url( get_avatar_url( $user_id ) ); ?>" alt="<?php echo esc_attr( $user->display_name ); ?>">
29 </div>
30 <div class="attempt-info-content">
31 <h5><?php echo __( 'Student Name', 'tutor' ); ?></h5>
32 <h4><?php echo esc_html( $user->display_name ); ?></h4>
33 </div>
34 </div>
35 </div>
36
37 <div class="attempt-info-col">
38 <div class="attempt-info-content">
39 <h5><?php echo __( 'Quiz', 'tutor' ); ?></h5>
40 <h4>
41 <?php
42 echo '<a href="' . esc_url( admin_url( "post.php?post={$attempt->quiz_id}&action=edit" ) ) . '">' . get_the_title( $attempt->quiz_id ) . '</a>';
43 ?>
44 </h4>
45 </div>
46 </div>
47
48 <div class="attempt-info-col">
49 <div class="attempt-info-content">
50 <h5><?php echo __( 'Attempt Time', 'tutor' ); ?></h5>
51 <h4>
52 <?php echo date_i18n( get_option( 'date_format' ), strtotime( $attempt->attempt_started_at ) ) . ' ' . date_i18n( get_option( 'time_format' ), strtotime( $attempt->attempt_started_at ) ); ?>
53 </h4>
54 </div>
55 </div>
56
57 <div class="attempt-info-col">
58 <div class="attempt-info-content">
59 <h5><?php echo __( 'Status', 'tutor' ); ?></h5>
60 <h4>
61 <?php
62 $status = ucwords( str_replace( 'quiz_', '', $attempt->attempt_status ) );
63 esc_html_e( $status, 'tutor' );
64 ?>
65 </h4>
66 </div>
67 </div>
68 </div>
69
70 <div class="attempt-view-bottom">
71 <div class="attempt-info-col">
72 <div class="attempt-info-content">
73 <h5><?php echo __( 'Course', 'tutor' ); ?></h5>
74 <h4>
75 <?php
76 $quiz = tutor_utils()->get_course_by_quiz( $attempt->quiz_id );
77 if ( $quiz ) {
78 echo '<a href="' . esc_url( admin_url( 'post.php?post=' . $quiz->ID . '&action=edit' ) ) . '">' . get_the_title( $quiz->ID ) . '</a>';
79 }
80 ?>
81 </h4>
82 </div>
83 </div>
84
85 <div class="attempt-info-col">
86 <div class="attempt-info-content">
87 <h5><?php echo __( 'Result', 'tutor' ); ?></h5>
88 <h4>
89 <?php
90 $marks_earned_text = __( 'Marks earned', 'tutor' );
91 if ( $attempt->attempt_status === 'review_required' ) {
92 $output = '<span class="result-review-required">' . __( 'Under Review', 'tutor' ) . '</span>';
93 } else {
94
95 $pass_mark_percent = tutor_utils()->get_quiz_option( $attempt->quiz_id, 'passing_grade', 0 );
96 $earned_percentage = $attempt->earned_marks > 0 ? ( number_format( ( $attempt->earned_marks * 100 ) / $attempt->total_marks ) ) : 0;
97 $output = '';
98 if ( $earned_percentage >= $pass_mark_percent ) {
99 $output .= '<span class="result-pass">' . __( 'Pass', 'tutor' ) . '</span>';
100 } else {
101 $output .= '<span class="result-fail">' . __( 'Fail', 'tutor' ) . '</span>';
102 }
103
104 $output .= __( $attempt->earned_marks . ' out of ' . $attempt->total_marks, 'tutor' );
105 $output .= '<span>, ' . $marks_earned_text . ' (' . $earned_percentage . '%)</span>';
106 }
107 echo $output;
108 ?>
109 </h4>
110 </div>
111 </div>
112
113 <div class="attempt-info-col">
114 <div class="attempt-info-content">
115 <h5><?php echo __( 'Quiz Time', 'tutor' ); ?></h5>
116 <h4>
117 <?php
118 $time_limit_seconds = tutor_utils()->avalue_dot( 'time_limit.time_limit_seconds', $quiz_attempt_info );
119 echo tutor_utils()->seconds_to_time_context( $time_limit_seconds );
120 ?>
121 </h4>
122 </div>
123 </div>
124
125 <div class="attempt-info-col">
126 <div class="attempt-info-content">
127 <h5><?php echo __( 'Attempt Time', 'tutor' ); ?></h5>
128 <h4>
129 <?php
130 $attempt_time_sec = strtotime( $attempt->attempt_ended_at ) - strtotime( $attempt->attempt_started_at );
131 echo tutor_utils()->seconds_to_time_context( $attempt_time_sec );
132 ?>
133 </h4>
134 </div>
135 </div>
136 </div>
137 </div>
138
139 <div class="attempt-review-notice-wrap">
140 <?php
141 if ( is_array( $answers ) && count( $answers ) ) {
142 $question_no = 0;
143 $required_review = array();
144
145 foreach ( $answers as $answer ) {
146 $question_no++;
147 if ( $answer->question_type === 'open_ended' || $answer->question_type === 'short_answer' ) {
148 $required_review[] = $question_no;
149 }
150 }
151
152 if ( count( $required_review ) ) {
153 echo '<p class="attempt-review-notice"> <i class="tutor-icon-warning-2"></i> <strong>' . __( 'Reminder:', 'tutor' ) . ' </strong> ' . sprintf( __( 'Please review answers for question no. %s', 'tutor' ), implode( ', ', $required_review ) ) . '</p>';
154 }
155 }
156
157 if ( (bool) $attempt->is_manually_reviewed ) {
158 ?>
159 <p class="attempt-review-at">
160 <span class="circle-arrow">&circlearrowright; </span>
161 <strong>
162 <?php _e( 'Manually reviewed at: ', 'tutor' ); ?>
163 </strong>
164 <?php echo date_i18n( get_option( 'date_format' ), strtotime( $attempt->manually_reviewed_at ) ) . ' ' . date_i18n( get_option( 'time_format' ), strtotime( $attempt->manually_reviewed_at ) ); ?>
165 </p>
166 <?php
167 }
168 ?>
169 </div>
170
171 <?php
172 if ( is_array( $answers ) && count( $answers ) ) {
173
174 ?>
175 <div class="quiz-attempt-answers-wrap">
176
177 <div class="attempt-answers-header">
178 <div class="attempt-header-quiz"><?php _e( 'Quiz Overview', 'tutor' ); ?></div>
179 </div>
180
181 <table class="wp-list-table">
182 <tr>
183 <th><?php _e( 'Type', 'tutor' ); ?></th>
184 <th><?php _e( 'No.', 'tutor' ); ?></th>
185 <th><?php _e( 'Question', 'tutor' ); ?></th>
186 <th><?php _e( 'Given Answers', 'tutor' ); ?></th>
187 <th><?php _e( 'Correct/Incorrect', 'tutor' ); ?></th>
188 <th><?php _e( 'Manual Review', 'tutor' ); ?></th>
189 </tr>
190 <?php
191 $answer_i = 0;
192 foreach ( $answers as $answer ) {
193 $answer_i++;
194 $question_type = tutor_utils()->get_question_types( $answer->question_type );
195 ?>
196 <tr>
197 <td><?php echo $question_type['icon']; ?></td>
198 <td><?php echo $answer_i; ?></td>
199 <td><?php echo stripslashes( esc_attr( $answer->question_title ) ); ?></td>
200 <td>
201 <?php
202 if ( $answer->question_type === 'true_false' || $answer->question_type === 'single_choice' ) {
203 $get_answers = tutor_utils()->get_answer_by_id( $answer->given_answer );
204 $answer_titles = wp_list_pluck( $get_answers, 'answer_title' );
205 $answer_titles = array_map( 'stripslashes', $answer_titles );
206 echo '<p>' . implode( '</p><p>', $answer_titles ) . '</p>';
207 } elseif ( $answer->question_type === 'multiple_choice' ) {
208 $get_answers = tutor_utils()->get_answer_by_id( maybe_unserialize( $answer->given_answer ) );
209 $answer_titles = wp_list_pluck( $get_answers, 'answer_title' );
210 $answer_titles = array_map( 'stripslashes', $answer_titles );
211 echo '<p>' . implode( '</p><p>', $answer_titles ) . '</p>';
212 } elseif ( $answer->question_type === 'fill_in_the_blank' ) {
213 $answer_titles = maybe_unserialize( $answer->given_answer );
214 $get_db_answers_by_question = tutor_utils()->get_answers_by_quiz_question( $answer->question_id );
215 foreach ( $get_db_answers_by_question as $db_answer ) {
216 }
217 $count_dash_fields = substr_count( $db_answer->answer_title, '{dash}' );
218 if ( $count_dash_fields ) {
219 $dash_string = array();
220 $input_data = array();
221 for ( $i = 0; $i < $count_dash_fields; $i++ ) {
222 // $dash_string[] = '{dash}';
223 $input_data[] = isset( $answer_titles[ $i ] ) ? "<span class='filled_dash_unser'>" . esc_attr( $answer_titles[ $i ] ) . '</span>' : '______';
224 }
225 $answer_title = $db_answer->answer_title;
226 foreach ( $input_data as $replace ) {
227 $answer_title = preg_replace( '/{dash}/i', $replace, $answer_title, 1 );
228 }
229 echo str_replace( '{dash}', '_____', stripslashes( $answer_title ) );
230 }
231 } elseif ( $answer->question_type === 'open_ended' || $answer->question_type === 'short_answer' ) {
232
233 if ( $answer->given_answer ) {
234 echo wpautop( stripslashes( $answer->given_answer ) );
235 }
236 } elseif ( $answer->question_type === 'ordering' ) {
237
238 $ordering_ids = maybe_unserialize( $answer->given_answer );
239 foreach ( $ordering_ids as $ordering_id ) {
240 $get_answers = tutor_utils()->get_answer_by_id( $ordering_id );
241 $answer_titles = wp_list_pluck( $get_answers, 'answer_title' );
242 $answer_titles = array_map( 'stripslashes', $answer_titles );
243 echo '<p>' . implode( '</p><p>', $answer_titles ) . '</p>';
244 }
245 } elseif ( $answer->question_type === 'matching' ) {
246
247 $ordering_ids = maybe_unserialize( $answer->given_answer );
248 $original_saved_answers = tutor_utils()->get_answers_by_quiz_question( $answer->question_id );
249
250 foreach ( $original_saved_answers as $key => $original_saved_answer ) {
251 $provided_answer_order_id = isset( $ordering_ids[ $key ] ) ? $ordering_ids[ $key ] : 0;
252 $provided_answer_order = tutor_utils()->get_answer_by_id( $provided_answer_order_id );
253 if ( tutils()->count( $provided_answer_order ) ) {
254 foreach ( $provided_answer_order as $provided_answer_order ) {
255 }
256 echo stripslashes( $original_saved_answer->answer_title ) . ' - ' . stripslashes( $provided_answer_order->answer_two_gap_match ) . '<br/>';
257 }
258 }
259 } elseif ( $answer->question_type === 'image_matching' ) {
260
261 $ordering_ids = maybe_unserialize( $answer->given_answer );
262 $original_saved_answers = tutor_utils()->get_answers_by_quiz_question( $answer->question_id );
263
264 echo '<div class="answer-image-matched-wrap">';
265 foreach ( $original_saved_answers as $key => $original_saved_answer ) {
266 $provided_answer_order_id = isset( $ordering_ids[ $key ] ) ? $ordering_ids[ $key ] : 0;
267 $provided_answer_order = tutor_utils()->get_answer_by_id( $provided_answer_order_id );
268 foreach ( $provided_answer_order as $provided_answer_order ) {
269 }
270 ?>
271 <div class="image-matching-item">
272 <p class="dragged-img-rap"><img src="<?php echo wp_get_attachment_image_url( $original_saved_answer->image_id ); ?>" /> </p>
273 <p class="dragged-caption"><?php echo stripslashes( esc_attr( $provided_answer_order->answer_title ) ); ?></p>
274 </div>
275 <?php
276 }
277 echo '</div>';
278 } elseif ( $answer->question_type === 'image_answering' ) {
279
280 $ordering_ids = maybe_unserialize( $answer->given_answer );
281
282 echo '<div class="answer-image-matched-wrap">';
283 foreach ( $ordering_ids as $answer_id => $image_answer ) {
284 $db_answers = tutor_utils()->get_answer_by_id( $answer_id );
285 foreach ( $db_answers as $db_answer ) {
286 }
287 ?>
288 <div class="image-matching-item">
289 <p class="dragged-img-rap"><img src="<?php echo wp_get_attachment_image_url( $db_answer->image_id ); ?>" /> </p>
290 <p class="dragged-caption"><?php echo $image_answer; ?></p>
291 </div>
292 <?php
293 }
294 echo '</div>';
295 }
296
297 ?>
298 </td>
299
300 <td>
301 <?php
302 if ( $answer->is_correct ) {
303 echo '<span class="quiz-correct-answer-text"><i class="tutor-icon-mark"></i> ' . __( 'Correct', 'tutor' ) . '</span>';
304 } else {
305 if ( $answer->question_type === 'open_ended' || $answer->question_type === 'short_answer' ) {
306
307 // if ( (bool) $attempt->is_manually_reviewed && (!isset( $answer->is_correct ) || $answer->is_correct == 0 )) {
308 if ( $answer->is_correct == null ) {
309 echo '<p style="color: #878A8F;"><span style="color: #ff282a;">&ast;</span> ' . __( 'Review Required', 'tutor' ) . '</p>';
310 } elseif ( $answer->is_correct == 0 ) {
311
312 echo '<span class="tutor-status-blocked-context"><i class="tutor-icon-line-cross"></i> ' . __( 'Incorrect', 'tutor' ) . '</span>';
313 } else {
314 echo '<span class="quiz-correct-answer-text"><i class="tutor-icon-mark"></i> ' . __( 'Correct', 'tutor' ) . '</span>';
315 }
316 } else {
317 echo '<span class="quiz-incorrect-answer-text"><i class="tutor-icon-line-cross"></i> ' . __( 'Incorrect', 'tutor' ) . '</span>';
318 }
319 }
320 ?>
321 </td>
322
323 <td style="white-space: nowrap">
324 <?php
325 $nonce_key = tutor()->nonce;
326 $nonce_value = wp_create_nonce( tutor()->nonce_action );
327 ?>
328 <a href="<?php echo esc_url( admin_url( "admin.php?{$nonce_key}={$nonce_value}&action=review_quiz_answer&attempt_id={$attempt_id}&attempt_answer_id={$answer->attempt_answer_id}&mark_as=correct" ) ); ?>" title="<?php _e( 'Mark as correct', 'tutor' ); ?>" class="attempt-mark-correct-btn quiz-manual-review-action"><i class="tutor-icon-mark"></i> </a>
329 <a href="<?php echo esc_url( admin_url( "admin.php?{$nonce_key}={$nonce_value}&action=review_quiz_answer&attempt_id={$attempt_id}&attempt_answer_id={$answer->attempt_answer_id}&mark_as=incorrect" ) ); ?>" title="<?php _e( 'Mark as In correct', 'tutor' ); ?>" class="attempt-mark-incorrect-btn quiz-manual-review-action"><i class="tutor-icon-line-cross"></i></a>
330 </td>
331 </tr>
332 <?php
333 }
334 ?>
335 </table>
336 </div>
337
338 <?php
339 }
340 ?>
341 </div>
342
343
344
345 <div class="quiz-attempt-answers-wrap">
346 <div class="attempt-answers-header">
347 <div class="attempt-header-quiz"><?php _e( 'Instructor Feedback', 'tutor' ); ?></div>
348 </div>
349 <div class="tutor-instructor-feedback-wrap">
350 <textarea class="tutor-instructor-feedback-content" style="width:100%; height: 100px;"><?php echo get_post_meta( $attempt_id, 'instructor_feedback', true ); ?></textarea>
351 <a class="tutor-button tutor-button-primary tutor-instructor-feedback" data-attemptid="<?php echo esc_attr( $attempt_id ); ?>" data-toast_success_message="<?php _e( 'Updated', 'tutor' ); ?>"><?php _e( 'Update', 'tutor' ); ?></a>
352 </div>
353 </div>
354