settings_handler = $settings_handler ?? new Admin_Settings_Handler(); $this->message_manager = $message_manager ?? new Admin_Message_Manager(); $this->page_renderer = $page_renderer ?? new Admin_Page_Renderer(); // Set page properties. $this->page_slug = 'accessibility-audio-tts'; $this->page_title = __( 'Accessibility Audio TTS', 'accessibility-audio-tts-text-to-speech-for-articles' ); $this->menu_title = __( 'A11y Audio TTS', 'accessibility-audio-tts-text-to-speech-for-articles' ); $this->capability = 'manage_options'; parent::__construct(); } /** * Add admin menu. * * @since 1.0.0 * @return void */ public function add_admin_menu(): void { // Disabled to prevent duplicate menu & rendering; Admin_Page_Controller owns the page now. } /** * Render settings page. * * @since 1.0.0 * @return void */ public function render_page(): void { // Disabled to avoid duplicate UI; Admin_Page_Controller renders the page. } /** * Register settings. * * @since 1.0.0 * @return void */ protected function register_settings(): void { // Settings are handled by the settings handler. // This method is required by the abstract class. } /** * Enqueue scripts. * * @since 1.0.0 * @return void */ protected function enqueue_scripts(): void { wp_enqueue_script( 'accessibility-audio-tts-audio-admin-settings', ACCESSIBILITY_AUDIO_TTS_PLUGIN_URL . 'assets/admin/main/admin-main.min.js', array( 'jquery' ), accessibility_audio_tts_get_asset_version( 'assets/admin/main/admin-main.min.js' ), true ); wp_localize_script( 'accessibility-audio-tts-audio-admin-settings', 'accessibilityAudioTtsAdmin', array( 'ajaxUrl' => admin_url( 'admin-ajax.php' ), 'nonce' => wp_create_nonce( 'accessibility_audio_tts_admin_nonce' ), 'strings' => array( 'saving' => __( 'Saving...', 'accessibility-audio-tts-text-to-speech-for-articles' ), 'saved' => __( 'Settings saved!', 'accessibility-audio-tts-text-to-speech-for-articles' ), 'error' => __( 'Error saving settings', 'accessibility-audio-tts-text-to-speech-for-articles' ), ), ) ); } /** * Enqueue styles. * * @since 1.0.0 * @return void */ protected function enqueue_styles(): void { wp_enqueue_style( 'accessibility-audio-tts-audio-admin-settings', ACCESSIBILITY_AUDIO_TTS_PLUGIN_URL . 'assets/admin/admin-compiled.min.css', array(), accessibility_audio_tts_get_asset_version( 'assets/admin/admin-compiled.min.css' ) ); } /** * Prepare template variables. * * @since 1.0.0 * @return array Template variables. */ private function prepare_template_variables(): array { $settings = $this->settings_handler->get_saved_settings(); return array( 'saved_api_key' => $settings['api_key'], 'saved_voices' => $settings['voices'], 'saved_voice_id' => $settings['voice_id'], 'saved_voice_name' => $settings['voice_name'], 'saved_model' => $settings['model'], 'saved_mode' => $settings['mode'], 'saved_post_types' => $settings['post_types'], 'all_post_types' => get_post_types( array( 'public' => true ), 'objects' ), 'saved_chatgpt_api_key' => get_option( 'accessibility_audio_tts_chatgpt_api_key', '' ), 'saved_chatgpt_prompt' => get_option( 'accessibility_audio_tts_chatgpt_prompt', '' ), ); } /** * Render settings form. * * @since 1.0.0 * @param array $template_vars Template variables. * @return void */ private function render_settings_form( array $template_vars ): void { // Include the settings template. $template_path = __DIR__ . '/../templates/admin-page-settings.php'; if ( file_exists( $template_path ) ) { // Avoid extract(); pass variables explicitly. $saved_api_key = $template_vars['saved_api_key'] ?? ''; $saved_voices = $template_vars['saved_voices'] ?? array(); $saved_voice_id = $template_vars['saved_voice_id'] ?? ''; $saved_voice_name = $template_vars['saved_voice_name'] ?? ''; $saved_model = $template_vars['saved_model'] ?? ''; $saved_mode = $template_vars['saved_mode'] ?? ''; $saved_post_types = $template_vars['saved_post_types'] ?? array(); $all_post_types = $template_vars['all_post_types'] ?? array(); $saved_chatgpt_api_key = $template_vars['saved_chatgpt_api_key'] ?? ''; $saved_chatgpt_prompt = $template_vars['saved_chatgpt_prompt'] ?? ''; include $template_path; } } /** * Get admin page URL with optional parameters. * * @since 1.0.0 * @param array $params Optional URL parameters. * @return string Admin page URL. */ public function get_admin_page_url( array $params = array() ): string { $url = admin_url( 'admin.php?page=' . $this->page_slug ); if ( ! empty( $params ) ) { $url .= '&' . http_build_query( $params ); } return esc_url( $url ); } /** * Check if current page is settings page. * * @since 1.0.0 * @return bool True if on settings page. */ public function is_settings_page(): bool { return isset( $_GET['page'] ) && sanitize_text_field( wp_unslash( $_GET['page'] ) ) === $this->page_slug; // phpcs:ignore WordPress.Security.NonceVerification.Recommended } }