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.
This commit is contained in:
Benjamin Renard 2020-12-21 14:53:36 +01:00
parent 089693ea0e
commit 114e3c48ac
2 changed files with 60 additions and 22 deletions

View file

@ -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']);
}
}
}

View file

@ -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}.")
);