diff --git a/compte.php b/compte.php
index 9817bb4..f86a18a 100644
--- a/compte.php
+++ b/compte.php
@@ -335,6 +335,7 @@ $strMetaTitle = fxRemoveHtml(fxUnescape($recPage['pag_titre_' . $strLangue]));
$strMetaDescription = fxRemoveHtml(fxUnescape($recPage['pag_description_' . $strLangue]));
$strMetaKeywords = fxRemoveHtml(fxUnescape($recPage['pag_keywords_' . $strLangue]));
$blnBoutonRetour = true;
+$blnHideCompteTitle = false;
require_once("inc_header.php");
@@ -344,7 +345,7 @@ require_once("inc_header.php");
@@ -361,7 +362,7 @@ require_once("inc_header.php");
}
if (isset($_SESSION['msg'])) {
echo fxMessage($_SESSION['msg'], '', $strLangue);
- } else {
+ } else if (empty($blnHideCompteTitle)) {
?>
.epr-block > .epr-header:not(.inscr-mobile-result-card__head){
- border-radius:0;
+.inscr-mobile-list-anchor{
+ scroll-margin-top:8px;
+}
+
+.inscr-mobile-pager .pagination{
+ margin-bottom:0;
+}
+
+.inscr-mobile-pager .page-link{
+ min-width:38px;
+ text-align:center;
}
diff --git a/inc_footer_scripts.php b/inc_footer_scripts.php
index 8fe6de5..86871f1 100644
--- a/inc_footer_scripts.php
+++ b/inc_footer_scripts.php
@@ -3453,6 +3453,15 @@ if ($strLangue == 'fr') {
if (!moduleInscr) {
return;
}
+ var params = new URLSearchParams(window.location.search);
+ if (params.get('pec_id')) {
+ moduleInscr.scrollIntoView({block: 'start'});
+ } else if (params.get('pg') && parseInt(params.get('pg'), 10) > 1) {
+ var listAnchor = document.getElementById('inscr-mobile-list');
+ if (listAnchor) {
+ listAnchor.scrollIntoView({block: 'start'});
+ }
+ }
moduleInscr.addEventListener('click', function (e) {
var btnToggle = e.target.closest('.epr-block-toggle');
if (!btnToggle || !moduleInscr.contains(btnToggle)) {
diff --git a/inc_tableau_inscriptions_mobile.php b/inc_tableau_inscriptions_mobile.php
index 54984ce..2b0d459 100644
--- a/inc_tableau_inscriptions_mobile.php
+++ b/inc_tableau_inscriptions_mobile.php
@@ -11,7 +11,7 @@ global $objDatabase, $vDomaine, $strLangue;
$intEveId = 0;
if (isset($_GET['promoteur_eve_id'])) {
- $intEveId = (int)base64_decode(urldecode($_GET['promoteur_eve_id']));
+ $intEveId = fxInscrMobileParseEveId($_GET['promoteur_eve_id']);
}
if ($intEveId === 0) {
diff --git a/mobile.php b/mobile.php
index 821c592..d555d87 100644
--- a/mobile.php
+++ b/mobile.php
@@ -29,7 +29,7 @@ if (!isset($_SESSION['com_id'])) {
$intEveId = 0;
if (!empty($_GET['promoteur_eve_id'])) {
- $intEveId = (int)base64_decode(urldecode($_GET['promoteur_eve_id']));
+ $intEveId = fxInscrMobileParseEveId($_GET['promoteur_eve_id']);
}
$tabEveIds = fxInscrMobileGetPromoteurEveIds($_SESSION['com_id']);
diff --git a/php/inc_fx_inscriptions_mobile.php b/php/inc_fx_inscriptions_mobile.php
index f163abd..6efc61b 100644
--- a/php/inc_fx_inscriptions_mobile.php
+++ b/php/inc_fx_inscriptions_mobile.php
@@ -1,8 +1,7 @@
isset($_GET['rech_prenom']) ? trim($_GET['rech_prenom']) : '',
@@ -54,7 +70,12 @@ function fxInscrMobileParseRequest() {
);
if (!empty($_GET['sel_rech_epreuve'])) {
- $arr['sel_rech_epreuve'] = intval(base64_decode(urldecode($_GET['sel_rech_epreuve'])));
+ $decoded = base64_decode(urldecode($_GET['sel_rech_epreuve']), true);
+ if ($decoded !== false && $decoded !== '') {
+ $arr['sel_rech_epreuve'] = intval($decoded);
+ } else {
+ $arr['sel_rech_epreuve'] = intval($_GET['sel_rech_epreuve']);
+ }
}
return $arr;
@@ -74,17 +95,6 @@ function fxInscrMobileFilterActiveCount($arrReq) {
return $int;
}
-function fxInscrMobileShouldShowResults($arrReq) {
- return isset($_GET['btn_recherche'])
- || isset($_GET['pg'])
- || isset($_GET['apply_filters'])
- || $arrReq['rech_prenom'] !== ''
- || $arrReq['rech_nom'] !== ''
- || $arrReq['rech_no_commande'] !== ''
- || $arrReq['rech_nom_equipe'] !== ''
- || fxInscrMobileFilterActiveCount($arrReq) > 0;
-}
-
function fxInscrMobileBuildWhere($intEveId, $arrReq) {
global $objDatabase;
@@ -172,24 +182,12 @@ function fxInscrMobileBibDisplay($arrRow) {
return fxShowBibNumber($arrRow['no_bib'], $arrRow['epr_id'], 'participant');
}
-function fxInscrMobileCollapseToggle($strLangue, $blnCollapsed = true) {
- $strCollapse = ($strLangue === 'fr') ? 'Réduire' : 'Collapse';
- $strExpand = ($strLangue === 'fr') ? 'Développer' : 'Expand';
- $strLabel = $blnCollapsed ? $strExpand : $strCollapse;
- $strIcon = $blnCollapsed ? 'fa-chevron-down' : 'fa-chevron-up';
-
- return '
';
-}
-
-function fxInscrMobileQueryString($arrReq, $intEveId, $arrExtra = array()) {
+/** Paramètres GET pour liens (sans double-encodage). */
+function fxInscrMobileQueryParams($intEveId, $arrReq, $arrExtra = array()) {
$tab = array(
- 'promoteur_eve_id' => urlencode(base64_encode($intEveId)),
+ 'promoteur_eve_id' => base64_encode((string)$intEveId),
);
+
if ($arrReq['rech_prenom'] !== '') {
$tab['rech_prenom'] = $arrReq['rech_prenom'];
}
@@ -209,52 +207,80 @@ function fxInscrMobileQueryString($arrReq, $intEveId, $arrExtra = array()) {
$tab['chk_cancelled'] = 1;
}
if ($arrReq['sel_rech_epreuve'] > 0) {
- $tab['sel_rech_epreuve'] = urlencode(base64_encode($arrReq['sel_rech_epreuve']));
+ $tab['sel_rech_epreuve'] = base64_encode((string)$arrReq['sel_rech_epreuve']);
}
- if (!empty($arrExtra)) {
- $tab = array_merge($tab, $arrExtra);
+ if (!empty($_GET['lng'])) {
+ $tab['lng'] = $_GET['lng'];
+ }
+ if (!empty($arrReq['pg']) && (int)$arrReq['pg'] > 1) {
+ $tab['pg'] = (int)$arrReq['pg'];
}
- return http_build_query($tab, '', '&');
+ foreach ($arrExtra as $strKey => $mixVal) {
+ if ($mixVal === null || $mixVal === '' || ($strKey === 'pec_id' && (int)$mixVal === 0)) {
+ unset($tab[$strKey]);
+ } else {
+ $tab[$strKey] = $mixVal;
+ }
+ }
+
+ return $tab;
+}
+
+function fxInscrMobileBuildUrl($strBaseUrl, $intEveId, $arrReq, $arrExtra = array()) {
+ $tab = fxInscrMobileQueryParams($intEveId, $arrReq, $arrExtra);
+ $strQs = http_build_query($tab, '', '&');
+
+ return $strBaseUrl . ($strQs !== '' ? '?' . $strQs : '');
+}
+
+function fxInscrMobilePaginationUrl($strBaseUrl, $intEveId, $arrReq) {
+ $tab = fxInscrMobileQueryParams($intEveId, $arrReq, array('pec_id' => null));
+ unset($tab['pg'], $tab['pec_id']);
+ $strQs = http_build_query($tab, '', '&');
+
+ return $strBaseUrl . ($strQs !== '' ? '?' . $strQs : '?promoteur_eve_id=' . rawurlencode(base64_encode((string)$intEveId)));
+}
+
+function fxInscrMobileRenderPagination($strBaseUrl, $intEveId, $arrReq, $intTotal, $intPerPage, $intPage) {
+ if ($intTotal <= $intPerPage) {
+ return '';
+ }
+
+ return '';
}
function fxInscrMobileRenderEventPicker($tabEveIds, $strLangue, $strBaseUrl) {
- global $objDatabase, $vDomaine, $vRepertoireFichiers;
+ global $objDatabase;
$strTitle = ($strLangue === 'fr') ? 'Choisir un événement' : 'Choose an event';
- $strHint = ($strLangue === 'fr')
- ? 'Sélectionnez l\'événement pour gérer les inscriptions.'
- : 'Select the event to manage registrations.';
- echo '';
- echo '
' . fxInscrMobileEsc($strHint) . '
';
- echo '
';
+ echo '
';
+ echo '
' . fxInscrMobileEsc($strTitle) . '
';
+ echo '
';
+ echo '
';
}
function fxInscrMobileRenderList($intEveId, $strLangue, $strBaseUrl, $arrReq) {
@@ -263,48 +289,40 @@ function fxInscrMobileRenderList($intEveId, $strLangue, $strBaseUrl, $arrReq) {
$arrEvenement = fxGetEvenementsId($intEveId);
$strEveNom = fxUnescape($arrEvenement['eve_nom_' . $strLangue]);
$intFilterCount = fxInscrMobileFilterActiveCount($arrReq);
- $strQs = fxInscrMobileQueryString($arrReq, $intEveId);
$strBackUrl = fxInscrMobileIsEntry()
? $strBaseUrl
: ($vDomaine . ($strLangue === 'fr' ? '/compte/inc_tableau_promoteur' : '/account/inc_tableau_promoteur')
- . '?promoteur_eve_id=' . urlencode(base64_encode($intEveId)));
+ . '?promoteur_eve_id=' . rawurlencode(base64_encode((string)$intEveId)));
- echo '
';
- echo '';
- afficheTexte('promoteur_back');
- echo '';
+ echo '
';
- echo '';
- echo '
' . fxInscrMobileEsc($strEveNom) . '
';
+ echo '
';
+ echo '
';
+ echo '
';
+ echo '
' . fxInscrMobileEsc(fxInscrMobileT('inscr_mobile_title')) . '
';
+ echo '
' . fxInscrMobileEsc($strEveNom) . '
';
+ echo '
';
- echo '
';
+ // Recherche (repliable — fermée par défaut pour montrer la liste d'abord)
+ echo '
';
+ echo '' . fxInscrMobileEsc(fxInscrMobileT('txt_recherche')) . '
';
+ echo ' ';
- // —— Filtres ——
- $sqlEpreuves = 'SELECT * FROM inscriptions_epreuves e WHERE e.eve_id = ' . intval($intEveId) . ' AND epr_actif = 1 ORDER BY epr_id';
+ // Filtres
global $objDatabase;
- $tabEpreuves = $objDatabase->fxGetResults($sqlEpreuves);
+ $tabEpreuves = $objDatabase->fxGetResults(
+ 'SELECT * FROM inscriptions_epreuves e WHERE e.eve_id = ' . intval($intEveId) . ' AND epr_actif = 1 ORDER BY epr_id'
+ );
- $strFilterBadge = '';
+ $strFilterLabel = fxInscrMobileT('inscr_mobile_filters');
if ($intFilterCount > 0) {
- $strFilterBadge = '';
+ $strFilterLabel .= ' (' . $intFilterCount . ')';
}
- echo '
';
- echo '
';
- echo '';
- echo '
';
- echo '
';
- echo '
';
+ // Liste complète dès l'ouverture
+ $tabRows = fxInscrMobileFetchRows($intEveId, $arrReq);
+ $intNbItemsParPage = 50;
+ $intNbTotal = ($tabRows !== null) ? count($tabRows) : 0;
+ $intPage = 1;
+ $intStart = 1;
+ $intEnd = $intNbItemsParPage;
+ if (!empty($_GET['pg'])) {
+ $intPage = max(1, intval($_GET['pg']));
+ }
+ if (intval($intPage) > 1) {
+ $intStart = ($intPage - 1) * $intNbItemsParPage + 1;
+ $intEnd = $intStart + $intNbItemsParPage - 1;
+ }
+ if ($intEnd > $intNbTotal) {
+ $intEnd = $intNbTotal;
+ }
- // —— Résultats ——
- if (fxInscrMobileShouldShowResults($arrReq)) {
- $tabRows = fxInscrMobileFetchRows($intEveId, $arrReq);
- $intNbItemsParPage = 100;
- $intPage = $arrReq['pg'];
- $intNbTotal = ($tabRows !== null) ? count($tabRows) : 0;
- $intStart = ($intPage > 1) ? (($intPage - 1) * $intNbItemsParPage + 1) : 1;
- $intEnd = min($intStart + $intNbItemsParPage - 1, $intNbTotal);
+ echo '
';
+ echo '
';
+ if ($strLangue === 'fr') {
+ echo '' . (int)$intNbTotal . ' inscription' . ($intNbTotal > 1 ? 's' : '') . '';
+ } else {
+ echo '' . (int)$intNbTotal . ' registration' . ($intNbTotal !== 1 ? 's' : '') . '';
+ }
+ if ($intNbTotal > $intNbItemsParPage) {
+ $intNbPages = (int)ceil($intNbTotal / $intNbItemsParPage);
+ echo '' . ($strLangue === 'fr' ? 'Page ' : 'Page ') . $intPage . ' / ' . $intNbPages . '';
+ }
+ echo '
';
- if ($intNbTotal > 0) {
- $intShown = $intEnd - $intStart + 1;
- $intNbPages = (int)ceil($intNbTotal / $intNbItemsParPage);
- echo '
';
- if ($strLangue === 'fr') {
- echo fxInscrMobileEsc($intShown . ' de ' . $intNbTotal . ' — page ' . $intPage . ' / ' . $intNbPages);
- } else {
- echo fxInscrMobileEsc($intShown . ' of ' . $intNbTotal . ' — page ' . $intPage . ' / ' . $intNbPages);
- }
- echo '
';
+ if ($intNbTotal > 0) {
+ echo '
';
+ for ($j = $intStart; $j <= $intEnd; $j++) {
+ $row = $tabRows[$j];
+ $strFicheUrl = fxInscrMobileBuildUrl($strBaseUrl, $intEveId, $arrReq, array(
+ 'pec_id' => (int)$row['pec_id_original'],
+ 'pg' => $intPage,
+ ));
- for ($j = $intStart; $j <= $intEnd; $j++) {
- $row = $tabRows[$j];
- $strFicheUrl = $strBaseUrl . '?' . fxInscrMobileQueryString($arrReq, $intEveId, array(
- 'pec_id' => $row['pec_id_original'],
- 'pg' => $intPage,
- ));
-
- $strBib = fxInscrMobileBibDisplay($row);
- $strName = fxUnescape($row['par_nom']) . ', ' . fxUnescape($row['par_prenom']);
- $strRace = fxInscrMobileEpreuveLabel($row['epr_id'], $strLangue);
- $strCardClass = 'epr-row inscr-mobile-result-card';
- if ($row['is_cancelled'] == '1') {
- $strCardClass .= ' inscr-mobile-result-card--cancelled';
- }
-
- echo '
';
+ $strBib = fxInscrMobileBibDisplay($row);
+ $strName = fxUnescape($row['par_nom']) . ', ' . fxUnescape($row['par_prenom']);
+ $strRace = fxInscrMobileEpreuveLabel($row['epr_id'], $strLangue);
+ $strCardClass = 'inscr-mobile-list-item';
+ if ($row['is_cancelled'] == '1') {
+ $strCardClass .= ' inscr-mobile-list-item--cancelled';
}
- if ($intNbPages > 1) {
- $strPagQs = fxInscrMobileQueryString($arrReq, $intEveId);
- echo fxGetPagination($strBaseUrl . '?' . $strPagQs, $intNbTotal, $intNbItemsParPage, $intPage);
+ echo '
';
+ echo '';
+ echo '
' . fxInscrMobileEsc($strName) . '
';
+ echo '
' . fxInscrMobileEsc($strRace) . '
';
+ echo '
';
+ echo '';
+ echo '';
}
+ echo '
';
+
+ echo fxInscrMobileRenderPagination($strBaseUrl, $intEveId, $arrReq, $intNbTotal, $intNbItemsParPage, $intPage);
+ } else {
+ echo '
' . fxInscrMobileEsc(fxInscrMobileT('txt_recherche_no_result')) . '
';
}
echo '
';
@@ -447,7 +457,7 @@ function fxInscrMobileRenderList($intEveId, $strLangue, $strBaseUrl, $arrReq) {
function fxInscrMobileRenderFiche($intEveId, $strLangue, $strBaseUrl, $arrReq, $arrRow) {
global $vDomaine;
- $strListUrl = $strBaseUrl . '?' . fxInscrMobileQueryString($arrReq, $intEveId, array('pg' => $arrReq['pg']));
+ $strListUrl = fxInscrMobileBuildUrl($strBaseUrl, $intEveId, $arrReq, array('pec_id' => null, 'pg' => $arrReq['pg']));
$strEveCode = fxGetEvenementsUrl($arrRow['eve_id']);
$strBib = fxInscrMobileBibDisplay($arrRow);
$intParId = $arrRow['par_id'];
@@ -466,72 +476,50 @@ function fxInscrMobileRenderFiche($intEveId, $strLangue, $strBaseUrl, $arrReq, $
$intRemisVal = 1;
}
- echo '
';
- echo '';
- echo afficheTexte('inscr_mobile_back_list', 0);
- echo '';
+ echo '
';
- echo '';
+ echo '
';
+ echo '
';
+ echo '
';
+ echo '
' . fxInscrMobileEsc(fxUnescape($arrRow['par_nom']) . ', ' . fxUnescape($arrRow['par_prenom'])) . '
';
+ echo '
' . fxInscrMobileEsc(fxInscrMobileEpreuveLabel($arrRow['epr_id'], $strLangue)) . '
';
+ echo '
';
- echo '
';
+ echo '
';
+ echo '
' . fxInscrMobileEsc(fxInscrMobileT('inscr_mobile_section_info')) . '
';
+ echo '
';
+ echo '- ' . fxInscrMobileEsc(fxInscrMobileT('rech_no_commande')) . '
- ';
+ echo '' . fxInscrMobileEsc($arrRow['no_commande']) . '
';
+ echo '- ' . fxInscrMobileEsc(fxInscrMobileT('inscr_mobile_details')) . '
- ';
+ echo fxInscrMobileEsc($blnEquipe && fxIsParEquipe($arrRow['pec_id_original'], $arrRow['epr_id'])
+ ? fxInscrMobileT('promoteur_bib_show_teamates') : fxInscrMobileT('epreuve_individuelle'));
+ echo '
';
+ echo '- ' . fxInscrMobileEsc(fxInscrMobileT('inscr_mobile_modified')) . '
- ' . fxCheckMAJ($arrRow['pec_id_original'], $intParId, $strLangue) . '
';
+ echo '
';
- // Informations
- echo '
';
- echo '';
- echo '
';
- echo '- ' . afficheTexte('sel_rech_epreuve', 0) . '
- ' . fxInscrMobileEsc(fxInscrMobileEpreuveLabel($arrRow['epr_id'], $strLangue)) . '
';
- echo '- ' . afficheTexte('inscr_mobile_details', 0) . '
- ';
- if ($blnEquipe && fxIsParEquipe($arrRow['pec_id_original'], $arrRow['epr_id'])) {
- afficheTexte('promoteur_bib_show_teamates', 0);
- } else {
- afficheTexte('epreuve_individuelle', 0);
- }
- echo '
';
- echo '';
- echo '- ' . afficheTexte('inscr_mobile_modified', 0) . '
- ' . fxCheckMAJ($arrRow['pec_id_original'], $intParId, $strLangue) . '
';
- echo '
';
-
- // Dossard
- echo '
';
- echo '';
- echo '
';
- echo '
';
+ echo '
';
+ echo '
' . fxInscrMobileEsc(fxInscrMobileT('promoteur_bib_number')) . '
';
echo '
';
echo '';
echo '';
- echo '
';
+ echo '
';
- // Check-in
- echo '
';
- echo '';
- echo '
';
+ echo '
';
+ echo '
' . fxInscrMobileEsc(fxInscrMobileT('promoteur_bib_enregistre')) . '
';
echo '
';
echo '' . $strRemisIcon . '';
echo '';
- echo '
' . fxInscrMobileEsc($arrRow['no_bib_remis_date']) . '
';
- echo '
' . fxInscrMobileEsc($arrRow['no_bib_remis_par']) . '
';
- echo '
';
+ echo '
' . fxInscrMobileEsc($arrRow['no_bib_remis_date']) . '
';
+ echo '
' . fxInscrMobileEsc($arrRow['no_bib_remis_par']) . '
';
+ echo '
';
- // Actions
$strStyleEdit = $strStyleCancel = '';
$strStyleRetablir = ' d-none';
if ($blnCancelled) {
@@ -539,34 +527,32 @@ function fxInscrMobileRenderFiche($intEveId, $strLangue, $strBaseUrl, $arrReq, $
$strStyleRetablir = '';
}
- echo '
';
- echo '';
- echo '
';
+ echo '
';
+ echo '
' . fxInscrMobileEsc(fxInscrMobileT('inscr_mobile_section_actions')) . '
';
+ echo '
';
echo '';
+ . ' value="' . (int)$arrRow['pec_id_original'] . '">' . fxInscrMobileEsc(fxInscrMobileT('btn_modifierinscriptions')) . '';
echo '';
+ . ' value="' . (int)$arrRow['pec_id_original'] . '">' . fxInscrMobileEsc(fxInscrMobileT('btn_annulerinscriptions')) . '';
echo '';
+ . ' value="' . (int)$arrRow['pec_id_original'] . '">' . fxInscrMobileEsc(fxInscrMobileT('btn_retablirinscriptions')) . '';
$strRenvoi = ($strLangue === 'fr') ? 'RENVOI' : 'RESEND';
- echo '';
- echo '
';
+ echo '
';
echo '
';
}
@@ -577,9 +563,9 @@ function fxInscrMobileRun($intEveId, $strLangue) {
if ($arrReq['pec_id'] > 0) {
$arrRow = fxInscrMobileFetchRowByPec($arrReq['pec_id'], $intEveId);
if ($arrRow === null) {
- echo '
' . afficheTexte('txt_recherche_no_result', 0) . '
';
- echo '
';
- echo afficheTexte('inscr_mobile_back_list', 0) . '';
+ echo '
' . fxInscrMobileEsc(fxInscrMobileT('txt_recherche_no_result')) . '
';
+ echo '
';
+ echo fxInscrMobileEsc(fxInscrMobileT('inscr_mobile_back_list')) . '';
return;
}
fxInscrMobileRenderFiche($intEveId, $strLangue, $strBaseUrl, $arrReq, $arrRow);
diff --git a/php/inc_settings.php b/php/inc_settings.php
index 21b2bb0..5aae130 100644
--- a/php/inc_settings.php
+++ b/php/inc_settings.php
@@ -7,7 +7,7 @@
* Constantes *
*
**************/
-define('_VERSION_CODE', '4.72.670');
+define('_VERSION_CODE', '4.72.671');
define('_DATE_CODE', '2026-06-18');
//MSIN-4290
define('QR_SECRET_KEY', 'ms1_qr_2026_cle_secrete_longue_et_fixe');