This commit is contained in:
Guillaume David 2024-12-26 14:51:11 +01:00
parent dec4529d50
commit 0a7c68beca
8 changed files with 781 additions and 42 deletions

View File

@ -33,6 +33,7 @@
require_once plugin_dir_path(__FILE__) . 'src/admin/views/type/view-type-list.php';
require_once plugin_dir_path(__FILE__) . 'src/admin/views/type/view-type-edit.php';
require_once plugin_dir_path(__FILE__) . 'src/admin/views/race/view-race-list.php';
require_once plugin_dir_path(__FILE__) . 'src/admin/views/member/view-member-list.php';
require_once plugin_dir_path(__FILE__) . 'src/admin/views/race/view-race-edit.php';
require_once plugin_dir_path(__FILE__) . 'src/admin/views/race_user/view-race-user-list.php';
require_once plugin_dir_path(__FILE__) . 'src/admin/views/race_user/view-race-user-edit.php';
@ -52,6 +53,8 @@
require_once plugin_dir_path(__FILE__) . 'src/class/race/Race_User.php';
require_once plugin_dir_path(__FILE__) . 'src/class/race/Race_Material.php';
require_once plugin_dir_path(__FILE__) . 'src/class/race/Race.php';
require_once plugin_dir_path(__FILE__) . 'src/class/member/Member.php';
require_once plugin_dir_path(__FILE__) . 'src/class/season/Season.php';
require_once plugin_dir_path(__FILE__) . 'src/library/functions.php';
require_once plugin_dir_path(__FILE__) . 'src/frontend/cass-shortcode-calendar-global.php';

View File

@ -11,6 +11,7 @@ class CASS_Dashboard_Menu
{
//Options
global $cass_admin_race_list;
global $cass_admin_member_list;
global $cass_admin_race_user_list;
global $cass_admin_race_user_all_courses_list;
global $cass_admin_group_list;
@ -52,6 +53,15 @@ class CASS_Dashboard_Menu
'cass_admin_dashboard'
);
$cass_admin_member_list = add_submenu_page(
'cass-settings',
__('Liste des membres', 'cass-admin-member-list'),
'Liste des membres',
'cass_rl',
'cass-admin-member-list',
'view_member_list_initialisation'
);
$cass_admin_race_list = add_submenu_page(
'cass-settings',
__('Liste des courses', 'cass-admin-race-list'),
@ -227,6 +237,7 @@ class CASS_Dashboard_Menu
add_action("load-$cass_admin_material_list", "cass_admin_material_list");
add_action("load-$cass_admin_season_list", "cass_admin_season_list");
add_action("load-$cass_admin_type_list", "cass_admin_type_list");
}

View File

@ -22,10 +22,18 @@ class CASS_User_Profile_Extention
$cassAddress =get_user_meta($user->ID, 'cassAddress', true);
$cassNPA = get_user_meta($user->ID, 'cassNPA', true);
$cassLocality = get_user_meta($user->ID, 'cassLocality', true);
$cassMemberOfSion = get_user_meta($user->ID, 'cassMemberOfSion', true);
?>
<h3>Club Alpin Suisse de Sion</h3>
<table class="form-table">
<tr>
<th><label for="cassMemberOfSion">Membre de Sion</label></th>
<td>
<input type="checkbox" name="cassMemberOfSion" id="cassMemberOfSion" value="1" <?php if ($cassMemberOfSion == 1) {
echo "checked";
} ?> />
</td>
<tr>
<th><label for="cassMemberNo"> de membre</label></th>
<td>
@ -205,6 +213,7 @@ class CASS_User_Profile_Extention
update_user_meta($user_id, 'cassAddress', SantizeGlobal($_POST['cassAddress']));
update_user_meta($user_id, 'cassNPA', SantizeGlobal($_POST['cassNPA']));
update_user_meta($user_id, 'cassLocality', SantizeGlobal($_POST['cassLocality']));
update_user_meta($user_id, 'cassMemberOfSion', $_POST['cassMemberOfSion']);
}
//No de membre
@ -333,6 +342,28 @@ class CASS_User_Profile_Extention
return $columns;
}
//MemberOfSion
add_filter('manage_users_columns', 'add_cassMemberOfSion');
function add_cassMemberOfSion($columns)
{
$columns['cassMemberOfSion'] = 'Membre de Sion';
return $columns;
}
add_action('manage_users_custom_column', 'add_cassMemberOfSion_column_content', 10, 3);
function add_cassMemberOfSion_column_content($value, $column_name, $user_id)
{
$user = get_userdata($user_id);
if ('cassMemberOfSion' == $column_name) {
if (get_user_meta(intval($user->ID), 'cassMemberOfSion', true) == 1) {
return "Oui";
} else {
return "Non";
}
}
return $value;
}
add_action('manage_users_custom_column', 'add_cassLocality_column_content', 10, 3);
function add_cassLocality_column_content($value, $column_name, $user_id)

