fix: validation error messages hidden by generic fallback in ErrorHandler::userMessage

ErrorHandler::userMessage only handled RuntimeException, but all validation
throws in ThesisCreateController and ThesisEditController use plain Exception.
This caused user-friendly messages like 'Le champ Nom/Prénom/Pseudo est requis'
to fall through to the 'Une erreur inattendue est survenue…' generic message.

Fix: add Exception check (after PDOException, since PDOException extends it)
so all validation exceptions pass their message through.
This commit is contained in:
Pontoporeia
2026-05-11 17:03:22 +02:00
parent c3f6e8a033
commit df12af8423
6 changed files with 22 additions and 7 deletions

View File

@@ -231,10 +231,10 @@ class ThesisCreateController
*/
public static function autofocusFieldForError(string $message): ?string
{
if (str_contains($message, 'Nom/Prénom/Pseudo')) {
if (str_contains($message, "Auteur·ice")) {
return 'auteurice';
}
if (str_contains($message, 'Titre du mémoire')) {
if (str_contains($message, 'Titre du TFE')) {
return 'titre';
}
if (str_contains($message, 'Synopsis')) {
@@ -302,7 +302,7 @@ class ThesisCreateController
sort($authorNames, SORT_NATURAL);
}
if (empty($authorNames)) {
throw new Exception("Le champ 'Nom/Prénom/Pseudo' est requis.");
throw new Exception("Le champ 'Auteur·ice(s)' est requis.");
}
// contact_interne (backoffice) takes precedence over mail (tfe-info fieldset)
@@ -339,7 +339,7 @@ class ThesisCreateController
throw new Exception('Veuillez sélectionner une finalité.');
}
$titre = $this->validateRequired($this->sanitiseString($post['titre'] ?? ''), 'Titre du mémoire');
$titre = $this->validateRequired($this->sanitiseString($post['titre'] ?? ''), 'Titre du TFE');
$subtitle = $this->sanitiseString($post['subtitle'] ?? '');
$synopsis = $this->validateRequired($this->sanitiseString($post['synopsis'] ?? ''), 'Synopsis');

View File

@@ -171,7 +171,7 @@ class ThesisEditController
$errors = [];
$titre = trim($post['titre'] ?? '');
if ($titre === '') {
$errors[] = 'Le titre est requis.';
$errors[] = 'Le titre du TFE est requis.';
}
$auteurice = trim($post['auteurice'] ?? '');
if ($auteurice === '') {

View File

@@ -70,9 +70,9 @@ class ErrorHandler
return self::pdoMessage($e);
}
// ── Validation errors (RuntimeException, InvalidArgumentException) ──
// ── Validation errors (Exception, RuntimeException) ──────────────
// These are thrown with user-friendly French messages — pass through.
if ($e instanceof \RuntimeException) {
if ($e instanceof \Exception) {
return $e->getMessage();
}