HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //var/www/html/bwcdev/wp-content/plugins/quiz-master-next/php/classes/class-qsm-settings.php
<?php

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * This handles all of the settings data for each individual quiz.
 *
 * @since 5.0.0
 */
class QSM_Quiz_Settings {


	/**
	 * ID of the quiz
	 *
	 * @var int
	 * @since 5.0.0
	 */
	private $quiz_id;

	/**
	 * The settings for the quiz
	 *
	 * @var array
	 * @since 5.0.0
	 */
	private $settings;

	/**
	 * The fields that have been registered
	 *
	 * @var array
	 * @since 5.0.0
	 */
	private $registered_fields;

	/**
	 * Prepares the settings for the supplied quiz
	 *
	 * @since 5.0.0
	 * @param int $quiz_id the ID of the quiz that we are handling the settings data for
	 */
	public function prepare_quiz( $quiz_id ) {
		$this->quiz_id = intval( $quiz_id );
		$this->load_settings();
	}


	/**
	 * Registers a setting be shown on the Options or Text tab
	 *
	 * @since 5.0.0
	 * @param array $field_array An array of the components for the settings field
	 */
	public function register_setting( $field_array, $section = 'quiz_options' ) {
		// Adds field to registered fields
		$field_array = apply_filters( 'qsm_register_settings_before', $field_array );
		$this->registered_fields[ $section ][] = $field_array;
	}

	/**
	 * Retrieves the registered setting fields
	 *
	 * @since 5.0.0
	 * @param string $section The section whose fields that are being retrieved
	 * @return array All the fields registered the the section provided
	 */
	public function load_setting_fields( $section = 'quiz_options' ) {
		// Checks if section exists in registered fields and returns it if it does
		if ( isset( $this->registered_fields[ $section ] ) ) {
			$this->registered_fields[ $section ] = apply_filters( 'qsm_load_setting_fields_before', $this->registered_fields[ $section ] );
			return $this->registered_fields[ $section ];
		} else {
			return false;
		}
	}

	/**
	 * Retrieves a setting value from a section based on name of section and setting
	 *
	 * @since 5.0.0
	 * @param string $section The name of the section the setting is registered in
	 * @param string $setting The name of the setting whose value we need to retrieve
	 * @param mixed  $default What we need to return if no setting exists with given $setting
	 * @return $mixed Value set for $setting or $default if setting does not exist
	 */
	public function get_section_setting( $section, $setting, $default = false ) {
		// Return if section or setting is empty
		if ( empty( $section ) || empty( $setting ) ) {
			return $default;
		}

		// Get settings in section
		$section_settings = $this->get_setting( $section );

		// Return default if section not found
		if ( ! $section_settings ) {
			return $default;
		}

		// Maybe unserailize
		$section_settings = maybe_unserialize( $section_settings );

		// Check if setting exists
		if ( isset( $section_settings[ $setting ] ) ) {
			// Try to unserialize it and then return it
			return maybe_unserialize( $section_settings[ $setting ] );
		} else {
			// Return the default if no setting exists
			return $default;
		}
	}

	/**
	 * Retrieves setting value based on name of setting
	 *
	 * @since 5.0.0
	 * @param string $setting The name of the setting whose value we need to retrieve
	 * @param mixed  $default What we need to return if no setting exists with given $setting
	 * @return $mixed Value set for $setting or $default if setting does not exist
	 */
	public function get_setting( $setting, $default = false ) {
		global $mlwQuizMasterNext;

		// Return if empty
		if ( empty( $setting ) ) {
			return false;
		}

		// Check if ID is not set, for backwards compatibility
		if ( ! $this->quiz_id ) {
			$quiz_id = $mlwQuizMasterNext->quizCreator->get_id();
			// If get_id doesn't work, return false
			if ( ! $quiz_id ) {
				return false;
			} else {
				$this->prepare_quiz( $quiz_id );
			}
		}

		// Check if setting exists
		if ( isset( $this->settings[ $setting ] ) ) {
			// Try to unserialize it and then return it
			return maybe_unserialize( $this->settings[ $setting ] );
		} else {
			// Return the default if no setting exists
			return $default;
		}
	}