View File

@ -0,0 +1,267 @@
<?php
if (!class_exists('WP_List_Table')) {
require_once(ABSPATH . 'wp-admin/includes/class-wp-list-table.php');
}
function view_member_list_initialisation()
{
echo "
<script>
document.addEventListener('DOMContentLoaded', function() {
document.getElementById('bulk-action-selector-top').disabled = true;
document.getElementById('doaction').disabled = true;
document.getElementById('bulk-action-selector-bottom').disabled = true;
document.getElementById('doaction2').disabled = true;
});
</script>
";
$table = new CASS_View_Member_List();
?>
<div class="wrap">
<h2>Liste des membres</h2>
<?php
// Ajouter la boîte de recherche
$table->search_box('Rechercher par nom', 'lastname');
?>
<?php
$table->prepare_items();
echo "<form id='cass-admin-race-list' method='post'>";
$table->display();
echo "</form>";
?>
</div>
<?php
}
class CASS_View_Member_List extends WP_List_Table
{
private $table_data;
function get_columns()
{
$columns = array(
'role' => __('Rôle','role-content'),
'lastname' => __('Nom', 'cass-race-lastname-content'),
'firstname' => __('Prénom', 'cass-race-firstname-content'),
'cassMemberNo' => __('Numéro de membre', 'cass-race-member-no-content'),
'cassLevel' => __('Niveau', 'cass-race-level-content'),
'cassLevelTechSki' => __('Niveau ski', 'cass-race-level-tech-ski-content'),
'cassLevelClimbing' => __('Niveau escalade','cass-race-level-climbing-content'),
'cassLevelMountaineering' => __('Niveau alpinitme', 'cass-race-level-mountaineering-content'),
'cassGroup' => __('Groupe', 'cass-race-group-content'),
'cassTelephone' => __('Téléphone', 'cass-race-telephone-content'),
'cassAddress' => __('Adresse', 'cass-race-address-content'),
'cassNPA' => __('Code postal', 'cass-race-npa-content'),
'cassLocality' => __('Localité', 'cass-race-locality-content'),
'email' => __('Email', 'cass-race-email-content'),
);
return $columns;
}
public function prepare_items($search = '')
{
$search = isset($_POST['s']) ? sanitize_text_field($_POST['s']) : '';
$this->table_data = $this->get_table_data($search);
$columns = $this->get_columns();
$hidden = array();
$sortable = $this->get_sortable_columns();
$this->_column_headers = array(
$this->get_columns(),
array(), // Colonnes masquées
$this->get_sortable_columns()
);
usort($this->table_data, array(&$this, 'usort_reorder'));
$per_page = 20;
$current_page = $this->get_pagenum();
$total_items = count($this->table_data);
// Découper les données pour la pagination
$this->table_data = array_slice($this->table_data, (($current_page - 1) * $per_page), $per_page);
$this->set_pagination_args(
array(
'total_items' => $total_items,
'per_page' => $per_page,
'total_pages' => ceil($total_items / $per_page),
)
);
$this->items = $this->table_data;
}
private function get_table_data($search = '')
{
// Récupérer les données des membres
$members = Member::sqlWPTable();
// Initialiser un tableau pour stocker les données filtrées
$filtered_data = array();
// Parcourir les membres et appliquer le filtre
foreach ($members as $member) {
if (empty($search) || stripos($member->getLastname(), $search) !== false) {
$filtered_data[] = $member;
}
}
// Retourner les données filtrées
return $filtered_data;
}
function column_default($item, $column_name)
{
switch ($column_name) {
case 'role':
return $item->getRole();
case 'lastname':
return $item->getLastname();
case 'firstname':
return $item->getFirstname();
case 'cassMemberNo':
return $item->getCassMemberNo();
case 'cassLevel':
return $item->getCassLevel();
case 'cassLevelTechSki':
return $item->getCassLevelTechSki();
case 'cassLevelClimbing':
return $item->getCassLevelClimbing();
case 'cassLevelMountaineering':
return $item->getCassLevelMountaineering();
case 'cassGroup':
return $item->getCassGroup();
case 'cassTelephone':
return $item->getCassTelephone();
case 'cassAddress':
return $item->getCassAddress();
case 'cassNPA':
return $item->getCassNPA();
case 'cassLocality':
return $item->getCassLocality();
case 'email':
return $item->getEmail();
default:
return ''; // Valeur par défaut pour les colonnes non définies
}
}
public function get_sortable_columns()
{
$sortable_columns = array(
'role' => array('role', false),
'lastname' => array('lastname', true),
'firstname' => array('firstname', false),
'cassMemberNo' => array('cassMemberNo', false),
'cassLevel' => array('cassLevel', false),
'cassLevelTechSki' => array('cassLevelTechSki', false),
'cassLevelClimbing' => array('cassLevelClimbing', false),
'cassLevelMountaineering' => array('cassLevelMountaineering', false),
'cassGroup' => array('cassGroup', false),
'cassTelephone' => array('cassTelephone', false),
'email' => array('email', false),
);
return $sortable_columns;
}
function usort_reorder($a, $b)
{
// Vérifie si une colonne de tri a été spécifiée dans l'URL, sinon utilise 'lastname' par défaut
$orderby = !empty($_GET['orderby']) ? $_GET['orderby'] : 'lastname';
// Vérifie si un ordre a été spécifié dans l'URL, sinon utilise 'asc' par défaut
$order = !empty($_GET['order']) ? $_GET['order'] : 'asc';
// Compare les valeurs des colonnes en fonction de 'orderby'
switch ($orderby) {
case 'lastname':
$result = strcmp($a->getLastname(), $b->getLastname());
break;
case 'firstname':
$result = strcmp($a->getFirstname(), $b->getFirstname());
break;
case 'role':
$result = strcmp($a->getRole(), $b->getRole());
break;
case 'cassMemberNo':
$result = strcmp($a->getCassMemberNo(), $b->getCassMemberNo());
break;
case 'cassLevel':
$result = strcmp($a->getCassLevel(), $b->getCassLevel());
break;
case 'cassLevelTechSki':
$result = strcmp($a->getCassLevelTechSki(), $b->getCassLevelTechSki());
break;
case 'cassLevelClimbing':
$result = strcmp($a->getCassLevelClimbing(), $b->getCassLevelClimbing());
break;
case 'cassLevelMountaineering':
$result = strcmp($a->getCassLevelMountaineering(), $b->getCassLevelMountaineering());
break;
case 'cassGroup':
$result = strcmp($a->getCassGroup(), $b->getCassGroup());
break;
case 'cassTelephone':
$result = strcmp($a->getCassTelephone(), $b->getCassTelephone());
break;
case 'cassAddress':
$result = strcmp($a->getCassAddress(), $b->getCassAddress());
break;
case 'cassNPA':
$result = strcmp($a->getCassNPA(), $b->getCassNPA());
break;
case 'cassLocality':
$result = strcmp($a->getCassLocality(), $b->getCassLocality());
break;
case 'email':
$result = strcmp($a->getEmail(), $b->getEmail());
break;
default:
$result = 0; // Aucun tri si la colonne n'est pas reconnue
break;
}
// Retourne le résultat en fonction de l'ordre spécifié
return ($order === 'asc') ? $result : -$result;
}
function column_lastname($item)
{
$ID_WPUser = $item->getID();
$actions = array(
'allCourses' => sprintf('<a href="' . admin_url() . "admin.php?page=cass-admin-race-user-all-courses-list&element=" . $ID_WPUser . '">Liste de ses courses</a>', $_REQUEST['page'], 'allCourses', $ID_WPUser),
);
return sprintf('%1$s %2$s', ReadGlobal($item->getLastname()), $this->row_actions($actions));
}
function column_firstname($item)
{
return $item->getFirstname();
}
function search_box($text, $input_id)
{
$input_id = $input_id . '-search-input';
echo '<form method="post">';
echo '<p class="search-box">';
echo '<label class="screen-reader-text" for="' . esc_attr($input_id) . '">' . $text . ':</label>';
echo '<input type="search" id="' . esc_attr($input_id) . '" name="s" value="' . esc_attr($_REQUEST['s'] ?? '') . '" />';
echo '<button type="submit" class="button">' . esc_attr($text) . '</button>';
echo '</p>';
echo '</form>';
}
}

