Diff: STRATO-apps/wordpress_03/app/wp-content/plugins/tutor/views/quiz/attempt-table.php
Keine Baseline-Datei – Diff nur gegen leer.
1
-
1
+
<?php
2
+
/**
3
+
* Attempt table
4
+
*
5
+
* @package Tutor\Views
6
+
* @subpackage Tutor\Quiz
7
+
* @author Themeum <support@themeum.com>
8
+
* @link https://themeum.com
9
+
* @since 1.0.0
10
+
*/
11
+
12
+
use Tutor\Models\QuizModel;
13
+
14
+
// Data variable contains $attempt_list, $context.
15
+
extract( $data ); //phpcs:ignore WordPress.PHP.DontExtract.extract_extract
16
+
17
+
$page_key = 'attempt-table';
18
+
$table_columns = include __DIR__ . '/contexts.php';
19
+
$enabled_hide_quiz_details = tutor_utils()->get_option( 'hide_quiz_details' );
20
+
21
+
if ( 'course-single-previous-attempts' == $context && is_array( $attempt_list ) && count( $attempt_list ) ) {
22
+
// Now attempt data is calculated based on the final grade calculation in settings.
23
+
$attempt_data = ( new QuizModel() )->get_quiz_attempt( $quiz_id, $user_id );
24
+
include __DIR__ . '/header.php';
25
+
}
26
+
?>
27
+
28
+
<?php if ( is_array( $attempt_list ) && count( $attempt_list ) ) : ?>
29
+
<div class="tutor-table-responsive tutor-dashboard-list-table <?php echo esc_attr( is_admin() ? '' : 'tutor-table-mobile tutor-mt-32' ); ?>">
30
+
<table class="tutor-table tutor-table-quiz-attempts">
31
+
<thead>
32
+
<tr>
33
+
<?php foreach ( $table_columns as $key => $column ) : ?>
34
+
<?php
35
+
/**
36
+
* Pro feature: Only for frontend
37
+
*
38
+
* @since 2.07
39
+
*/
40
+
if ( 'details' === $key && ! is_admin() && ! current_user_can( 'tutor_instructor' ) && true === $enabled_hide_quiz_details ) {
41
+
continue;
42
+
}
43
+
?>
44
+
45
+
<th><?php echo $column; //phpcs:ignore -- contain safe data ?></th>
46
+
<?php endforeach; ?>
47
+
</tr>
48
+
</thead>
49
+
50
+
<?php
51
+
$attempt_ids = array_column( $attempt_list, 'attempt_id' );
52
+
$answers_array = \Tutor\Models\QuizModel::get_quiz_answers_by_attempt_id( $attempt_ids, true );
53
+
?>
54
+
55
+
<tbody>
56
+
<?php foreach ( $attempt_list as $attempt ) : ?>
57
+
<?php
58
+
$course_id = is_object( $attempt ) && property_exists( $attempt, 'course_id' ) ? $attempt->course_id : 0;
59
+
$answers = isset( $answers_array[ $attempt->attempt_id ] ) ? $answers_array[ $attempt->attempt_id ] : array();
60
+
$earned_percentage = QuizModel::calculate_attempt_earned_percentage( $attempt );
61
+
62
+
$attempt_result = QuizModel::get_attempt_result( $attempt->attempt_id );
63
+
$is_result_pending = QuizModel::RESULT_PENDING === $attempt_result;
64
+
65
+
$correct = 0;
66
+
$incorrect = 0;
67
+
$attempt_id = $attempt->attempt_id;
68
+
69
+
if ( is_array( $answers ) && count( $answers ) > 0 ) {
70
+
foreach ( $answers as $answer ) {
71
+
if ( (bool) $answer->is_correct ) {
72
+
$correct++;
73
+
} elseif ( ! ( null === $answer->is_correct ) ) {
74
+
$incorrect++;
75
+
}
76
+
}
77
+
}
78
+
?>
79
+
<tr>
80
+
<?php foreach ( $table_columns as $key => $column ) : ?>
81
+
<?php
82
+
/**
83
+
* Pro feature: Only for frontend
84
+
*
85
+
* @since 2.07
86
+
*/
87
+
if ( 'details' === $key && ! is_admin() && ! current_user_can( 'tutor_instructor' ) && true === $enabled_hide_quiz_details ) {
88
+
continue;
89
+
}
90
+
?>
91
+
<td data-title="<?php echo esc_attr( $column ); ?>">
92
+
<?php if ( 'checkbox' == $key ) : ?>
93
+
<div class="tutor-d-flex">
94
+
<input id="tutor-admin-list-<?php echo esc_attr( $attempt->attempt_id ); ?>" type="checkbox" class="tutor-form-check-input tutor-bulk-checkbox" name="tutor-bulk-checkbox-all" value="<?php echo esc_attr( $attempt->attempt_id ); ?>" />
95
+
</div>
96
+
<?php elseif ( 'date' == $key ) : ?>
97
+
<?php echo esc_html( date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), strtotime( $attempt->attempt_ended_at ) ) ); ?>
98
+
<?php elseif ( 'quiz_info' == $key ) : ?>
99
+
<div>
100
+
<div class="tutor-fs-7 tutor-fw-normal">
101
+
<?php echo esc_html( date_i18n( get_option( 'date_format' ) . ' ' . get_option( 'time_format' ), strtotime( $attempt->attempt_ended_at ) ) ); ?>
102
+
</div>
103
+
<div class="tutor-mt-4">
104
+
<?php
105
+
// For admin panel.
106
+
if ( is_admin() ) {
107
+
echo esc_html( get_the_title( $attempt->quiz_id ) );
108
+
} else {
109
+
// For frontend.
110
+
echo esc_html( get_the_title( $attempt->quiz_id ) );
111
+
?>
112
+
<div class="tooltip-wrap tooltip-icon-custom" >
113
+
<i class="tutor-icon-circle-info-o tutor-color-muted tutor-ml-4 tutor-fs-7"></i>
114
+
<span class="tooltip-txt tooltip-right">
115
+
<?php echo esc_html( get_the_title( $attempt->course_id ) ); ?>
116
+
</span>
117
+
</div>
118
+
<?php
119
+
}
120
+
?>
121
+
</div>
122
+
<div class="tutor-fs-7 tutor-mt-8">
123
+
<?php
124
+
$attempt_user = get_userdata( $attempt->user_id );
125
+
$user_name = $attempt_user ? $attempt_user->display_name : '';
126
+
?>
127
+
<span class="tutor-color-secondary"><?php esc_html_e( 'Student:', 'tutor' ); ?></span>
128
+
<span class="tutor-fw-normal tutor-color-muted"><?php echo 'backend-dashboard-students-attempts' == $context ? esc_html( $user_name ) : esc_attr( isset( $attempt->display_name ) ? $attempt->display_name : $user_name ); ?></span>
129
+
</div>
130
+
<?php do_action( 'tutor_quiz/table/after/course_title', $attempt, $context ); ?>
131
+
</div>
132
+
<?php elseif ( 'course' == $key ) : ?>
133
+
<?php echo esc_html( get_the_title( $attempt->course_id ) ); ?>
134
+
<?php elseif ( 'question' == $key ) : ?>
135
+
<?php echo esc_html( count( $answers ) ); ?>
136
+
<?php elseif ( 'total_marks' == $key ) : ?>
137
+
<?php echo esc_html( isset( $attempt->total_marks ) ? round( $attempt->total_marks ) : '0' ); ?>
138
+
<?php elseif ( 'correct_answer' == $key ) : ?>
139
+
<?php echo esc_html( $correct ); ?>
140
+
<?php elseif ( 'incorrect_answer' == $key ) : ?>
141
+
<?php echo esc_html( $incorrect ); ?>
142
+
<?php elseif ( 'earned_marks' == $key ) : ?>
143
+
<?php echo esc_html( isset( $attempt->earned_marks ) ? round( $attempt->earned_marks ) . ' (' . $earned_percentage . '%)' : '0 (0%)' ); ?>
144
+
<?php elseif ( 'result' == $key ) : ?>
145
+
<?php
146
+
if ( $is_result_pending ) {
147
+
echo '<span class="tutor-badge-label label-warning">' . esc_html__( 'Pending', 'tutor' ) . '</span>';
148
+
} else {
149
+
echo QuizModel::RESULT_PASS === $attempt_result
150
+
? '<span class="tutor-badge-label label-success">' . esc_html__( 'Pass', 'tutor' ) . '</span>'
151
+
: '<span class="tutor-badge-label label-danger">' . esc_html__( 'Fail', 'tutor' ) . '</span>';
152
+
}
153
+
?>
154
+
<?php elseif ( 'details' == $key ) : ?>
155
+
<?php
156
+
$url_args = array( 'view_quiz_attempt_id' => $attempt->attempt_id );
157
+
$admin_url = add_query_arg( $url_args, admin_url( 'admin.php?page=tutor_quiz_attempts' ) );
158
+
$front_url = add_query_arg( $url_args, tutor()->current_url );
159
+
$url = is_admin() ? $admin_url : $front_url;
160
+
$style = '';
161
+
?>
162
+
<div class="tutor-d-inline-flex tutor-align-center" style="<?php echo esc_attr( ! is_admin() ? $style : '' ); ?>">
163
+
<a href="<?php echo esc_url( $url ); ?>" class="tutor-btn tutor-btn-tertiary tutor-btn-sm">
164
+
<?php
165
+
if ( $is_result_pending && ( 'frontend-dashboard-students-attempts' === $context || 'backend-dashboard-students-attempts' === $context ) ) {
166
+
esc_html_e( 'Review', 'tutor' );
167
+
} else {
168
+
esc_html_e( 'Details', 'tutor' );
169
+
}
170
+
?>
171
+
</a>
172
+
<?php
173
+
$current_page = tutor_utils()->get_current_page_slug();
174
+
if ( ! is_admin() && $course_id && ( tutor_utils()->is_instructor_of_this_course( get_current_user_id(), $course_id ) || current_user_can( 'administrator' ) ) ) :
175
+
?>
176
+
<!-- Don't show delete option on the spotlight section since JS not support -->
177
+
<?php if ( 'quiz-attempts' === $current_page || 'tutor_quiz_attempts' === $current_page ) : ?>
178
+
<a href="#" class="tutor-quiz-attempt-delete tutor-iconic-btn tutor-flex-shrink-0 tutor-ml-4" data-quiz-id="<?php echo esc_attr( $attempt_id ); ?>" data-tutor-modal-target="tutor-common-confirmation-modal">
179
+
<i class="tutor-icon-trash-can-line" data-quiz-id="<?php echo esc_attr( $attempt_id ); ?>"></i>
180
+
</a>
181
+
<?php endif; ?>
182
+
<?php endif; ?>
183
+
</div>
184
+
<?php endif; ?>
185
+
</td>
186
+
<?php endforeach; ?>
187
+
</tr>
188
+
<?php endforeach; ?>
189
+
</tbody>
190
+
</table>
191
+
</div>
192
+
<?php else : ?>
193
+
<?php tutils()->render_list_empty_state(); ?>
194
+
<?php endif; ?>
195
+
<?php
196
+
// Load delete modal.
197
+
tutor_load_template_from_custom_path(
198
+
tutor()->path . 'views/elements/common-confirm-popup.php',
199
+
array(
200
+
'message' => __( 'Would you like to delete Quiz Attempt permanently? We suggest you proceed with caution.', 'tutor' ),
201
+
)
202
+
);
203
+