getMessage()."\n"); } } else { error_log("Classe {$controller} non trouvée lors de l'enregistrement des routes\n"); } } */ CRVI_Local_Controller::register_routes(); CRVI_Beneficiaire_Controller::register_routes(); CRVI_Traducteur_Controller::register_routes(); CRVI_Intervenant_Controller::register_routes(); CRVI_Departement_Controller::register_routes(); CRVI_Event_Controller::register_routes(); CRVI_Entity_Controller::register_routes(); } public function load_actions() { add_action('init', [self::class, 'register_cpt']); add_action('init', [self::class, 'register_routes']); // Lancer register_routes en même temps que register_cpt add_action('admin_menu', [self::class, 'add_admin_menu']); add_action('admin_post_crvi_import_beneficiaire', [\ESI_CRVI_AGENDA\controllers\CRVI_Beneficiaire_Controller::class, 'import_csv_admin']); add_action('admin_post_crvi_import_local', [\ESI_CRVI_AGENDA\controllers\CRVI_Local_Controller::class, 'import_csv_admin']); add_action('admin_post_crvi_import_traducteur', [\ESI_CRVI_AGENDA\controllers\CRVI_Traducteur_Controller::class, 'import_csv_admin']); add_action('admin_post_crvi_import_intervenant', [\ESI_CRVI_AGENDA\controllers\CRVI_Intervenant_Controller::class, 'import_csv_admin']); add_action('admin_post_crvi_import_departement', [\ESI_CRVI_AGENDA\controllers\CRVI_Departement_Controller::class, 'import_csv_admin']); add_action('admin_post_crvi_import_type_intervention', [\ESI_CRVI_AGENDA\controllers\CRVI_Type_Intervention_Controller::class, 'import_csv_admin']); // Enqueue assets conditionnellement add_action('admin_enqueue_scripts', [self::class, 'enqueue_admin_assets']); add_action('wp_enqueue_scripts', [self::class, 'enqueue_front_assets']); } /** * Ajoute la page d'admin Agenda CRVI avec sous-menus Hub, Stats, Agenda */ public static function add_admin_menu() { // Menu principal : Agenda CRVI (affiche le Hub) add_menu_page( __('Agenda CRVI', 'esi_crvi_agenda'), __('Agenda CRVI', 'esi_crvi_agenda'), 'manage_options', 'crvi_agenda', [CRVI_Main_View::class, 'render_hub_admin_page'], 'dashicons-calendar-alt', 6 ); // Sous-menu : Hub (même callback que le menu principal) add_submenu_page( 'crvi_agenda', __('Hub', 'esi_crvi_agenda'), __('Hub', 'esi_crvi_agenda'), 'manage_options', 'crvi_agenda', [CRVI_Main_View::class, 'render_hub_admin_page'] ); // Sous-menu : Stats add_submenu_page( 'crvi_agenda', __('Stats', 'esi_crvi_agenda'), __('Stats', 'esi_crvi_agenda'), 'manage_options', 'crvi_agenda_stats', [self::class, 'render_stats_page'] ); // Sous-menu : Agenda add_submenu_page( 'crvi_agenda', __('Agenda', 'esi_crvi_agenda'), __('Agenda', 'esi_crvi_agenda'), 'manage_options', 'crvi_agenda_hub', [CRVI_Agenda_View::class, 'render_agenda_page'] ); } /** * Affiche la page d'admin des stats */ public static function render_stats_page() { echo '

' . esc_html__('Statistiques Agenda', 'esi_crvi_agenda') . '

'; $template = plugin_dir_path(__FILE__) . '../../templates/admin/agenda-stats-form.php'; if (file_exists($template)) { include $template; } else { echo '

Template agenda-stats-form.php introuvable.

'; } // Traitement du formulaire (debug) if ($_SERVER['REQUEST_METHOD'] === 'POST' && current_user_can('manage_options')) { $entite = sanitize_text_field($_POST['entite'] ?? 'global'); $annee = isset($_POST['annee']) ? intval($_POST['annee']) : null; $date_debut = sanitize_text_field($_POST['date_debut'] ?? ''); $date_fin = sanitize_text_field($_POST['date_fin'] ?? ''); echo '

'; printf('Debug : entité = %s, année = %s, date_debut = %s, date_fin = %s', esc_html($entite), esc_html((string)$annee), esc_html($date_debut), esc_html($date_fin)); echo '

'; } echo '
'; } public function load_filters() { /* add_filter('rest_endpoints', [self::class, 'register_routes']); */ add_filter('wp_script_attributes', [self::class, 'custom_script_tag'], 10, 2); } public function load_shortcodes() { /* add_shortcode('crvi_agenda', [self::class, 'crvi_agenda_shortcode']); */ } public function load_frontend_assets() { self::enqueue_admin_assets(); self::enqueue_front_assets(); } public function load_admin_assets() { } public function add_pages() { //hub admin } /** * Charge les assets uniquement sur les pages admin CRVI */ public static function enqueue_admin_assets() { // Les slugs des pages admin CRVI $crvi_pages = [ 'crvi_agenda', 'crvi_agenda_stats', 'crvi_agenda_hub', ]; $page = $_GET['page'] ?? ''; if (in_array($page, $crvi_pages, true)) { // Charger Select2 via WordPress wp_enqueue_style('select2', 'https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css', [], '4.0.13'); wp_enqueue_script('select2', 'https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.full.min.js', ['jquery'], '4.0.13', true); // Bundle CSS principal (inclut Bootstrap, Toastr, FullCalendar) wp_enqueue_style('crvi_main_css', ESI_CRVI_AGENDA_URL . 'assets/js/dist/crvi_main_css.min.css', [], '1.0.0'); // Script principal du plugin (inclut Bootstrap, FullCalendar, Toastr) wp_enqueue_script('crvi_main_agenda', ESI_CRVI_AGENDA_URL . 'assets/js/dist/crvi_main.min.js', ['jquery', 'select2'], '1.0.0', true); // Transmettre les permissions utilisateur au JavaScript (seulement si l'utilisateur est connecté) if (did_action('init') && is_user_logged_in()) { $permissions = \ESI_CRVI_AGENDA\helpers\Api_Helper::get_user_permissions(); wp_localize_script('crvi_main_agenda', 'crviPermissions', $permissions); } else { // Permissions par défaut si l'utilisateur n'est pas encore chargé wp_localize_script('crvi_main_agenda', 'crviPermissions', [ 'can_create' => false, 'can_edit' => false, 'can_delete' => false, 'can_close' => false, 'can_view' => false, 'user_roles' => [], 'user_id' => 0, ]); } } } /** * Charge les assets uniquement sur la page publique crvi_agenda_interne */ public static function enqueue_front_assets() { if (is_page('crvi_agenda_interne')) { // Charger Select2 via WordPress wp_enqueue_style('select2', 'https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css', [], '4.0.13'); wp_enqueue_script('select2', 'https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.full.min.js', ['jquery'], '4.0.13', true); // Bundle CSS principal (inclut Bootstrap, Toastr, FullCalendar) wp_enqueue_style('crvi_main_css', ESI_CRVI_AGENDA_URL . 'assets/js/dist/crvi_main_css.min.css', [], '1.0.0'); // Script principal du plugin (inclut Bootstrap, FullCalendar, Toastr) wp_enqueue_script('crvi_main_agenda', ESI_CRVI_AGENDA_URL . 'assets/js/dist/crvi_main.min.js', ['jquery', 'select2'], '1.0.0', true); // Transmettre les permissions utilisateur au JavaScript (seulement si l'utilisateur est connecté) if (did_action('init') && is_user_logged_in()) { $permissions = \ESI_CRVI_AGENDA\helpers\Api_Helper::get_user_permissions(); wp_localize_script('crvi_main_agenda', 'crviPermissions', $permissions); } else { // Permissions par défaut si l'utilisateur n'est pas encore chargé wp_localize_script('crvi_main_agenda', 'crviPermissions', [ 'can_create' => false, 'can_edit' => false, 'can_delete' => false, 'can_close' => false, 'can_view' => false, 'user_roles' => [], 'user_id' => 0, ]); } } } /** * crvi+script loader */ public function custom_script_tag(array $attr) { if('crvi_main_agenda-js' !== $attr['id']) { return $attr; } // Le script est maintenant compilé avec toutes les dépendances, pas besoin de type module // $attr['type'] = 'module'; return $attr; } public static function write_log($message, $level = 'INFO') { $message = self::format_message_for_log($message); $log_entry = sprintf("[%s] [%s] %s\n", date('Y-m-d H:i:s'), $level, $message); error_log($log_entry); } private static function format_message_for_log($message) { if (is_array($message)) { return print_r($message, true); } elseif (is_object($message)) { return print_r($message, true); } elseif (is_bool($message)) { return $message ? 'TRUE' : 'FALSE'; } elseif (is_numeric($message)) { return (string) $message; } elseif (is_null($message)) { return 'NULL'; } else { return var_export($message, true); } } }