MSIN-4470 — Add page numbering functionality to PDF generation for race bibs. Introduce UTF-8 to Windows-1252 text conversion for FPDF compatibility. Update footer and header handling in PDF output. Increment version code.

This commit is contained in:
2026-07-21 17:30:02 -04:00
parent f74fbc3092
commit e85f25c21d
2 changed files with 103 additions and 21 deletions

View File

@ -3710,6 +3710,7 @@ function fxBibStaticFallback($clef) {
'bib_v4_dist_print_empty_epr' => ['fr' => 'Aucun dossard assigné pour cette épreuve.', 'en' => 'No bib assigned for this race.'],
'bib_v4_dist_print_last' => ['fr' => 'Dernière impression : %s — %s', 'en' => 'Last print: %s — %s'],
'bib_v4_dist_print_footer' => ['fr' => 'Imprimé le %s — %s', 'en' => 'Printed on %s — %s'],
'bib_v4_dist_print_page' => ['fr' => 'Page %s / %s', 'en' => 'Page %s / %s'],
];
return $tab[$clef][$lng] ?? '';
@ -9492,6 +9493,18 @@ function fxBibDistPrintTruncate($str, $intMax = 28) {
return substr($str, 0, max(1, $intMax - 1)) . '…';
}
/** MSIN-4470 — Convertit l'UTF-8 vers l'encodage Windows-1252 attendu par les polices FPDF. */
function fxBibDistPrintPdfText($str) {
$str = (string)$str;
if (function_exists('iconv')) {
$strConverted = @iconv('UTF-8', 'Windows-1252//TRANSLIT', $str);
if ($strConverted !== false) {
return $strConverted;
}
}
return utf8_decode($str);
}
/** MSIN-4433 — Génère et envoie le PDF (format lettre). */
function fxBibOutputDistPrintPdf($int_eve_id, $strLangue = 'fr', $strPrintedBy = '') {
global $objDatabase;
@ -9531,29 +9544,47 @@ function fxBibOutputDistPrintPdf($int_eve_id, $strLangue = 'fr', $strPrintedBy =
if (!class_exists('BibDistPrintPdf', false)) {
class BibDistPrintPdf extends FPDF {
public $footerText = '';
public $pageText = 'Page %s / %s';
public $eventTitle = '';
public $documentTitle = '';
public $eprTitle = '';
function Header() {
$this->SetFont('Arial', 'B', 14);
$this->Cell(0, 8, fxBibDistPrintPdfText($this->eventTitle), 0, 1, 'C');
$this->SetFont('Arial', '', 10);
$this->Cell(0, 6, fxBibDistPrintPdfText($this->documentTitle), 0, 1, 'C');
$this->Ln(2);
if ($this->eprTitle !== '') {
$this->SetFont('Arial', 'B', 11);
$this->Cell(0, 7, fxBibDistPrintPdfText($this->eprTitle), 0, 1, 'L');
$this->Ln(1);
}
}
function Footer() {
$this->SetY(-12);
$this->SetFont('Arial', 'I', 7);
$this->Cell(0, 4, utf8_decode($this->footerText), 0, 0, 'L');
$this->Cell(0, 4, utf8_decode('p. ' . $this->PageNo()), 0, 0, 'R');
$this->Cell(0, 4, fxBibDistPrintPdfText($this->footerText), 0, 0, 'L');
$this->SetX($this->lMargin);
$strPage = sprintf($this->pageText, $this->PageNo(), '{nb}');
$this->Cell(0, 4, fxBibDistPrintPdfText($strPage), 0, 0, 'R');
}
}
}
$pdf = new BibDistPrintPdf('P', 'mm', 'letter');
$pdf->footerText = $strFooter;
$pdf->pageText = fxBibTexte('bib_v4_dist_print_page', 0);
$pdf->eventTitle = fxBibDistPrintTruncate($strEventTitle, 80);
$pdf->documentTitle = fxBibTexte('bib_v4_dist_print_title', 0);
$pdf->SetMargins(10, 12, 10);
$pdf->SetAutoPageBreak(true, 14);
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 14);
$pdf->Cell(0, 8, utf8_decode(fxBibDistPrintTruncate($strEventTitle, 80)), 0, 1, 'C');
$pdf->SetFont('Arial', '', 10);
$pdf->Cell(0, 6, utf8_decode(fxBibTexte('bib_v4_dist_print_title', 0)), 0, 1, 'C');
$pdf->Ln(4);
$pdf->AliasNbPages();
$fltPageW = $pdf->GetPageWidth() - 20;
$fltFixedW = 18 + 42 + 42 + 12;
$blnHasPrintedEpreuve = false;
foreach ($tabPanel['epreuves'] as $tabEpr) {
$epr_id = (int)($tabEpr['epr_id'] ?? 0);
@ -9591,21 +9622,22 @@ function fxBibOutputDistPrintPdf($int_eve_id, $strLangue = 'fr', $strPrintedBy =
$fltQTotal = max(0, $fltPageW - $fltFixedW);
$fltQEach = ($intNbQ > 0) ? ($fltQTotal / $intNbQ) : 0;
$pdf->SetFont('Arial', 'B', 11);
$pdf->Cell(0, 7, utf8_decode(fxBibDistPrintTruncate($tabEpr['epr_label'] ?? '', 90)), 0, 1, 'L');
$pdf->Ln(1);
// MSIN-4470 — Chaque épreuve commence sur une page neuve; Header répète les titres.
$pdf->eprTitle = fxBibDistPrintTruncate($tabEpr['epr_label'] ?? '', 90);
$pdf->AddPage();
$blnHasPrintedEpreuve = true;
$tabAnswers = fxBibGetDistPrintQuestionAnswers($epr_id, $tabSelectedQue, $tabParticipants, $strLangue);
$pdf->SetFont('Arial', 'B', 8);
$pdf->SetFillColor(230, 230, 230);
$pdf->Cell(18, 6, utf8_decode(fxBibTexte('bib_v4_dist_print_col_bib', 0)), 1, 0, 'C', true);
$pdf->Cell(42, 6, utf8_decode(fxBibTexte('bib_v4_dist_print_col_nom', 0)), 1, 0, 'L', true);
$pdf->Cell(42, 6, utf8_decode(fxBibTexte('bib_v4_dist_print_col_prenom', 0)), 1, 0, 'L', true);
$pdf->Cell(12, 6, utf8_decode(fxBibTexte('bib_v4_dist_print_col_sexe', 0)), 1, 0, 'C', true);
$pdf->Cell(18, 6, fxBibDistPrintPdfText(fxBibTexte('bib_v4_dist_print_col_bib', 0)), 1, 0, 'C', true);
$pdf->Cell(42, 6, fxBibDistPrintPdfText(fxBibTexte('bib_v4_dist_print_col_nom', 0)), 1, 0, 'L', true);
$pdf->Cell(42, 6, fxBibDistPrintPdfText(fxBibTexte('bib_v4_dist_print_col_prenom', 0)), 1, 0, 'L', true);
$pdf->Cell(12, 6, fxBibDistPrintPdfText(fxBibTexte('bib_v4_dist_print_col_sexe', 0)), 1, 0, 'C', true);
foreach ($tabQueCols as $i => $col) {
$blnLast = ($i === $intNbQ - 1);
$pdf->Cell($fltQEach, 6, utf8_decode(fxBibDistPrintTruncate($col['label'], 22)), 1, $blnLast ? 1 : 0, 'L', true);
$pdf->Cell($fltQEach, 6, fxBibDistPrintPdfText(fxBibDistPrintTruncate($col['label'], 22)), 1, $blnLast ? 1 : 0, 'L', true);
}
if ($intNbQ === 0) {
$pdf->Ln();
@ -9614,15 +9646,15 @@ function fxBibOutputDistPrintPdf($int_eve_id, $strLangue = 'fr', $strPrintedBy =
$pdf->SetFont('Arial', '', 8);
foreach ($tabParticipants as $row) {
$strKey = fxBibDistPrintAnswerKey($row);
$pdf->Cell(18, 5, utf8_decode((string)(int)($row['no_bib'] ?? 0)), 1, 0, 'C');
$pdf->Cell(42, 5, utf8_decode(fxBibDistPrintTruncate($row['par_nom'] ?? '', 24)), 1, 0, 'L');
$pdf->Cell(42, 5, utf8_decode(fxBibDistPrintTruncate($row['par_prenom'] ?? '', 24)), 1, 0, 'L');
$pdf->Cell(12, 5, utf8_decode(fxBibDistPrintSexeLabel($row['par_sexe'] ?? '', $strLangue)), 1, 0, 'C');
$pdf->Cell(18, 5, fxBibDistPrintPdfText((string)(int)($row['no_bib'] ?? 0)), 1, 0, 'C');
$pdf->Cell(42, 5, fxBibDistPrintPdfText(fxBibDistPrintTruncate($row['par_nom'] ?? '', 24)), 1, 0, 'L');
$pdf->Cell(42, 5, fxBibDistPrintPdfText(fxBibDistPrintTruncate($row['par_prenom'] ?? '', 24)), 1, 0, 'L');
$pdf->Cell(12, 5, fxBibDistPrintPdfText(fxBibDistPrintSexeLabel($row['par_sexe'] ?? '', $strLangue)), 1, 0, 'C');
foreach ($tabQueCols as $i => $col) {
$intQueId = (int)$col['que_id'];
$strAns = $tabAnswers[$strKey][$intQueId] ?? '';
$blnLast = ($i === $intNbQ - 1);
$pdf->Cell($fltQEach, 5, utf8_decode(fxBibDistPrintTruncate($strAns, 24)), 1, $blnLast ? 1 : 0, 'L');
$pdf->Cell($fltQEach, 5, fxBibDistPrintPdfText(fxBibDistPrintTruncate($strAns, 24)), 1, $blnLast ? 1 : 0, 'L');
}
if ($intNbQ === 0) {
$pdf->Ln();
@ -9632,6 +9664,10 @@ function fxBibOutputDistPrintPdf($int_eve_id, $strLangue = 'fr', $strPrintedBy =
$pdf->Ln(5);
}
if (!$blnHasPrintedEpreuve) {
$pdf->AddPage();
}
$strFilename = 'distribution-dossards-' . $int_eve_id . '.pdf';
$pdf->Output('I', $strFilename);
}

View File

@ -61,3 +61,49 @@ WHERE NOT EXISTS (
AND current_info.info_langue = src.info_langue
AND current_info.info_prg = 'compte.php'
);
INSERT INTO info (
info_clef,
info_langue,
info_texte,
info_aide,
info_prg,
info_description,
info_trie,
info_actif,
info_option1,
info_option2,
info_option3,
info_creation
)
SELECT
src.info_clef,
src.info_langue,
src.info_texte,
'',
'compte.php',
'MSIN-4470',
0,
1,
'',
'',
'',
NOW()
FROM (
SELECT
'bib_v4_dist_print_page' AS info_clef,
'fr' AS info_langue,
'Page %s / %s' AS info_texte
UNION ALL
SELECT
'bib_v4_dist_print_page',
'en',
'Page %s / %s'
) src
WHERE NOT EXISTS (
SELECT 1
FROM info current_info
WHERE current_info.info_clef = src.info_clef
AND current_info.info_langue = src.info_langue
AND current_info.info_prg = 'compte.php'
);