View File

@ -65,6 +65,10 @@ function view_race_list_initialisation()
</form>
</div>
";
$table->search_box('Rechercher par Adjoint', 'IDWPUser_Deputy');
$table->search_box('Rechercher par CdC', 'IDWPUser_RL');
}
?>
@ -80,7 +84,7 @@ function view_race_list_initialisation()
<option value="all" <?php echo isset($_POST['IDSeason']) && $_POST['IDSeason'] === 'all' ? 'selected' : ''; ?>>Toutes les saisons</option>
<?php
$season = new Season();
$rows = Season::selectAll();
$selectedValue = isset($_POST['IDSeason']) ? $_POST['IDSeason'] : $season->getCurrentSeason();
@ -127,7 +131,7 @@ class CASS_View_Race_List extends WP_List_Table
'IDWPUser_Deputy' => __('Adjoint', 'cass-race-deputy-content'),
'start' => __('Début', 'cass-race-start-content'),
'end' => __('Fin', 'cass-race-end-content'),
'subscriptionEnable' => __('Ins. activée','cass-race-subscription-enable-content'),
'subscriptionEnable' => __('Ins. activée', 'cass-race-subscription-enable-content'),
'subscriptionStart' => __('Ins. début', 'cass-race-start-content'),
'subscriptionEnd' => __('Ins. fin', 'cass-race-end-content'),
'subscriptionCount' => __('Nbre inscrit', 'cass-race-count-subscribed-content'),
@ -147,7 +151,7 @@ class CASS_View_Race_List extends WP_List_Table
return array(
'delete' => __('Supprimer', 'your-textdomain'),
'open' => __('Ouvrir', 'your-textdomain'),
);
} else {
return null;
@ -161,6 +165,9 @@ class CASS_View_Race_List extends WP_List_Table
//Result of bulk action
$action = $this->current_action();
$search_CdC = isset($_POST['IDWPUser_RL-search-input']) ? $_POST['IDWPUser_RL-search-input'] : '';
$search_Deputy = isset($_POST['IDWPUser_Deputy-search-input']) ? $_POST['IDWPUser_Deputy-search-input'] : '';
$selected_ids = isset($_POST[$this->_args['singular']]) ? $_POST[$this->_args['singular']] : array();
@ -180,7 +187,7 @@ class CASS_View_Race_List extends WP_List_Table
break;
}
$this->table_data = $this->get_table_data();
$this->table_data = $this->get_table_data($search_CdC, $search_Deputy);
$columns = $this->get_columns();
$hidden = array('ID');
@ -210,7 +217,7 @@ class CASS_View_Race_List extends WP_List_Table
}
// Get table data
private function get_table_data()
private function get_table_data($search_CdC, $search_Deputy)
{
global $wpdb;
@ -220,9 +227,11 @@ class CASS_View_Race_List extends WP_List_Table
// Obtenez l'ID de la saison en cours
$currentSeasonID = intval($season->getCurrentSeason());
$results = null;
if (isset($_POST["IDSeason"]) && $_POST["IDSeason"] == "all") {
// Sélectionner toutes les courses
return $wpdb->get_results(
$results = $wpdb->get_results(
"SELECT * from {$table}",
ARRAY_A
@ -234,18 +243,57 @@ class CASS_View_Race_List extends WP_List_Table
$wpdb->prepare("SELECT * FROM {$table} WHERE IDSeason = %d", $IDSeason),
ARRAY_A
);
return $results;
} else {
// Utilisez l'ID de la saison en cours pour filtrer les résultats
$results = $wpdb->get_results(
$wpdb->prepare("SELECT * FROM {$table} WHERE IDSeason = %d", $currentSeasonID),
ARRAY_A
);
return $results;
$results = $wpdb->get_results("SELECT * FROM {$table}", ARRAY_A);
}
//Filter on CdC or Deputy
$filtered_data = array();
// Charger tous les utilisateurs avec le rôle 'CASS_MEMBER'
$args = array(
'role' => 'CASS_MEMBER',
'orderby' => 'user_nicename',
'order' => 'ASC'
);
$users = get_users($args);
for ($i = 0; $i < count($results); $i++) {
$result = $results[$i];
$ItemCdCName = "";
$ItemDeputyName = "";
foreach ($users as $user) {
if ($result['IDWPUser_RL'] == $user->id) {
$ItemCdCName = $user->last_name . " " . $user->first_name;
}
if ($result['IDWPUser_Deputy'] == $user->id) {
$ItemDeputyName = $user->last_name . " " . $user->first_name;
}
}
if($search_CdC != "" && $search_Deputy != ""){
if (strpos($ItemCdCName, $search_CdC) !== false && strpos($ItemDeputyName, $search_Deputy) !== false) {
$filtered_data[] = $result;
}
} else if($search_CdC != ""){
if (strpos($ItemCdCName, $search_CdC) !== false) {
$filtered_data[] = $result;
}
} else if($search_Deputy != ""){
if (strpos($ItemDeputyName, $search_Deputy) !== false) {
$filtered_data[] = $result;
}
} else {
$filtered_data[] = $result;
}
}
return $filtered_data;
}
function column_default($item, $column_name)
@ -280,7 +328,7 @@ class CASS_View_Race_List extends WP_List_Table
$retuned = "";
foreach ($users as $user) {
if ($item[$column_name] == $user->id) {
$retuned = $user->display_name;
$retuned = $user->last_name . " " . $user->first_name;
}
}
return $retuned;
@ -294,7 +342,7 @@ class CASS_View_Race_List extends WP_List_Table
$retuned = "";
foreach ($users as $user) {
if ($item[$column_name] == $user->id) {
$retuned = $user->display_name;
$retuned = $user->last_name . " " . $user->first_name;
}
}
return $retuned;
@ -424,6 +472,19 @@ class CASS_View_Race_List extends WP_List_Table
return sprintf('%1$s %2$s', ReadGlobal($item['name']), $this->row_actions($actions));
}
function search_box($text, $input_id)
{
$input_id = $input_id . '-search-input';
echo '<form method="post">';
echo '<p class="search-box">';
echo '<label class="screen-reader-text" for="' . esc_attr($input_id) . '">' . $text . ':</label>';
echo '<input type="search" id="' . esc_attr($input_id) . '" name="' . esc_attr($input_id) . '" value="' . esc_attr($_REQUEST[$input_id] ?? '') . '" />';
echo '<button type="submit" class="button">' . esc_attr($text) . '</button>';
echo '</p>';
echo '</form>';
}
}

