Updates
This commit is contained in:
parent
dec4529d50
commit
0a7c68beca
|
|
@ -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';
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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">N° 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)
|
||||
|
|
|
|||
267
src/admin/views/member/view-member-list.php
Normal file
267
src/admin/views/member/view-member-list.php
Normal 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>';
|
||||
}
|
||||
}
|
||||
|
|
@ -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>';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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
164
src/class/member/Member.php
Normal 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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user