301 lines
12 KiB
PHP
301 lines
12 KiB
PHP
<?php
|
|
|
|
namespace ESI_CRVI_AGENDA\controllers;
|
|
|
|
use ESI_CRVI_AGENDA\controllers\CRVI_Local_Controller;
|
|
use ESI_CRVI_AGENDA\controllers\CRVI_Beneficiaire_Controller;
|
|
use ESI_CRVI_AGENDA\controllers\CRVI_Intervenant_Controller;
|
|
use ESI_CRVI_AGENDA\controllers\CRVI_Traducteur_Controller;
|
|
use ESI_CRVI_AGENDA\controllers\CRVI_Departement_Controller;
|
|
use ESI_CRVI_AGENDA\controllers\CRVI_Type_Intervention_Controller;
|
|
use ESI_CRVI_AGENDA\models\CRVI_Event_Model;
|
|
use ESI_CRVI_AGENDA\controllers\CRVI_Event_Controller;
|
|
use ESI_CRVI_AGENDA\controllers\CRVI_Entity_Controller;
|
|
use ESI_CRVI_AGENDA\views\CRVI_Main_View;
|
|
use ESI_CRVI_AGENDA\views\CRVI_Agenda_View;
|
|
|
|
class CRVI_Plugin {
|
|
public static function init() {
|
|
// Initialisation du plugin (CPT, hooks, etc.)
|
|
/* add_action('init', [self::class, 'register_cpt']); */
|
|
/* self::register_cpt(); */
|
|
self::load_actions();
|
|
self::load_filters();
|
|
self::load_shortcodes();
|
|
self::load_frontend_assets();
|
|
self::load_admin_assets();
|
|
}
|
|
public static function activate() {
|
|
// Code d'activation (création de tables, etc.)
|
|
|
|
// create table
|
|
CRVI_Event_Model::create_table();
|
|
}
|
|
public static function deactivate() {
|
|
// Code de désactivation (nettoyage, etc.)
|
|
}
|
|
public static function register_cpt() {
|
|
CRVI_Local_Controller::register_cpt();
|
|
CRVI_Beneficiaire_Controller::register_cpt();
|
|
/* CRVI_Intervenant_Controller::register_cpt(); */
|
|
CRVI_Traducteur_Controller::register_cpt();
|
|
|
|
|
|
//register departement et type_intervention
|
|
CRVI_Departement_Controller::register_cpt();
|
|
CRVI_Type_Intervention_Controller::register_cpt();
|
|
}
|
|
|
|
public function register_routes() {
|
|
// Vérification et enregistrement des routes avec gestion d'erreur
|
|
/* $controllers = [
|
|
'CRVI_Local_Controller',
|
|
'CRVI_Beneficiaire_Controller',
|
|
'CRVI_Intervenant_Controller',
|
|
'CRVI_Traducteur_Controller',
|
|
'CRVI_Departement_Controller',
|
|
'CRVI_Event_Controller',
|
|
'CRVI_Entity_Controller'
|
|
];
|
|
|
|
foreach ($controllers as $controller) {
|
|
if (class_exists($controller)) {
|
|
try {
|
|
$controller::register_routes();
|
|
} catch (\Exception $e) {
|
|
error_log("Erreur lors de l'enregistrement des routes pour {$controller}: " . $e->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 '<div class="wrap"><h1>' . esc_html__('Statistiques Agenda', 'esi_crvi_agenda') . '</h1>';
|
|
$template = plugin_dir_path(__FILE__) . '../../templates/admin/agenda-stats-form.php';
|
|
if (file_exists($template)) {
|
|
include $template;
|
|
} else {
|
|
echo '<p style="color:red">Template agenda-stats-form.php introuvable.</p>';
|
|
}
|
|
// 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 '<div class="notice notice-info"><p>';
|
|
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 '</p></div>';
|
|
}
|
|
echo '</div>';
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|