View File

@ -80,6 +80,92 @@ function view_race_user_list_initialisation()
exportParticipantListOfRace(intval($_GET["IDRace"]));
}
//Download model
if (isset($_POST["downloadParticipantMailCSV"]) && intval($_POST["downloadParticipantMailCSV"]) == 1) {
$mails = exportParticipantListOfRaceMailOnly(intval($_GET["IDRace"]));
// Convert emails to a string separated by semicolons
$mails = implode(";", $mails);
// Create the 'cass' folder inside the uploads directory
$directoryCass = 'cass';
$upload_dir = wp_upload_dir();
$upload_path = $upload_dir['basedir'];
$subdirectory_path = $upload_path . '/' . $directoryCass;
if (!file_exists($subdirectory_path)) {
wp_mkdir_p($subdirectory_path);
}
// Path for the CSV file
$modelCSVExportFile = $subdirectory_path . "/" . "participants.csv";
// Create and write the emails into the CSV file
file_put_contents($modelCSVExportFile, $mails);
// Generate the full URL for the file
$url_complet = home_url() . '/wp-content/uploads/' . $directoryCass . '/participants.csv';
// Open the file in a new browser tab
echo "<script>window.open('$url_complet', '_blank');</script>";
}
if (isset($_POST["copyParticipantMail"]) && intval($_POST["copyParticipantMail"]) == 1) {
$mails = exportParticipantListOfRaceMailOnly(intval($_GET["IDRace"]));
// Convertir les mails en une chaîne séparée par des ";"
$mails = implode(";", $mails);
// Générer le script JavaScript pour afficher une modale
echo "<script>
// Création de la modale
const modal = document.createElement('div');
modal.style.position = 'fixed';
modal.style.top = '50%';
modal.style.left = '50%';
modal.style.transform = 'translate(-50%, -50%)';
modal.style.background = '#fff';
modal.style.padding = '20px';
modal.style.border = '1px solid #ccc';
modal.style.boxShadow = '0px 4px 8px rgba(0, 0, 0, 0.2)';
modal.style.zIndex = '1000';
modal.style.width = '400px';
modal.style.textAlign = 'center';
// Contenu de la modale
modal.innerHTML = `
<h3>Liste des e-mails</h3>
<textarea id='emailList' style='width: 100%; height: 100px; margin-bottom: 15px;'>" . $mails . "</textarea>
<div>
<button id='copyButton' style='padding: 10px 15px; margin-right: 10px;'>Copier</button>
<button id='closeButton' style='padding: 10px 15px;'>Fermer</button>
</div>
`;
// Ajout de la modale au document
document.body.appendChild(modal);
// Fonction pour copier dans le presse-papiers
document.getElementById('copyButton').addEventListener('click', async () => {
const text = document.getElementById('emailList').value;
try {
await navigator.clipboard.writeText(text);
alert('La liste des e-mails a été copiée dans le presse-papiers.');
} catch (err) {
alert('Erreur : Impossible de copier les e-mails.');
}
});
// Fonction pour fermer la modale
document.getElementById('closeButton').addEventListener('click', () => {
modal.remove();
});
</script>";
}
$table = new CASS_View_Race_User_List();
?>
@ -94,19 +180,40 @@ function view_race_user_list_initialisation()
<?php echo ReadGlobal($result->name); ?>
</h2>
<form action='<?php echo admin_url() . "admin.php?page=cass-admin-race-user-edit"; ?>' method='POST'>
<input type="hidden" id="stateForm" name="stateForm" value="create">
<input type="hidden" id="IDRace" name="IDRace" value="<?php echo intval($_GET['IDRace']) ?>">
<button type="submit" class="button-secondary" id="refresh-cache">Ajouter</button>
<a href='<?php echo admin_url() . "admin.php?page=cass-admin-race-list"; ?>' class="button">Retour aux
courses</a>
</form>
<br>
<form action='#' method='post'>
<input type='hidden' id='downloadParticipant' name='downloadParticipant' value='1'>
<button type='submit' class='button-secondary' id='refresh-cache'>Télécharger la liste des participants
</button>
</form>
<?php
// Ajouter la boîte de recherche
$table->search_box('Rechercher par nom', 'lastname');
?>
<div style="display: flex; gap: 10px; align-items: center;">
<form action='<?php echo admin_url() . "admin.php?page=cass-admin-race-user-edit"; ?>' method='POST'>
<input type="hidden" id="stateForm" name="stateForm" value="create">
<input type="hidden" id="IDRace" name="IDRace" value="<?php echo intval($_GET['IDRace']) ?>">
<button type="submit" class="button-secondary" id="refresh-cache">Ajouter</button>
</form>
<form action='<?php echo admin_url() . "admin.php?page=cass-admin-race-list"; ?>' method='get'>
<button type="submit" class="button">Retour aux courses</button>
</form>
<form action='#' method='post'>
<input type='hidden' id='downloadParticipant' name='downloadParticipant' value='1'>
<button type='submit' class='button-secondary' id='refresh-cache'>Télécharger la liste des
participants</button>
</form>
<form action='#' method='post'>
<input type='hidden' id='downloadParticipantMailCSV' name='downloadParticipantMailCSV' value='1'>
<button type='submit' class='button-secondary' id='refresh-cache'>Télécharger les mails des participants
(CSV)</button>
</form>
<form action='#' method='post'>
<input type='hidden' id='copyParticipantMail' name='copyParticipantMail' value='1'>
<button type='submit' class='button-secondary' id='refresh-cache'>Copier les mails des participants</button>
</form>
</div>
<button id='btnOpenModal' hidden
class="modal-open bg-transparent border border-gray-500 hover:border-indigo-500 text-gray-500 hover:text-indigo-500 font-bold py-2 px-4 rounded-full">Validation
@ -240,7 +347,11 @@ class CASS_View_Race_User_List extends WP_List_Table
function prepare_items()
{
$this->table_data = $this->get_table_data();
// Récupérer le paramètre de recherche
$search = isset($_POST['s']) ? sanitize_text_field($_POST['s']) : '';
// Charger les données du tableau
$this->table_data = $this->get_table_data($search);
$columns = $this->get_columns();
$hidden = array();
@ -258,11 +369,9 @@ class CASS_View_Race_User_List extends WP_List_Table
$this->set_pagination_args(
array(
'total_items' => $total_items,
// total number of items
'per_page' => $per_page,
// items to show on a page
'total_pages' => ceil($total_items / $per_page) // use ceil to round up
'total_items' => $total_items, // Nombre total d'éléments
'per_page' => $per_page, // Nombre d'éléments par page
'total_pages' => ceil($total_items / $per_page), // Total des pages
)
);
@ -270,12 +379,53 @@ class CASS_View_Race_User_List extends WP_List_Table
}
// Get table data
private function get_table_data()
private function get_table_data($search = '')
{
global $wpdb;
$race_user = new Race_User();
return $race_user->sqlWPTableRaceUserPerRace(intval($_GET["IDRace"]));
$data = $race_user->sqlWPTableRaceUserPerRace(intval($_GET["IDRace"]));
// Appliquer le filtre si une recherche est effectuée
if (!empty($search)) {
$filtered_data = [];
// Charger tous les utilisateurs avec le rôle 'CASS_MEMBER'
$args = array(
'role' => 'CASS_MEMBER',
'orderby' => 'user_nicename',
'order' => 'ASC'
);
$users = get_users($args);
// Préparer un tableau pour faire correspondre les IDs aux noms
$user_map = [];
foreach ($users as $user) {
$user_map[$user->id] = $user->user_lastname; // Associe l'ID utilisateur au nom
}
// Parcourir les données et appliquer le filtre
foreach ($data as $item) {
// Vérifiez si l'ID dans 'lastname' correspond à un utilisateur
if (isset($item['lastname']) && isset($user_map[$item['lastname']])) {
$lastname = $user_map[$item['lastname']]; // Obtenez le nom réel
// Ajoutez un journal pour le débogage
echo "<script>console.log('Debug Objects: " . $lastname . " " . $search . "' );</script>";
// Vérifiez si le nom contient le terme recherché
if (stripos($lastname, $search) !== false) {
$filtered_data[] = $item; // Ajoutez l'élément filtré
}
}
}
$data = $filtered_data; // Remplacez $data par les résultats filtrés
}
return $data;
}
function column_default($item, $column_name)
{
switch ($column_name) {
@ -379,10 +529,10 @@ class CASS_View_Race_User_List extends WP_List_Table
?>
<script>
var mailContentParticipiantValidationToMemberObject = "<?php echo str_replace(["\r", "\n"], ['\\r', '\\n'],ReadGlobal($setting->getMailContentParticipiantValidationToMemberObject())); ?>";
var mailContentParticipiantValidationToMember = "<?php echo str_replace(["\r", "\n"], ['\\r', '\\n'],ReadGlobal($setting->getMailContentParticipiantValidationToMember())); ?>";
var mailContentParticipiantExcusationToMemberObject = "<?php echo str_replace(["\r", "\n"], ['\\r', '\\n'],ReadGlobal($setting->getMailContentParticipiantExcusationToMemberObject())); ?>";
var mailContentParticipiantExcusationToMember = "<?php echo str_replace(["\r", "\n"], ['\\r', '\\n'],ReadGlobal($setting->getMailContentParticipiantExcusationToMember())); ?>";
var mailContentParticipiantValidationToMemberObject = "<?php echo str_replace(["\r", "\n"], ['\\r', '\\n'], ReadGlobal($setting->getMailContentParticipiantValidationToMemberObject())); ?>";
var mailContentParticipiantValidationToMember = "<?php echo str_replace(["\r", "\n"], ['\\r', '\\n'], ReadGlobal($setting->getMailContentParticipiantValidationToMember())); ?>";
var mailContentParticipiantExcusationToMemberObject = "<?php echo str_replace(["\r", "\n"], ['\\r', '\\n'], ReadGlobal($setting->getMailContentParticipiantExcusationToMemberObject())); ?>";
var mailContentParticipiantExcusationToMember = "<?php echo str_replace(["\r", "\n"], ['\\r', '\\n'], ReadGlobal($setting->getMailContentParticipiantExcusationToMember())); ?>";
var IDRace = "<?php echo $_GET['IDRace']; ?>";
// The function below will start the confirmation dialog
@ -496,4 +646,20 @@ class CASS_View_Race_User_List extends WP_List_Table
return sprintf('%1$s %2$s', ReadGlobal($lastname), $this->row_actions($actions));
}
// Ajouter un formulaire de recherche au-dessus du tableau
function search_box($text, $input_id)
{
$input_id = $input_id . '-search-input';
echo '<form method="post">';
echo '<p class="search-box">';
echo '<label class="screen-reader-text" for="' . esc_attr($input_id) . '">' . $text . ':</label>';
echo '<input type="search" id="' . esc_attr($input_id) . '" name="s" value="' . esc_attr($_REQUEST['s'] ?? '') . '" />';
echo '<button type="submit" class="button">' . esc_attr($text) . '</button>';
echo '</p>';
echo '</form>';
}
}

