From 988d744836f16daf10042485e27f06a5c0c42dfc Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Mon, 12 Jul 2021 17:54:08 +0200 Subject: [PATCH] LSformRule: add possibility to throw custom exception to provide error details --- doc/conf/LSattribute/check-data.docbook | 8 ++--- src/includes/class/class.LSform.php | 12 +++---- src/includes/class/class.LSformRule.php | 48 ++++++++++++++++++------- 3 files changed, 46 insertions(+), 22 deletions(-) diff --git a/doc/conf/LSattribute/check-data.docbook b/doc/conf/LSattribute/check-data.docbook index c6c2c5d8..011a9b83 100644 --- a/doc/conf/LSattribute/check-data.docbook +++ b/doc/conf/LSattribute/check-data.docbook @@ -3,14 +3,14 @@ Cette section décrit la manière de configuer des règles de vérification syntaxique sur les données des attributs. Ces règles seront utilisées pour vérifier que les valeurs saisies par un utilisateur dans un formulaire sont correctes. - + Structure... array ( '[regle1]' => array( 'msg' => "[Message d'erreur]", 'params' => array( - // Paramètres de la règle + // Paramètres de la règle ) ), ... @@ -18,7 +18,7 @@ ... -Le paramètre check_data est un tableau associatif +Le paramètre check_data est un tableau associatif dont les clés sont les noms des règles de vérification syntaxique actives et les valeurs associées sont des tableaux associatifs contenant les paramètres des règles. @@ -29,7 +29,7 @@ règles. msg - Le message d'erreur à afficher lors que la règle n'est pas respectée. + Le message d'erreur à afficher lors que la règle n'est pas respectée (optionel). diff --git a/src/includes/class/class.LSform.php b/src/includes/class/class.LSform.php index 8da5dde3..eaf52118 100644 --- a/src/includes/class/class.LSform.php +++ b/src/includes/class/class.LSform.php @@ -395,13 +395,13 @@ class LSform extends LSlog_staticLoggerClass { // Iter on rules and check element values with each of them foreach($this -> _rules[$element] as $rule) { - if ( - !LSformRule :: validate_values( - $rule['name'], $values, $rule['options'], $this -> elements[$element] - ) - ) { + $errors = LSformRule :: validate_values( + $rule['name'], $values, $rule['options'], $this -> elements[$element] + ); + if (is_array($errors)) { $retval = false; - $this -> setElementError($this -> elements[$element], $rule['options']['msg']); + foreach ($errors as $error) + $this -> setElementError($this -> elements[$element], $error); } } } diff --git a/src/includes/class/class.LSformRule.php b/src/includes/class/class.LSformRule.php index 948b64b3..b16c9d88 100644 --- a/src/includes/class/class.LSformRule.php +++ b/src/includes/class/class.LSformRule.php @@ -48,18 +48,32 @@ class LSformRule extends LSlog_staticLoggerClass { // Load PHP class (with error if fail) if (!LSsession :: loadLSclass($rule_class)) { - LSerror :: addErrorCode('LSformRule_02', $rule_name); - return False; + return array( + getFData(_('Invalid syntax checking configuration: unknown rule %{rule}.'), $rule_name) + ); } - if (! $rule_class :: validate_one_by_one) - return $rule_class :: validate($values, $options, $formElement); - - foreach ($values as $value) { - if (!$rule_class :: validate($value, $options, $formElement)) - return False; + $errors = false; + try { + if (! $rule_class :: validate_one_by_one) { + if (!$rule_class :: validate($values, $options, $formElement)) + throw new LSformRuleException(); + } + else { + foreach ($values as $value) { + if (!$rule_class :: validate($value, $options, $formElement)) + throw new LSformRuleException(); + } + } } - return True; + catch (LSformRuleException $e) { + $errors = $e->errors; + $msg = LSconfig :: get('msg', null, null, $options); + if ($msg || !$errors) { + $errors[] = ($msg?__($msg):_('Invalid value')); + } + } + return ($errors?$errors:true); } /** @@ -77,12 +91,22 @@ class LSformRule extends LSlog_staticLoggerClass { } +class LSformRuleException extends Exception { + + public $errors = array(); + + public function __construct($errors=array(), $code = 0, Throwable $previous = null) { + $this -> errors = ensureIsArray($errors); + $message = _("Invalid value"); + if ($this -> errors) + $message .= ': '.implode(", ", $this -> errors); + parent::__construct($message, $code, $previous); + } +} + /** * Error Codes **/ LSerror :: defineError('LSformRule_01', ___("LSformRule_%{type}: Parameter %{param} is not found.") ); -LSerror :: defineError('LSformRule_02', -___("LSformRule: Unknown rule type %{type}.") -);