/home/devfahim/www/fluentlab.devfahim.site/wp-content/plugins/learnpress/inc/Ajax/EditQuizAjax.php
<?php
namespace LearnPress\Ajax;
use Exception;
use LearnPress\Databases\QuizQuestionsDB;
use LearnPress\Models\CourseModel;
use LearnPress\Models\CourseSectionItemModel;
use LearnPress\Models\Question\QuestionAnswerModel;
use LearnPress\Models\Question\QuestionPostFIBModel;
use LearnPress\Models\Question\QuestionPostModel;
use LearnPress\Models\Quiz\QuizQuestionModel;
use LearnPress\Models\QuizPostModel;
use LearnPress\TemplateHooks\Admin\AdminEditQizTemplate;
use LearnPress\TemplateHooks\Admin\AdminEditQuestionTemplate;
use LP_Helper;
use LP_REST_Response;
use Throwable;
/**
* class EditQuizAjax
*
* This class handles the AJAX request to edit the quiz.
*
* @since 4.2.9
* @version 1.0.0
*/
class EditQuizAjax extends AbstractAjax {
/**
* Check permissions and validate parameters.
*
* @throws Exception
*
* @since 4.2.9
* @version 1.0.0
*/
public static function check_valid() {
$params = wp_unslash( $_REQUEST['data'] ?? '' );
if ( empty( $params ) ) {
throw new Exception( 'Error: params invalid!' );
}
$params = LP_Helper::json_decode( $params, true );
$quiz_id = $params['quiz_id'] ?? 0;
$quizPostModel = QuizPostModel::find( $quiz_id, true );
if ( ! $quizPostModel ) {
throw new Exception( __( 'Quiz not found', 'learnpress' ) );
}
$params['quizPostModel'] = $quizPostModel;
return $params;
}
/**
* Create a new question and add it to the quiz.
*
* JS file edit-section.js: function addSection call this method to update the section description.
*
* @since 4.2.9
* @version 1.0.0
*/
public static function create_question_add_to_quiz() {
$response = new LP_REST_Response();
try {
$data = self::check_valid();
/**
* @var QuizPostModel $quizPostModel
*/
$quizPostModel = $data['quizPostModel'];
$quizQuestionModel = $quizPostModel->create_question_and_add( $data );
$questionPostModel = $quizQuestionModel->get_question_post_model();
$html_edit_question = AdminEditQizTemplate::instance()->html_edit_question( $questionPostModel );
$response->data->question = $questionPostModel;
$response->data->html_edit_question = $html_edit_question;
$response->status = 'success';
$response->message = __( 'Question added successfully', 'learnpress' );
} catch ( Throwable $e ) {
$response->message = $e->getMessage();
}
wp_send_json( $response );
}
/**
* Add questions exists (from Question Bank) to quiz.
*
* @since 4.2.9
* @version 1.0.0
*/
public static function add_questions_to_quiz() {
$response = new LP_REST_Response();
try {
$data = self::check_valid();
/**
* @var QuizPostModel $quizPostModel
*/
$quizPostModel = $data['quizPostModel'];
$quiz_id = $quizPostModel->get_id();
$question_ids = $data['question_ids'] ?? [];
if ( empty( $question_ids ) ) {
throw new Exception( __( 'Question IDs are required', 'learnpress' ) );
}
$response->data->html_edit_question = [];
foreach ( $question_ids as $question_id ) {
$questionPostModel = QuestionPostModel::find( $question_id, true );
if ( ! $questionPostModel ) {
throw new Exception( __( 'Question not found', 'learnpress' ) );
}
// Check if question already exists in quiz
$quizQuestionModel = QuizQuestionModel::find( $quiz_id, $question_id );
if ( $quizQuestionModel ) {
continue; // Skip if question already exists in quiz
}
$quizQuestionsDB = QuizQuestionsDB::getInstance();
$max_order = $quizQuestionsDB->get_last_number_order( $quiz_id );
// Add question to quiz
$quizQuestionModel = new QuizQuestionModel();
$quizQuestionModel->quiz_id = $quiz_id;
$quizQuestionModel->question_id = $question_id;
$quizQuestionModel->question_order = $max_order + 1;
$quizQuestionModel->save();
$questionPostModel = $quizQuestionModel->get_question_post_model();
$response->data->html_edit_question[ $question_id ] = AdminEditQizTemplate::instance()->html_edit_question( $questionPostModel );
}
$response->status = 'success';
$response->message = __( 'Question added successfully', 'learnpress' );
} catch ( Throwable $e ) {
$response->message = $e->getMessage();
}
wp_send_json( $response );
}
/**
* Remove question from quiz.
*
* JS file edit-quiz.js: function removeQuestion call this method.
*
* @since 4.2.9
* @version 1.0.0
*/
public static function remove_question_from_quiz() {
$response = new LP_REST_Response();
try {
$data = self::check_valid();
$question_id = $data['question_id'] ?? 0;
$questionPostModel = QuestionPostModel::find( $question_id, true );
if ( ! $questionPostModel ) {
throw new Exception( __( 'Question not found', 'learnpress' ) );
}
/**
* @var QuizPostModel $quizPostModel
*/
$quizPostModel = $data['quizPostModel'];
$quizQuestionModel = QuizQuestionModel::find( $quizPostModel->get_id(), $questionPostModel->get_id() );
if ( ! $quizQuestionModel ) {
throw new Exception( __( 'Question not found in quiz', 'learnpress' ) );
}
// Delete question from quiz
$quizQuestionModel->delete();
$response->status = 'success';
$response->message = __( 'Question removed successfully', 'learnpress' );
} catch ( Throwable $e ) {
$response->message = $e->getMessage();
}
wp_send_json( $response );
}
/**
* Update item on new section and position
*
* $data['course_id'] => ID of course
* $data['items_position'] => list of item id by order on section new
* $data['item_id_change'] => ID of item to change section
* $data['section_id_new_of_item'] => ID of new section of item
* $data['section_id_old_of_item'] => ID of old section of item
*
* JS file edit-section-item.js: function sortAbleItem call this method.
*
* @since 4.2.9
* @version 1.0.0
*/
public static function update_questions_position() {
$response = new LP_REST_Response();
try {
$data = self::check_valid();
$quizPostModel = $data['quizPostModel'];
$question_ids = $data['question_ids'] ?? [];
if ( empty( $question_ids ) ) {
throw new Exception( __( 'Question IDs are required', 'learnpress' ) );
}
QuizQuestionsDB::getInstance()->update_question_position( $question_ids, $quizPostModel->get_id() );
$response->status = 'success';
$response->message = __( 'Question position updated successfully', 'learnpress' );
} catch ( Throwable $e ) {
$response->message = $e->getMessage();
}
wp_send_json( $response );
}
/**
* Add questions created to quiz.
*
* @throws Exception
* @since 4.2.8.6
* @version 1.0.0
*/
public function add_items( array $data ) {
}
}