164
src/class/member/Member.php Normal file
View File

@ -0,0 +1,164 @@
<?php
class Member
{
private $ID;
private $role;
private $lastname;
private $firstname;
private $email;
private $pseudonyme;
private $cassMemberNo;
private $cassLevel;
private $cassLevelTechSki;
private $cassLevelClimbing;
private $cassLevelMountaineering;
private $cassGroup;
private $cassTelephone;
private $cassAddress;
private $cassNPA;
private $cassLocality;
public function __construct($user_id)
{
// Récupérer les informations de l'utilisateur
$user = get_userdata($user_id);
$this->ID = $user->ID;
$roles = implode(', ', $user->roles); // Récupérer les rôles
if (in_array('CASS_RL', $user->roles)) {
$this->role = 'Chef de course';
} else {
$this->role = 'Membre';
}
$this->lastname = $user->last_name;
$this->firstname = $user->first_name;
$this->email = $user->user_email;
$this->pseudonyme = $user->user_nicename;
// Récupérer les métadonnées
$this->cassMemberNo = sanitize_text_field(get_user_meta($user_id, 'cassMemberNo', true));
$cassLevelId = sanitize_text_field(get_user_meta($user_id, 'cassLevel', true));
$level = new Level();
$level->loadFromId($cassLevelId);
$this->cassLevel = $level->getName();
$cassLevelTechSkiId = sanitize_text_field(get_user_meta($user_id, 'cassLevelTechSki', true));
$levelTechSki = new Level();
$levelTechSki->loadFromId($cassLevelTechSkiId);
$this->cassLevelTechSki = $levelTechSki->getName();
$cassLevelClimbingId = sanitize_text_field(get_user_meta($user_id, 'cassLevelClimbing', true));
$levelClimbing = new Level();
$levelClimbing->loadFromId($cassLevelClimbingId);
$this->cassLevelClimbing = $levelClimbing->getName();
$cassLevelMountaineeringId = sanitize_text_field(get_user_meta($user_id, 'cassLevelMountaineering', true));
$levelMountaineering = new Level();
$levelMountaineering->loadFromId($cassLevelMountaineeringId);
$this->cassLevelMountaineering = $levelMountaineering->getName();
$GroupID = sanitize_text_field(get_user_meta($user_id, 'cassGroup', true));
// Récupérer le nom du groupe
$group = new Group();
$group->loadFromId($GroupID);
$this->cassGroup = $group->getName();
$this->cassTelephone = sanitize_text_field(get_user_meta($user_id, 'cassTelephone', true));
$this->cassAddress = sanitize_text_field(get_user_meta($user_id, 'cassAddress', true));
$this->cassNPA = sanitize_text_field(get_user_meta($user_id, 'cassNPA', true));
$this->cassLocality = sanitize_text_field(get_user_meta($user_id, 'cassLocality', true));
}
// Méthode qui récupère la liste des utilisateurs avec leurs métadonnées
public static function sqlWPTable()
{
global $wpdb;
// Argument pour récupérer les utilisateurs avec le rôle 'CASS_MEMBER'
$args = array(
'role' => 'CASS_MEMBER',
'orderby' => 'user_nicename',
'order' => 'ASC'
);
// Récupérer tous les utilisateurs
$users = get_users($args);
$members = [];
// Pour chaque utilisateur, récupérer ses métadonnées et les ajouter à la liste
foreach ($users as $user) {
$members[] = new Member($user->ID);
}
// Retourner la liste des membres
return $members;
}
// Méthodes getter pour chaque propriété
public function getID() {
return $this->ID;
}
public function getRole() {
return $this->role;
}
public function getLastname() {
return $this->lastname;
}
public function getFirstname() {
return $this->firstname;
}
public function getEmail() {
return $this->email;
}
public function getPseudonyme() {
return $this->pseudonyme;
}
public function getCassMemberNo() {
return $this->cassMemberNo;
}
public function getCassLevel() {
return $this->cassLevel;
}
public function getCassLevelTechSki() {
return $this->cassLevelTechSki;
}
public function getCassLevelClimbing() {
return $this->cassLevelClimbing;
}
public function getCassLevelMountaineering() {
return $this->cassLevelMountaineering;
}
public function getCassGroup() {
return $this->cassGroup;
}
public function getCassTelephone() {
return $this->cassTelephone;
}
public function getCassAddress() {
return $this->cassAddress;
}
public function getCassNPA() {
return $this->cassNPA;
}
public function getCassLocality() {
return $this->cassLocality;
}
}

View File

@ -261,6 +261,42 @@ function ReadGlobal($text)
return $text;
}
function exportParticipantListOfRaceMailOnly($IDRace){
global $wpdb;
$mails = [];
$race = new Race();
$race->loadFromId($IDRace);
//Récupération des participants
$sql = "
SELECT IDWPUser FROM cass_race_user WHERE IDRace = %d;
";
$sql = $wpdb->prepare($sql, $IDRace);
$results = $wpdb->get_results($sql);
foreach ($results as $result) {
//Get user meta
$user_meta = get_user_meta($result->IDWPUser);
$args = array(
'role' => 'CASS_MEMBER',
'orderby' => 'user_nicename',
'order' => 'ASC'
);
$users = get_users($args);
$retuned = "";
foreach ($users as $user) {
if ($user->id == $result->IDWPUser) {
$mails[] = $user->user_email;
}
}
}
return $mails;
}
function exportParticipantListOfRace($IDRace)
{