From 114e3c48ac394f6516b32e7c0f4235bd2aa045da Mon Sep 17 00:00:00 2001 From: Benjamin Renard Date: Mon, 21 Dec 2020 14:53:36 +0100 Subject: [PATCH] LSformRule: add validate_values() method and use it to value rules Also add validate_one_by_one class constant to allow to handle validation on all values together instead of one-by-one. --- src/includes/class/class.LSform.php | 30 +++++++------- src/includes/class/class.LSformRule.php | 52 +++++++++++++++++++++---- 2 files changed, 60 insertions(+), 22 deletions(-) diff --git a/src/includes/class/class.LSform.php b/src/includes/class/class.LSform.php index 82bb739a..6ac7c9a5 100644 --- a/src/includes/class/class.LSform.php +++ b/src/includes/class/class.LSform.php @@ -381,20 +381,22 @@ class LSform extends LSlog_staticLoggerClass { } } - foreach($values as $value) { - if (empty($value)) { - continue; - } - if (!isset($this -> _rules[$element]) || !is_array($this -> _rules[$element])) - continue; - LSsession :: loadLSclass('LSformRule', null, true); - foreach($this -> _rules[$element] as $rule) { - $ruleType="LSformRule_".$rule['name']; - LSsession :: loadLSclass($ruleType); - if (! call_user_func_array(array( $ruleType,'validate') , array($value, $rule['options'], &$this -> elements[$element]))) { - $retval=false; - $this -> setElementError($this -> elements[$element],$rule['options']['msg']); - } + // If no rule configured for this attribute, just ignore this check + if (!isset($this -> _rules[$element]) || !is_array($this -> _rules[$element])) + continue; + + // Load LSformRule class + LSsession :: loadLSclass('LSformRule', null, true); + + // 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] + ) + ) { + $retval = false; + $this -> setElementError($this -> elements[$element], $rule['options']['msg']); } } } diff --git a/src/includes/class/class.LSformRule.php b/src/includes/class/class.LSformRule.php index 4d09fa8c..ff1023fc 100644 --- a/src/includes/class/class.LSformRule.php +++ b/src/includes/class/class.LSformRule.php @@ -29,17 +29,50 @@ LSsession :: loadLSclass('LSlog_staticLoggerClass'); */ class LSformRule extends LSlog_staticLoggerClass { - /** - * Validation de données + // Validate values one by one or all together + public const validate_one_by_one = True; + + /** + * Validate form element values with specified rule * - * @param mixed $value Données à valider - * @param array $options Options de validation - * @param object $formElement L'objet formElement attaché + * @param mixed $rule_name The LSformRule name + * @param mixed $value The values to validate + * @param array $options Validation options + * @param object $formElement The attached LSformElement object * - * @return boolean True si les données sont valide, False sinon. + * @return boolean True if value is valid, False otherwise + */ + public static function validate_values($rule_name, $values, $options=array(), &$formElement) { + // Compute PHP class name of the rule + $rule_class = "LSformRule_".$rule_name; + + // Load PHP class (with error if fail) + if (!LSsession :: loadLSclass($rule_class)) { + LSerror :: addErrorCode('LSformRule_02', $rule_name); + return False; + } + + 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; + } + return True; + } + + /** + * Validate form element value + * + * @param mixed $value The value to validate + * @param array $options Validation options + * @param object $formElement The attached LSformElement object + * + * @return boolean True if value is valid, False otherwise */ public static function validate($value, $options=array(), &$formElement) { - return true; + return false; } } @@ -48,5 +81,8 @@ class LSformRule extends LSlog_staticLoggerClass { * Error Codes **/ LSerror :: defineError('LSformRule_01', -___("LSformRule_%{type} : Parameter %{param} is not found.") +___("LSformRule_%{type}: Parameter %{param} is not found.") +); +LSerror :: defineError('LSformRule_02', +___("LSformRule: Unknown rule type %{type}.") );