PluginProbe
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses / 4.4.7
LearnPress – WordPress LMS Plugin for Create and Sell Online Courses v4.4.7
4.4.7 4.4.6 4.4.5 4.4.4 4.4.3 4.4.2 4.4.1 4.4.0 4.3.9.1 4.3.9 4.3.8 4.3.7 4.1.6.9 4.1.6.9.1 4.1.6.9.2 4.1.6.9.3 4.1.6.9.4 4.1.7 4.1.7.1 4.1.7.2 4.1.7.3 4.1.7.3.1 4.1.7.3.2 4.2.0 4.2.1 All 138 releases
learnpress / inc / Databases / QuizQuestionsDB.php

QuizQuestionsDB.php in LearnPress – WordPress LMS Plugin for Create and Sell Online Courses 4.4.7, at inc/Databases/QuizQuestionsDB.php

189 lines 4.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace LearnPress\Databases;
4
5 use Exception;
6 use LearnPress\Filters\QuizQuestionsFilter;
7 use LP_Database;
8 use LP_Helper;
9
10 if ( ! defined( 'ABSPATH' ) ) {
11 exit; // Exit if accessed directly
12 }
13
14 /**
15 * Class QuizQuestionsDB
16 *
17 * @since 4.2.9
18 * @version 1.0.1
19 */
20 class QuizQuestionsDB extends DataBase {
21 private static $_instance;
22
23 protected function __construct() {
24 parent::__construct();
25 }
26
27 public static function getInstance() {
28 if ( is_null( self::$_instance ) ) {
29 self::$_instance = new self();
30 }
31
32 return self::$_instance;
33 }
34
35 /**
36 * @throws Exception
37 */
38 public function get_quiz_questions( QuizQuestionsFilter $filter, &$total_rows = 0 ) {
39 $filter->fields = array_merge( $filter->all_fields, $filter->fields );
40
41 if ( empty( $filter->collection ) ) {
42 $filter->collection = $this->tb_lp_quiz_questions;
43 }
44
45 if ( empty( $filter->collection_alias ) ) {
46 $filter->collection_alias = 'qq';
47 }
48
49 // By quiz id
50 if ( ! empty( $filter->quiz_id ) ) {
51 $filter->where[] = $this->wpdb->prepare( "AND {$filter->collection_alias}.quiz_id = %d", $filter->quiz_id );
52 }
53
54 // By question id
55 if ( ! empty( $filter->question_id ) ) {
56 $filter->where[] = $this->wpdb->prepare( "AND {$filter->collection_alias}.question_id = %d", $filter->question_id );
57 }
58
59 // Question ids
60 if ( ! empty( $filter->question_ids ) ) {
61 $question_ids_format = LP_Helper::db_format_array( $filter->question_ids );
62 $filter->where[] = $this->wpdb->prepare( "AND {$filter->collection_alias}.question_id IN (" . $question_ids_format . ')', $filter->question_ids );
63 }
64
65 // Quiz ids
66 if ( ! empty( $filter->quiz_ids ) ) {
67 $quiz_ids_format = LP_Helper::db_format_array( $filter->question_ids );
68 $filter->where[] = $this->wpdb->prepare( "AND {$filter->collection_alias}.quiz_id IN (" . $quiz_ids_format . ')', $filter->quiz_ids );
69 }
70
71 return $this->execute( $filter, $total_rows );
72 }
73
74 /**
75 * Get last item number order on section
76 *
77 * @throws Exception
78 */
79 public function get_last_number_order( int $quiz_id = 0 ): int {
80 $query = $this->wpdb->prepare(
81 "SELECT MAX(question_order)
82 FROM $this->tb_lp_quiz_questions
83 WHERE quiz_id = %d",
84 $quiz_id
85 );
86
87 $number_order = intval( $this->wpdb->get_var( $query ) );
88
89 $this->check_execute_has_error();
90
91 return $number_order;
92 }
93
94 /**
95 * Insert data
96 *
97 * @param array $data
98 *
99 * @return int
100 * @throws Exception
101 * @version 1.0.0
102 * @since 4.2.9
103 */
104 public function insert_data( array $data ): int {
105 $filter = new QuizQuestionsFilter();
106
107 foreach ( $data as $col_name => $value ) {
108 if ( ! in_array( $col_name, $filter->all_fields ) ) {
109 unset( $data[ $col_name ] );
110 }
111 }
112
113 // quiz_question_id is auto increment.
114 unset( $data['quiz_question_id'] );
115
116 $this->wpdb->insert( $this->tb_lp_quiz_questions, $data );
117
118 $this->check_execute_has_error();
119
120 return $this->wpdb->insert_id;
121 }
122
123 /**
124 * Update data
125 *
126 * @param array $data
127 *
128 * @return bool
129 *
130 * @throws Exception
131 * @since 4.2.9
132 * @version 1.0.0
133 */
134 public function update_data( array $data ): bool {
135 if ( empty( $data['quiz_question_id'] ) ) {
136 throw new Exception( __( 'Invalid quiz_question_id!', 'learnpress' ) . ' | ' . __FUNCTION__ );
137 }
138
139 $filter = new QuizQuestionsFilter();
140 $filter->collection = $this->tb_lp_quiz_questions;
141 foreach ( $data as $col_name => $value ) {
142 if ( ! in_array( $col_name, $filter->all_fields ) ) {
143 continue;
144 }
145
146 if ( is_null( $value ) ) {
147 $filter->set[] = $col_name . ' = null';
148 } else {
149 $filter->set[] = $this->wpdb->prepare( $col_name . ' = %s', $value );
150 }
151 }
152
153 $filter->where[] = $this->wpdb->prepare( 'AND quiz_question_id = %d', $data['quiz_question_id'] );
154 $this->update_execute( $filter );
155
156 return true;
157 }
158
159 /**
160 * Update questions position
161 * Update question_order of each item in quiz.
162 *
163 * @throws Exception
164 * @since 4.2.9
165 * @version 1.0.0
166 */
167 public function update_question_position( array $question_ids, $quiz_id ) {
168 $filter = new QuizQuestionsFilter();
169 $filter->collection = $this->tb_lp_quiz_questions;
170 $SET_SQL = 'question_order = CASE';
171
172 foreach ( $question_ids as $position => $question_id ) {
173 ++$position;
174 $question_id = absint( $question_id );
175 if ( empty( $question_id ) ) {
176 continue;
177 }
178
179 $SET_SQL .= $this->wpdb->prepare( ' WHEN question_id = %d THEN %d', $question_id, $position );
180 }
181
182 $SET_SQL .= ' ELSE question_order END';
183 $filter->set[] = $SET_SQL;
184 $filter->where[] = $this->wpdb->prepare( 'AND quiz_id = %d', $quiz_id );
185
186 $this->update_execute( $filter );
187 }
188 }
189