PluginProbe ʕ •ᴥ•ʔ
Tutor LMS – eLearning and online course solution / 1.0.1
Tutor LMS – eLearning and online course solution v1.0.1
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 / templates / single / quiz / body.php
tutor / templates / single / quiz Last commit date
body.php 7 years ago no_course_belongs.php 7 years ago single_quiz_contents.php 7 years ago top.php 7 years ago
body.php
476 lines
1 <?php
2
3 global $post;
4 $currentPost = $post;
5
6 $is_started_quiz = tutor_utils()->is_started_quiz();
7
8 $previous_attempts = tutor_utils()->quiz_attempts();
9 $attempted_count = is_array($previous_attempts) ? count($previous_attempts) : 0;
10
11 $attempts_allowed = tutor_utils()->get_quiz_option(get_the_ID(), 'attempts_allowed', 0);
12 $passing_grade = tutor_utils()->get_quiz_option(get_the_ID(), 'passing_grade', 0);
13
14 $attempt_remaining = $attempts_allowed - $attempted_count;
15 ?>
16
17 <div id="tutor-quiz-body" class="tutor-quiz-body tutor-quiz-body-<?php the_ID(); ?>">
18 <?php
19 if ($is_started_quiz){
20 $quiz_attempt_info = tutor_utils()->quiz_attempt_info($is_started_quiz->attempt_info);
21 $quiz_attempt_info['date_time_now'] = date("Y-m-d H:i:s");
22
23 $time_limit_seconds = tutor_utils()->avalue_dot('time_limit.time_limit_seconds', $quiz_attempt_info);
24 $question_layout_view = tutor_utils()->avalue_dot('question_layout_view', $quiz_attempt_info);
25
26 $hide_quiz_time_display = (bool) tutor_utils()->avalue_dot('hide_quiz_time_display', $quiz_attempt_info);
27 $hide_question_number_overview = (bool) tutor_utils()->avalue_dot('hide_question_number_overview', $quiz_attempt_info);
28
29 $remaining_time_secs = (strtotime($is_started_quiz->attempt_started_at) + $time_limit_seconds ) - strtotime($quiz_attempt_info['date_time_now']);
30
31 $remaining_time_context = tutor_utils()->seconds_to_time_context($remaining_time_secs);
32 $questions = tutor_utils()->get_random_questions_by_quiz();
33 ?>
34
35 <div class="quiz-head-meta-info">
36 <?php
37 if ( ! $hide_quiz_time_display){
38 ?>
39 <div class="time-remaining">
40 <?php _e('Time remaining : '); ?> <span id="tutor-quiz-time-update" data-attempt-settings="<?php echo esc_attr(json_encode($is_started_quiz)) ?>" data-attempt-meta="<?php echo esc_attr(json_encode($quiz_attempt_info)) ?>"><?php echo $remaining_time_context; ?></span>
41 </div>
42 <?php } ?>
43 </div>
44
45 <?php
46 if (is_array($questions) && count($questions)) {
47 ?>
48 <div id="tutor-quiz-attempt-questions-wrap" data-question-layout-view="<?php echo $question_layout_view; ?>">
49
50 <?php
51 if ($question_layout_view === 'question_pagination'){
52 $question_i = 0;
53 ?>
54 <div class="tutor-quiz-questions-pagination">
55 <ul>
56 <?php
57 foreach ($questions as $question) {
58 $question_i++;
59 echo "<li><a href='#quiz-attempt-single-question-{$question->question_id}' class='tutor-quiz-question-paginate-item'>{$question_i}</a> </li>";
60 }
61 ?>
62 </ul>
63 </div>
64 <?php
65 }
66 ?>
67
68 <form id="tutor-answering-quiz" method="post">
69 <?php wp_nonce_field( tutor()->nonce_action, tutor()->nonce ); ?>
70 <input type="hidden" value="<?php echo $is_started_quiz->attempt_id; ?>" name="attempt_id"/>
71 <input type="hidden" value="tutor_answering_quiz_question" name="tutor_action"/>
72 <?php
73 $question_i = 0;
74 foreach ($questions as $question) {
75 $question_i++;
76 $question_settings = maybe_unserialize($question->question_settings);
77
78 $style_display = ($question_layout_view !== 'question_below_each_other' && $question_i == 1) ? 'block' : 'none';
79 if ($question_layout_view === 'question_below_each_other'){
80 $style_display = 'block';
81 }
82
83 $next_question = isset($questions[$question_i]) ? $questions[$question_i] : false;
84 ?>
85 <div id="quiz-attempt-single-question-<?php echo $question->question_id; ?>" class="quiz-attempt-single-question quiz-attempt-single-question-<?php echo $question_i; ?>" style="display: <?php echo $style_display; ?> ;" <?php echo $next_question ? "data-next-question-id='#quiz-attempt-single-question-{$next_question->question_id}'" : '' ; ?> >
86
87 <?php echo "<input type='hidden' name='attempt[{$is_started_quiz->attempt_id}][quiz_question_ids][]' value='{$question->question_id}' />";
88
89
90 $question_type = $question->question_type;
91 $answers = tutor_utils()->get_answers_by_quiz_question($question->question_id);
92 $show_question_mark = (bool) tutor_utils()->avalue_dot('show_question_mark', $question_settings);
93
94 echo '<h4 class="question-text">';
95 if ( ! $hide_question_number_overview){
96 echo $question_i;
97 }
98 echo $question->question_title;
99 echo '</h4>';
100
101 if ($show_question_mark){
102 echo '<p class="question-marks"> '.__('Marks : ', 'tutor').$question->question_mark.' </p>';
103 }
104 ?>
105 <p class="question-description"><?php echo $question->question_description; ?></p>
106
107 <div class="tutor-quiz-answers-wrap">
108 <?php
109 if ( is_array($answers) && count($answers) ) {
110 foreach ($answers as $answer){
111 if ( $question_type === 'true_false' || $question_type === 'single_choice' ) {
112 ?>
113 <label>
114 <div class="quiz-answer-input-field">
115 <input name="attempt[<?php echo $is_started_quiz->attempt_id; ?>][quiz_question][<?php echo $question->question_id; ?>]" type="radio" value="<?php echo $answer->answer_id; ?>">
116 <span>&nbsp;</span>
117 </div>
118
119 <div class="quiz-answer-input-body">
120 <?php
121 if ($answer->answer_view_format !== 'image'){
122 echo "<p class='tutor-quiz-answer-title'>{$answer->answer_title}</p>";
123 }
124 if ($answer->answer_view_format === 'image' || $answer->answer_view_format === 'text_image'){
125 ?>
126 <div class="quiz-answer-image-wrap">
127 <img src="<?php echo wp_get_attachment_image_url($answer->image_id, 'full') ?>" />
128 </div>
129 <?php
130 }
131 ?>
132 </div>
133 </label>
134 <?php
135 }elseif ($question_type === 'multiple_choice'){
136 ?>
137 <label>
138 <div class="quiz-answer-input-field">
139 <input name="attempt[<?php echo $is_started_quiz->attempt_id; ?>][quiz_question][<?php echo $question->question_id; ?>][]" type="checkbox" value="<?php echo $answer->answer_id; ?>">
140 <span>&nbsp;</span>
141 </div>
142
143 <div class="quiz-answer-input-body">
144 <?php
145 if ($answer->answer_view_format !== 'image'){
146 echo "<p class='tutor-quiz-answer-title'>{$answer->answer_title}</p>";
147 }
148 if ($answer->answer_view_format === 'image' || $answer->answer_view_format === 'text_image'){
149 ?>
150 <div class="quiz-answer-image-wrap">
151 <img src="<?php echo wp_get_attachment_image_url($answer->image_id, 'full') ?>" />
152 </div>
153 <?php
154 }
155 ?>
156 </div>
157 </label>
158 <?php
159 }
160 elseif ($question_type === 'fill_in_the_blank'){
161 ?>
162 <p class="fill-in-the-blank-field">
163 <?php
164 $count_dash_fields = substr_count($answer->answer_title, '{dash}');
165 if ($count_dash_fields){
166
167 $dash_string = array();
168 $input_data = array();
169 for($i=1; $i <=$count_dash_fields; $i ++){
170 $dash_string[] = '{dash}';
171 $input_data[] = "<input type='text' name='attempt[{$is_started_quiz->attempt_id}][quiz_question][{$question->question_id}][]' class='fill-in-the-blank-text-input' />";
172 }
173 echo str_replace($dash_string, $input_data, $answer->answer_title);
174 }
175 ?>
176 </p>
177 <?php
178 }
179 elseif ($question_type === 'ordering'){
180 ?>
181 <div class="question-type-ordering-item">
182 <div class="answer-title">
183 <?php
184 if ($answer->answer_view_format !== 'image'){
185 echo "<p class='tutor-quiz-answer-title'>{$answer->answer_title}</p>";
186 }
187 if ($answer->answer_view_format === 'image' || $answer->answer_view_format === 'text_image'){
188 ?>
189 <div class="quiz-answer-image-wrap">
190 <img src="<?php echo wp_get_attachment_image_url($answer->image_id, 'full') ?>" />
191 </div>
192 <?php
193 }
194 ?>
195 </div>
196 <span class="answer-sorting-bar"><i class="tutor-icon-menu-2"></i> </span>
197 <input type="hidden" name="attempt[<?php echo $is_started_quiz->attempt_id; ?>][quiz_question][<?php echo $question->question_id; ?>][answers][]" value="<?php echo $answer->answer_id; ?>" >
198 </div>
199 <?php
200 }
201 }
202
203 /**
204 * Question type matchind and image matching
205 */
206 if ($question_type === 'matching' || $question_type === 'image_matching'){
207 ?>
208 <div class="quiz-answers-type-matching-wrap <?php echo 'answer-type-'.$question_type ?> ">
209 <div class="quiz-draggable-rand-answers">
210 <?php
211 $rand_answers = tutor_utils()->get_answers_by_quiz_question($question->question_id, true);
212 foreach ($rand_answers as $rand_answer){
213 ?>
214 <div class="quiz-draggable-answer-item">
215 <?php
216 if ($question_type === 'matching'){
217 echo "<span class='draggable-answer-title'>{$rand_answer->answer_two_gap_match}</span>";
218 }else{
219 echo "<span class='draggable-answer-title'>{$rand_answer->answer_title}</span>";
220 }
221 ?>
222 <span class="draggable-answer-icon"> <i class="tutor-icon-menu-2"></i> </span>
223 <input type="hidden" name="attempt[<?php echo $is_started_quiz->attempt_id; ?>][quiz_question][<?php echo $question->question_id; ?>][answers][]" value="<?php echo $rand_answer->answer_id; ?>" >
224 </div>
225 <?php
226 }
227 ?>
228 </div>
229
230 <div class="quiz-answer-matching-items-wrap">
231
232 <?php
233 foreach ($answers as $answer){
234 ?>
235 <div class="quiz-answer-item-matching">
236 <div class="quiz-answer-matching-title">
237 <?php
238 if ($question_type === 'matching') {
239
240 if ($answer->answer_view_format !== 'image'){
241 echo "<p class='tutor-quiz-answer-title'>{$answer->answer_title}</p>";
242 }
243 if ($answer->answer_view_format === 'image' || $answer->answer_view_format === 'text_image'){
244 ?>
245 <div class="quiz-answer-image-wrap">
246 <img src="<?php echo wp_get_attachment_image_url($answer->image_id, 'full') ?>" />
247 </div>
248 <?php
249 }
250 }elseif (intval($answer->image_id)){
251 echo '<img src="'.wp_get_attachment_image_url($answer->image_id, 'full').'" />';
252 }
253 ?>
254 </div>
255 <div class="quiz-answer-matching-droppable"></div>
256 </div>
257 <?php
258 }
259 ?>
260
261 </div>
262 </div>
263 <?php
264 }
265 }
266
267 /**
268 * For Open Ended Question Type
269 */
270 if ($question_type === 'open_ended' || $question_type === 'short_answer'){
271 ?>
272 <textarea class="question_type_<?php echo $question_type; ?>" name="attempt[<?php echo
273 $is_started_quiz->attempt_id; ?>][quiz_question][<?php echo $question->question_id; ?>]"></textarea>
274 <?php
275
276 if ($question_type === 'short_answer'){
277 $characters_limit = tutor_utils()->avalue_dot('short_answer_characters_limit', $quiz_attempt_info);
278 echo '<p class="answer_limit_desc"> characters remaining <span class="characters_remaining">'.$characters_limit.'</span> </p>';
279 }
280
281 }
282
283
284 if ($question_type === 'image_answering'){
285 ?>
286 <div class="quiz-image-answering-wrap">
287 <?php
288 foreach ($answers as $answer){
289 ?>
290 <div class="quiz-image-answering-answer">
291 <?php
292 if (intval($answer->image_id)){
293 ?>
294 <div class="quiz-image-answering-image-wrap">
295 <?php echo '<img src="'.wp_get_attachment_image_url($answer->image_id, 'full').'" />'; ?>
296 </div>
297
298 <div class="quiz-image-answering-input-field-wrap">
299 <input type="text" name="attempt[<?php echo $is_started_quiz->attempt_id; ?>][quiz_question][<?php echo $question->question_id; ?>][answer_id][<?php echo $answer->answer_id; ?>]" >
300 </div>
301 <?php
302 }
303 ?>
304 </div>
305 <?php
306 }
307 ?>
308 </div>
309 <?php
310 }
311 ?>
312 </div>
313
314 <?php
315 if ($question_layout_view !== 'question_below_each_other'){
316 if ($next_question){
317 ?>
318 <div class="quiz-answer-footer-bar">
319 <div class="quiz-footer-button">
320 <button type="button" value="quiz_answer_submit" class="tutor-button
321 tutor-success tutor-quiz-answer-next-btn"><?php _e( 'Answer &amp; Next Question', 'tutor' ); ?></button>
322 </div>
323 </div>
324 <?php
325 }else{
326 ?>
327 <div class="quiz-answer-footer-bar">
328 <div class="quiz-footer-button">
329 <button type="submit" name="quiz_answer_submit_btn" value="quiz_answer_submit" class="tutor-button tutor-success"><?php
330 _e( 'Submit Quiz', 'tutor' ); ?></button>
331 </div>
332 </div>
333 <?php
334 }
335 }
336 ?>
337 </div>
338
339 <?php
340 }
341
342 if ($question_layout_view === 'question_below_each_other'){
343 ?>
344 <div class="quiz-answer-footer-bar">
345 <div class="quiz-footer-button">
346 <button type="submit" name="quiz_answer_submit_btn" value="quiz_answer_submit" class="tutor-button
347 tutor-success"><?php _e( 'Submit Quiz', 'tutor' ); ?></button>
348 </div>
349 </div>
350 <?php } ?>
351
352 </form>
353 </div>
354
355 <?php
356
357 }else{
358 ?>
359 <div class="start-quiz-wrap">
360 <form id="tutor-finish-quiz" method="post">
361 <?php wp_nonce_field( tutor()->nonce_action, tutor()->nonce ); ?>
362
363 <input type="hidden" value="<?php echo get_the_ID(); ?>" name="quiz_id"/>
364 <input type="hidden" value="tutor_finish_quiz_attempt" name="tutor_action"/>
365
366 <button type="submit" class="tutor-button" name="finish_quiz_btn" value="finish_quiz">
367 <i class="icon-floppy"></i> <?php _e( 'Finish', 'tutor' ); ?>
368 </button>
369 </form>
370 </div>
371
372 <?php
373 }
374 }else{
375 if ($attempt_remaining > 0) {
376 ?>
377 <div class="start-quiz-wrap">
378 <form id="tutor-start-quiz" method="post">
379 <?php wp_nonce_field( tutor()->nonce_action, tutor()->nonce ); ?>
380
381 <input type="hidden" value="<?php echo get_the_ID(); ?>" name="quiz_id"/>
382 <input type="hidden" value="tutor_start_quiz" name="tutor_action"/>
383
384 <button type="submit" class="tutor-button" name="start_quiz_btn" value="start_quiz">
385 <i class="icon-hourglass-1"></i> <?php _e( 'Start Quiz', 'tutor' ); ?>
386 </button>
387 </form>
388 </div>
389
390 <?php
391 }
392
393
394
395 if ($previous_attempts){
396 ?>
397 <h4 class="tutor-quiz-attempt-history-title"><?php _e('Previous attempts', 'tutor'); ?></h4>
398
399 <div class="tutor-quiz-attempt-history">
400 <table>
401 <tr>
402 <th><?php _e('Time', 'tutor'); ?></th>
403 <th><?php _e('Questions', 'tutor'); ?></th>
404 <th><?php _e('Total Marks', 'tutor'); ?></th>
405 <th><?php _e('Earned Marks', 'tutor'); ?></th>
406 <th><?php _e('Pass Mark', 'tutor'); ?></th>
407 <th><?php _e('Result', 'tutor'); ?></th>
408 </tr>
409 <?php
410 foreach ( $previous_attempts as $attempt){
411 ?>
412
413 <tr>
414 <td>
415 <?php
416 echo date_i18n(get_option('date_format'), strtotime($attempt->attempt_started_at)).' '.date_i18n(get_option('time_format'), strtotime($attempt->attempt_started_at));
417
418 if ($attempt->is_manually_reviewed){
419 ?>
420 <p class="attempt-reviewed-text">
421 <?php
422 echo __('Manually reviewed at', 'tutor').' <br /> '.date_i18n(get_option('date_format', strtotime($attempt->manually_reviewed_at))).' '.date_i18n(get_option('time_format', strtotime($attempt->manually_reviewed_at)));
423 ?>
424 </p>
425 <?php
426 }
427 ?>
428 </td>
429 <td>
430 <?php echo $attempt->total_questions; ?>
431 </td>
432
433 <td>
434 <?php echo $attempt->total_marks; ?>
435 </td>
436
437 <td>
438 <?php
439 $earned_percentage = $attempt->earned_marks > 0 ? ( number_format(($attempt->earned_marks * 100) / $attempt->total_marks)) : 0;
440 echo $attempt->earned_marks."({$earned_percentage}%)";
441 ?>
442 </td>
443
444 <td>
445 <?php
446
447 $pass_marks = ($attempt->total_marks * $passing_grade) / 100;
448 if ($pass_marks > 0){
449 echo number_format_i18n($pass_marks, 2);
450 }
451 echo "({$passing_grade}%)";
452 ?>
453 </td>
454
455 <td>
456 <?php
457 if ($earned_percentage >= $passing_grade){
458 echo '<span class="result-pass">'.__('Pass', 'tutor').'</span>';
459 }else{
460 echo '<span class="result-fail">'.__('Fail', 'tutor').'</span>';
461 }
462 ?>
463 </td>
464 </tr>
465
466 <?php
467 }
468 ?>
469
470 </table>
471 </div>
472 <?php
473 }
474 }
475 ?>
476 </div>