	/**
	 * Updates a settings value, adding it if it didn't already exist
	 *
	 * @since 5.0.0
	 * @param string $setting The name of the setting whose value we need to retrieve.
	 * @param mixed  $value The value that needs to be stored for the setting.
	 * @return bool True if successful or false if fails
	 */
	public function update_setting( $setting, $value ) {
		global $mlwQuizMasterNext;

		// Return if empty.
		if ( empty( $setting ) ) {
			$mlwQuizMasterNext->log_manager->add( 'Error when updating setting', 'Setting was empty with value equal to ' . wp_json_encode( $value ), 0, 'error' );
			return false;
		}

		// Check if ID is not set, for backwards compatibility.
		if ( ! $this->quiz_id ) {
			$quiz_id = $mlwQuizMasterNext->quizCreator->get_id();

			// If get_id doesn't work, return false.
			if ( ! $quiz_id ) {
				$mlwQuizMasterNext->log_manager->add( 'Error when updating setting', 'Quiz ID was not found', 0, 'error' );
				return false;
			} else {
				$this->prepare_quiz( $quiz_id );
			}
		}

		$old_value = $this->get_setting( $setting );
		if ( isset( $_POST['global_setting'] ) ) {
            global $globalQuizsetting;
            $setDefaultvalue                                       = $old_value;
			$setDefaultvalue['form_type']                          = $globalQuizsetting['form_type'];
			$setDefaultvalue['system']                             = $globalQuizsetting['system'];
			$setDefaultvalue['correct_answer_logic']               = $globalQuizsetting['correct_answer_logic'];
			$setDefaultvalue['score_roundoff']                     = $globalQuizsetting['score_roundoff'];
			$setDefaultvalue['progress_bar']                       = $globalQuizsetting['progress_bar'];
			$setDefaultvalue['require_log_in']                     = $globalQuizsetting['require_log_in'];
			$setDefaultvalue['pagination']                         = $globalQuizsetting['pagination'];
			$setDefaultvalue['timer_limit']                        = $globalQuizsetting['timer_limit'];
			$setDefaultvalue['enable_result_after_timer_end']      = $globalQuizsetting['enable_result_after_timer_end'];
			$setDefaultvalue['skip_validation_time_expire']        = $globalQuizsetting['skip_validation_time_expire'];
			$setDefaultvalue['total_user_tries']                   = $globalQuizsetting['total_user_tries'];
			$setDefaultvalue['limit_total_entries']                = $globalQuizsetting['limit_total_entries'];
			$setDefaultvalue['question_from_total']                = $globalQuizsetting['question_from_total'];
			$setDefaultvalue['question_per_category']              = $globalQuizsetting['question_per_category'];
			$setDefaultvalue['contact_info_location']              = $globalQuizsetting['contact_info_location'];
			$setDefaultvalue['loggedin_user_contact']              = $globalQuizsetting['loggedin_user_contact'];
			$setDefaultvalue['comment_section']                    = $globalQuizsetting['comment_section'];
			$setDefaultvalue['question_numbering']                 = $globalQuizsetting['question_numbering'];
			$setDefaultvalue['show_optin']                         = $globalQuizsetting['show_optin'];
			$setDefaultvalue['show_text_html']                     = $globalQuizsetting['show_text_html'];
			$setDefaultvalue['store_responses']                    = $globalQuizsetting['store_responses'];
			$setDefaultvalue['send_email']                         = $globalQuizsetting['send_email'];
			$setDefaultvalue['disable_answer_onselect']            = $globalQuizsetting['disable_answer_onselect'];
			$setDefaultvalue['ajax_show_correct']                  = $globalQuizsetting['ajax_show_correct'];
			$setDefaultvalue['contact_disable_autofill']           = $globalQuizsetting['contact_disable_autofill'];
			$setDefaultvalue['form_disable_autofill']              = $globalQuizsetting['form_disable_autofill'];
			$setDefaultvalue['show_category_on_front']             = $globalQuizsetting['show_category_on_front'];
			$setDefaultvalue['enable_quick_result_mc']             = $globalQuizsetting['enable_quick_result_mc'];
			$setDefaultvalue['end_quiz_if_wrong']                  = $globalQuizsetting['end_quiz_if_wrong'];
			$setDefaultvalue['enable_quick_correct_answer_info']   = $globalQuizsetting['enable_quick_correct_answer_info'];
			$setDefaultvalue['enable_retake_quiz_button']          = $globalQuizsetting['enable_retake_quiz_button'];
			$setDefaultvalue['enable_pagination_quiz']             = $globalQuizsetting['enable_pagination_quiz'];
			$setDefaultvalue['enable_deselect_option']             = $globalQuizsetting['enable_deselect_option'];
			$setDefaultvalue['disable_description_on_result']      = $globalQuizsetting['disable_description_on_result'];
			$setDefaultvalue['disable_scroll_next_previous_click'] = $globalQuizsetting['disable_scroll_next_previous_click'];
			$setDefaultvalue['disable_first_page']                 = $globalQuizsetting['disable_first_page'];
			$setDefaultvalue['disable_mathjax']                    = $globalQuizsetting['disable_mathjax'];
			$setDefaultvalue['quiz_animation']                     = $globalQuizsetting['quiz_animation'];
			$setDefaultvalue['result_page_fb_image']               = $globalQuizsetting['result_page_fb_image'];
			$setDefaultvalue['randomness_order']                   = $globalQuizsetting['randomness_order'];
			$setDefaultvalue['scheduled_time_start']               = $globalQuizsetting['scheduled_time_start'];
			$setDefaultvalue['scheduled_time_end']                 = $globalQuizsetting['scheduled_time_end'];
			$setDefaultvalue['not_allow_after_expired_time']       = $globalQuizsetting['not_allow_after_expired_time'];
			$setDefaultvalue['preferred_date_format']              = $globalQuizsetting['preferred_date_format'];
			$setDefaultvalue['default_answers']                    = $globalQuizsetting['default_answers'];
			// Try to serialize the value.
			return $this->save_quiz_settings( $setting, $setDefaultvalue );
		}
		// If the old value and new value are the same, return false.
		if ( $value === $old_value ) {
			return true;
		}
		// Try to serialize the value.
		return $this->save_quiz_settings( $setting, $value );
	}
	/**
	 * Update setting option fdor Quiz
	 *
	 * @since 5.0.0
	 */
	private function save_quiz_settings( $setting, $settingArray ) {
		global $mlwQuizMasterNext;
		$serialized_value = maybe_serialize( $settingArray );
		// Set the new value.
		$this->settings[ $setting ] = $serialized_value;
		// Update the database.
		global $wpdb;
		$results = $wpdb->update(
			$wpdb->prefix . 'mlw_quizzes',
			array( 'quiz_settings' => maybe_serialize( $this->settings ) ),
			array( 'quiz_id' => $this->quiz_id ),
			array( '%s' ),
			array( '%d' )
		);
		if ( false === $results ) {
			$mlwQuizMasterNext->log_manager->add( 'Error when updating setting', $wpdb->last_error . ' from ' . $wpdb->last_query, 0, 'error' );
			return false;
		} else {
			global $wpdb;
			$results = $wpdb->get_results( "SELECT post_id FROM $wpdb->postmeta WHERE meta_value = $this->quiz_id AND meta_key = 'quiz_id'", ARRAY_A );
			if ( ! empty( $results ) ) {
				foreach ( $results as $result ) {
					// update post_modified
					$datetime  = current_time( 'Y-m-d H:i:s', 0 );
					$update = array(
						'ID'            => $result['post_id'],
						'post_modified' => $datetime,
					);
					wp_update_post( $update );
				}
			}
			return true;
		}

	}

