LLMS_Student_Quizzes
Access student quiz attempt data
Description Description
See also See also
- LLMS_Student->quizzes()
Source Source
File: includes/models/model.llms.student.quizzes.php
class LLMS_Student_Quizzes extends LLMS_Abstract_User_Data { /** * Retrieve the number of quiz attempts for a quiz * * @since 3.16.0 * @since 6.0.0 Don't access `LLMS_Query_Quiz_Attempt` properties directly. * * @param int $quiz_id WP Post ID of the quiz. * @return int */ public function count_attempts_by_quiz( $quiz_id ) { $query = new LLMS_Query_Quiz_Attempt( array( 'student_id' => $this->get_id(), 'quiz_id' => $quiz_id, 'per_page' => 1, ) ); return $query->get_found_results(); } /** * Remove Student Quiz attempt by ID * * @since 3.9.0 * @since 3.16.11 Unknown. * * @param int $attempt_id Attempt ID. * @return boolean Returns `true` on success and `false` on error. */ public function delete_attempt( $attempt_id ) { $attempt = $this->get_attempt_by_id( $attempt_id ); return $attempt ? $attempt->delete() : false; } /** * Retrieve quiz data for a student and optionally filter by quiz_id(s) * * @since 3.9.0 * @since 3.16.11 Unknown. * @since 4.21.2 Retrieve only attempts for the initialized student. * * @param int[]|Int $quiz Array or single WP_Post ID for quizzes to retrieve attempts for. * @return LLMS_Quiz_Attempt[] Array of quiz attempts for the requested quiz or quizzes. */ public function get_all( $quiz = array() ) { $query = new LLMS_Query_Quiz_Attempt( array( 'quiz_id' => $quiz, 'per_page' => 5000, 'student_id' => $this->get( 'id' ), ) ); /** * Filters the list of quiz attempts for a student * * @since Unknown * * @param int[]|Int $quiz Array or single WP_Post ID for quizzes to retrieve attempts for. */ return apply_filters( 'llms_student_get_quiz_data', $query->get_attempts(), $quiz ); } /** * Retrieve quiz attempts * * @since 3.16.0 * * @param int $quiz_id WP Post ID of the quiz. * @param array $args Additional args to pass to LLMS_Query_Quiz_Attempt. * @return LLMS_Quiz_Attempt[] */ public function get_attempts_by_quiz( $quiz_id, $args = array() ) { $args = wp_parse_args( array( 'student_id' => $this->get_id(), 'quiz_id' => $quiz_id, ), $args ); $query = new LLMS_Query_Quiz_Attempt( $args ); if ( $query->has_results() ) { return $query->get_attempts(); } return array(); } /** * Retrieve an attempt by attempt id * * @since 3.16.0 * @since 4.21.2 Return `false` for invalid IDs & check permissions before returning the attempt. * * @param int $attempt_id Attempt ID. * @return LLMS_Quiz_Attempt|boolean Returns the quiz attempt or `false` if the attempt doesn't exist or * doesn't belong to the initialized student. */ public function get_attempt_by_id( $attempt_id ) { $attempt = new LLMS_Quiz_Attempt( $attempt_id ); // Invalid ID. if ( ! $attempt->exists() || ! current_user_can( 'view_grades', absint( $attempt->get( 'student_id' ) ), absint( $attempt->get( 'quiz_id' ) ) ) ) { return false; } return $attempt; } /** * Decodes an attempt string and returns the associated attempt * * @since 3.9.0 * @since 3.16.0 Unknown. * * @param string $attempt_key Encoded attempt key. * @return LLMS_Quiz_Attempt|false */ public function get_attempt_by_key( $attempt_key ) { $id = $this->parse_attempt_key( $attempt_key ); if ( ! $id ) { return false; } return $this->get_attempt_by_id( $id ); } /** * Get the number of attempts remaining by a student for a given quiz. * * @since 3.16.0 * @since 6.4.0 Added parameter `$allow_negative` to allow remaining negative remaining attempts. * It can happen when the allowed attempts number is decreased to a number lower than * the number of the attempts already made by a given student. * * @param int $quiz_id WP Post ID of the Quiz. * @param bool $allow_negative Allow returning negative remaining attempts. * @return mixed */ public function get_attempts_remaining_for_quiz( $quiz_id, $allow_negative = false ) { $quiz = llms_get_post( $quiz_id ); $ret = _x( 'Unlimited', 'quiz attempts remaining', 'lifterlms' ); if ( $quiz->has_attempt_limit() ) { $allowed = $quiz->get( 'allowed_attempts' ); $used = $this->count_attempts_by_quiz( $quiz->get( 'id' ) ); // Ensure undefined, null, '', etc. show as an int. if ( ! $allowed ) { $allowed = 0; } $remaining = ( $allowed - $used ); // Don't show negative attempts. $ret = $allow_negative ? $remaining : max( 0, $remaining ); } /** * Filters the number of attempts remaining by a student for a given quiz. * * @since 3.16.0 * * @param mixed $ret The number of attempts remaining by a student for a given quiz, * or 'Unlimited' for quizzes with no attempts limit. * @param LLMS_Quiz $quiz Quiz object. * @param LLMS_Student_Quizzes $student_quizzes Student quizzes object. */ return apply_filters( 'llms_student_quiz_attempts_remaining_for_quiz', $ret, $quiz, $this ); } /** * Get all the attempts for a given quiz/lesson from an attempt key * * @since 3.9.0 * * @param string $attempt_key An encoded attempt key. * @return false|array */ public function get_sibling_attempts_by_key( $attempt_key ) { $id = $this->parse_attempt_key( $attempt_key ); if ( ! $id ) { return false; } } /** * Get the quiz attempt with the highest grade for a given quiz and lesson combination * * @since 3.9.0 * @since 3.16.0 Unknown. * * @param int $quiz_id WP Post ID of a Quiz. * @param null $deprecated Deprecated. * @return false|LLMS_Quiz_Attempt */ public function get_best_attempt( $quiz_id = null, $deprecated = null ) { $attempts = $this->get_attempts_by_quiz( $quiz_id, array( 'per_page' => 1, 'sort' => array( 'grade' => 'DESC', 'update_date' => 'DESC', 'id' => 'DESC', ), 'status' => array( 'pass', 'fail' ), ) ); if ( $attempts ) { return $attempts[0]; } return false; } /** * Retrieve the last recorded attempt for a student for a given quiz/lesson * * "Last" is defined as the attempt with the highest attempt number * * @since 3.9.0 * @since 3.16.0 Unknown. * * @param int $quiz_id WP Post ID of the quiz. * @return LLMS_Quiz_Attempt|false */ public function get_last_attempt( $quiz_id ) { $attempts = $this->get_attempts_by_quiz( $quiz_id, array( 'per_page' => 1, 'sort' => array( 'attempt' => 'DESC', ), ) ); if ( $attempts ) { return $attempts[0]; } return false; } /** * Get the last completed attempt for a given quiz or quiz/lesson combination * * @since 3.9.0 * @since 3.16.0 Unknown. * * @param int $quiz_id WP Post ID of a Quiz. * @param int $deprecated Deprecated. * @return false|LLMS_Quiz_Attempt */ public function get_last_completed_attempt( $quiz_id = null, $deprecated = null ) { $query = new LLMS_Query_Quiz_Attempt( array( 'student_id' => $this->get_id(), 'quiz_id' => $quiz_id, 'per_page' => 1, 'status_exclude' => array( 'incomplete' ), 'sort' => array( 'end_date' => 'DESC', 'id' => 'DESC', ), ) ); if ( $query->has_results() ) { return $query->get_attempts()[0]; } return false; } /** * Parse an attempt key into it's parts * * @since 3.9.0 * @since 3.16.7 Unknown. * * @param string $attempt_key An encoded attempt key. * @return int */ private function parse_attempt_key( $attempt_key ) { return LLMS_Hasher::unhash( $attempt_key ); } }
Expand full source code Collapse full source code View on GitHub
Methods Methods
- count_attempts_by_quiz — Retrieve the number of quiz attempts for a quiz
- delete_attempt — Remove Student Quiz attempt by ID
- get_all — Retrieve quiz data for a student and optionally filter by quiz_id(s)
- get_attempt_by_id — Retrieve an attempt by attempt id
- get_attempt_by_key — Decodes an attempt string and returns the associated attempt
- get_attempts_by_quiz — Retrieve quiz attempts
- get_attempts_remaining_for_quiz — Get the number of attempts remaining by a student for a given quiz.
- get_best_attempt — Get the quiz attempt with the highest grade for a given quiz and lesson combination
- get_last_attempt — Retrieve the last recorded attempt for a student for a given quiz/lesson
- get_last_completed_attempt — Get the last completed attempt for a given quiz or quiz/lesson combination
- get_sibling_attempts_by_key — Get all the attempts for a given quiz/lesson from an attempt key
- parse_attempt_key — Parse an attempt key into it's parts
Changelog Changelog
Version | Description |
---|---|
3.9.0 | Introduced. |