	/**
	 * Loads the settings for the quiz
	 *
	 * @since 5.0.0
	 */
	private function load_settings() {
		global $wpdb;
		$settings_array = array();
		// Loads the settings from the database
		$settings = $wpdb->get_var( $wpdb->prepare( "SELECT quiz_settings FROM {$wpdb->prefix}mlw_quizzes WHERE quiz_id=%d", $this->quiz_id ) );

		// unserializes array
		$settings_array = maybe_unserialize( $settings );

		// If the value is not an array, create an empty array
		if ( ! is_array( $settings_array ) ) {
			$settings_array = array();
		}

		// If some options are missing
		if ( ! isset( $settings_array['quiz_options'] ) || ! isset( $settings_array['quiz_text'] ) || ! isset( $settings_array['quiz_leaderboards'] ) ) {
			// Load the old options system
			$quiz_options = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}mlw_quizzes WHERE quiz_id=%d LIMIT 1", $this->quiz_id ) );
			// If no options are present
			if ( ! isset( $settings_array['quiz_options'] ) ) {
				$scheduled_timeframe = maybe_unserialize( $quiz_options->scheduled_timeframe );

				// Sets up older scheduled timeframe settings
				if ( ! is_array( $scheduled_timeframe ) ) {
					$scheduled_timeframe = array(
						'start' => '',
						'end'   => '',
					);
				}
				// Prepares new quiz_options section's settings
				$settings_array['quiz_options'] = maybe_serialize(
					array(
						'system'                  => $quiz_options->quiz_system,
						'loggedin_user_contact'   => $quiz_options->loggedin_user_contact,
						'contact_info_location'   => $quiz_options->contact_info_location,
						'user_name'               => $quiz_options->user_name,
						'user_comp'               => $quiz_options->user_comp,
						'user_email'              => $quiz_options->user_email,
						'user_phone'              => $quiz_options->user_phone,
						'comment_section'         => $quiz_options->comment_section,
						'randomness_order'        => $quiz_options->randomness_order,
						'question_from_total'     => $quiz_options->question_from_total,
						'question_per_category'   => $quiz_options->question_per_category,
						'total_user_tries'        => $quiz_options->total_user_tries,
						'social_media'            => $quiz_options->social_media,
						'pagination'              => $quiz_options->pagination,
						'timer_limit'             => $quiz_options->timer_limit,
						'question_numbering'      => $quiz_options->question_numbering,
						'require_log_in'          => $quiz_options->require_log_in,
						'limit_total_entries'     => $quiz_options->limit_total_entries,
						'scheduled_time_start'    => $scheduled_timeframe['start'],
						'scheduled_time_end'      => $scheduled_timeframe['end'],
						'disable_answer_onselect' => $quiz_options->disable_answer_onselect,
						'ajax_show_correct'       => $quiz_options->ajax_show_correct,
						'preferred_date_format'   => $quiz_options->preferred_date_format,
					)
				);
			}
			// If no text is present
			if ( ! isset( $settings_array['quiz_text'] ) ) {
				$pagination_text = maybe_unserialize( $quiz_options->pagination_text );
				// Sets up older pagination text
				if ( ! is_array( $pagination_text ) ) {
					$pagination_text = array(
						__( 'Previous', 'quiz-master-next' ),
						__( 'Next', 'quiz-master-next' ),
					);
				}

				$social_media_text = maybe_unserialize( $quiz_options->social_media_text );
				// Sets up older social sharing text
				if ( ! is_array( $social_media_text ) ) {
					$social_media_text = array(
						'twitter'  => $quiz_options->social_media_text,
						'facebook' => $quiz_options->social_media_text,
					);
				}

				/**
				 * Prepare Text Option(s)
				 */

				$default_texts = QMNPluginHelper::get_default_texts();
				$start_quiz_text = $default_texts['next_button_text'];
				$form_type = isset( $settings_array['quiz_options']['form_type'] ) ? $settings_array['quiz_options']['form_type'] : '';
				if ( 0 == $form_type ) {
					$start_quiz_text = $default_texts['start_quiz_text'];
				}

				if ( 1 == $form_type ) {
					$start_quiz_text = $default_texts['start_survey_text'];
				}

				// Prepares new quiz_text section's settings
				$settings_array['quiz_text'] = maybe_serialize(
					array(
						'message_before'           => $quiz_options->message_before,
						'message_comment'          => $quiz_options->message_comment,
						'message_end_template'     => $quiz_options->message_end_template,
						'comment_field_text'       => $quiz_options->comment_field_text,
						'question_answer_template' => $quiz_options->question_answer_template,
						'submit_button_text'       => $quiz_options->submit_button_text,
						'name_field_text'          => $quiz_options->name_field_text,
						'business_field_text'      => $quiz_options->business_field_text,
						'email_field_text'         => $quiz_options->email_field_text,
						'phone_field_text'         => $quiz_options->phone_field_text,
						'total_user_tries_text'    => $quiz_options->total_user_tries_text,
						'twitter_sharing_text'     => $social_media_text['twitter'],
						'facebook_sharing_text'    => $social_media_text['facebook'],
						'previous_button_text'     => $pagination_text[0],
						'next_button_text'         => $pagination_text[1],
						'require_log_in_text'      => $quiz_options->require_log_in_text,
						'limit_total_entries_text' => $quiz_options->limit_total_entries_text,
						'scheduled_timeframe_text' => $quiz_options->scheduled_timeframe_text,
						"start_quiz_survey_text"   => $start_quiz_text,
					)
				);
			}
			// If no leadboard is present
			if ( ! isset( $settings_array['quiz_leaderboards'] ) ) {
				$settings_array['quiz_leaderboards'] = maybe_serialize( array( 'template' => $quiz_options->leaderboard_template ) );
			}
			// Update new settings system
			$results = $wpdb->update(
				$wpdb->prefix . 'mlw_quizzes',
				array( 'quiz_settings' => maybe_serialize( $settings_array ) ),
				array( 'quiz_id' => $this->quiz_id ),
				array( '%s' ),
				array( '%d' )
			);
		}
		// Cycle through registered settings
		$registered_fields = $this->registered_fields;
		if ( is_array($registered_fields) ) {
			foreach ( $registered_fields as $section => $fields ) {
				// Check if section exists in settings and, if not, set it to empty array
				if ( ! isset( $settings_array[ $section ] ) ) {
					$settings_array[ $section ] = array();
				}
				$unserialized_section = maybe_unserialize( $settings_array[ $section ] );
				// Cycle through each setting in section
				foreach ( $fields as $field ) {
					// Check if setting exists in section settings and, if not, set it to the default
					if ( ! empty( $field['type'] ) && 'multiple_fields' === $field['type'] ) {
						foreach ( $field['fields'] as $key => $value ) {
							if ( ! isset( $unserialized_section[ $key ] ) ) {
								$unserialized_section[ $key ] = $value['default'];
							}
						}
					} elseif ( ! isset( $unserialized_section[ $field['id'] ] ) ) {
						$unserialized_section[ $field['id'] ] = $field['default'];
					}
				}
				$settings_array[ $section ] = maybe_serialize( $unserialized_section );
			}
		}
		$this->settings = $settings_array;

	}

	/**
	 * Loads the old object model of options for backwards compatibility
	 *
	 * @since 5.0.0
	 */
	public function get_quiz_options() {
		global $wpdb;

		// Load the old options system
		$quiz_options = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}mlw_quizzes WHERE quiz_id=%d LIMIT 1", $this->quiz_id ), ARRAY_A );

		/**
		 * Merges all options and settings
		 */
		$leaderboards = $this->get_setting( 'quiz_leaderboards' );
		if ( is_array( $leaderboards ) ) {
			$quiz_options = array_merge( $quiz_options, $leaderboards );
		}

		$text = $this->get_setting('quiz_text');
		if ( is_array($text) ) {
			$quiz_options = array_merge( $quiz_options, $text );
		}

		$options = $this->get_setting( 'quiz_options' );
		if ( is_array( $options ) ) {
			unset( $options['quiz_name'] );
			$quiz_options = array_merge( $quiz_options, $options );
		}

		// Return as old object model
		return (object) $quiz_options;
	}
}