// use ObjectModel::validateField on validaterules

This commit is contained in:
Rémi Gaillard
2013-09-24 17:12:28 +02:00
parent 3d477c62eb
commit beb0a74135
2 changed files with 58 additions and 98 deletions
+30 -9
View File
@@ -893,7 +893,7 @@ abstract class ObjectModelCore
* @param int $id_lang * @param int $id_lang
* @return bool|string * @return bool|string
*/ */
public function validateField($field, $value, $id_lang = null) public function validateField($field, $value, $id_lang = null, $skip = array(), $human_errors = false)
{ {
$this->cacheFieldsRequiredDatabase(); $this->cacheFieldsRequiredDatabase();
$data = $this->def['fields'][$field]; $data = $this->def['fields'][$field];
@@ -901,9 +901,12 @@ abstract class ObjectModelCore
// Check if field is required // Check if field is required
$required_fields = (isset(self::$fieldsRequiredDatabase[get_class($this)])) ? self::$fieldsRequiredDatabase[get_class($this)] : array(); $required_fields = (isset(self::$fieldsRequiredDatabase[get_class($this)])) ? self::$fieldsRequiredDatabase[get_class($this)] : array();
if (!$id_lang || $id_lang == Configuration::get('PS_LANG_DEFAULT')) if (!$id_lang || $id_lang == Configuration::get('PS_LANG_DEFAULT'))
if (!empty($data['required']) || in_array($field, $required_fields)) if (!in_array('required', $skip) && (!empty($data['required']) || in_array($field, $required_fields)))
if (Tools::isEmpty($value)) if (Tools::isEmpty($value))
return 'Property '.get_class($this).'->'.$field.' is empty'; if ($human_errors)
return sprintf(Tools::displayError('The %s field is required.'), $this->displayFieldName($field, get_class($this)));
else
return 'Property '.get_class($this).'->'.$field.' is empty';
// Default value // Default value
if (!$value && !empty($data['default'])) if (!$value && !empty($data['default']))
@@ -913,11 +916,11 @@ abstract class ObjectModelCore
} }
// Check field values // Check field values
if (!empty($data['values']) && is_array($data['values']) && !in_array($value, $data['values'])) if (!in_array('values', $skip) && !empty($data['values']) && is_array($data['values']) && !in_array($value, $data['values']))
return 'Property '.get_class($this).'->'.$field.' has bad value (allowed values are: '.implode(', ', $data['values']).')'; return 'Property '.get_class($this).'->'.$field.' has bad value (allowed values are: '.implode(', ', $data['values']).')';
// Check field size // Check field size
if (!empty($data['size'])) if (!in_array('size', $skip) && !empty($data['size']))
{ {
$size = $data['size']; $size = $data['size'];
if (!is_array($data['size'])) if (!is_array($data['size']))
@@ -925,11 +928,24 @@ abstract class ObjectModelCore
$length = Tools::strlen($value); $length = Tools::strlen($value);
if ($length < $size['min'] || $length > $size['max']) if ($length < $size['min'] || $length > $size['max'])
return 'Property '.get_class($this).'->'.$field.' length ('.$length.') must be between '.$size['min'].' and '.$size['max']; {
if ($human_errors)
{
if (isset($data['lang']) && $data['lang'])
{
$language = new Language((int)$id_lang);
return sprintf(Tools::displayError('The field %1$s (%2$s) is too long (%3$d chars max, html chars including).'), $this->displayFieldName($field, get_class($this)), $language->name, $size['max']);
}
else
return sprintf(Tools::displayError('The %1$s field is too long (%2$d chars max).'), $this->displayFieldName($field, get_class($this)), $size['max']);
}
else
return 'Property '.get_class($this).'->'.$field.' length ('.$length.') must be between '.$size['min'].' and '.$size['max'];
}
} }
// Check field validator // Check field validator
if (!empty($data['validate'])) if (!in_array('validate', $skip) && !empty($data['validate']))
{ {
if (!method_exists('Validate', $data['validate'])) if (!method_exists('Validate', $data['validate']))
throw new PrestaShopException('Validation function not found. '.$data['validate']); throw new PrestaShopException('Validation function not found. '.$data['validate']);
@@ -948,7 +964,12 @@ abstract class ObjectModelCore
$res = false; $res = false;
} }
if (!$res) if (!$res)
return 'Property '.get_class($this).'->'.$field.' is not valid'; {
if ($human_errors)
return sprintf(Tools::displayError('The %s field is invalid.'), $this->displayFieldName($field, get_class($this)));
else
return 'Property '.get_class($this).'->'.$field.' is not valid';
}
} }
} }
+28 -89
View File
@@ -2426,102 +2426,41 @@ class AdminControllerCore extends Controller
if (!$class_name) if (!$class_name)
$class_name = $this->className; $class_name = $this->className;
/* Class specific validation rules */ $object = new $class_name();
if (!empty($class_name)) $definition = ObjectModel::getDefinition($class_name);
$rules = call_user_func(array($class_name, 'getValidationRules'), $class_name); $default_language = new Language((int)Configuration::get('PS_LANG_DEFAULT'));
if (isset($rules) && count($rules) && (count($rules['requiredLang']) || count($rules['sizeLang']) || count($rules['validateLang']))) foreach ($definition['fields'] as $field => $def)
{ {
/* Language() instance determined by default language */ $skip = array();
$default_language = new Language((int)Configuration::get('PS_LANG_DEFAULT')); if (in_array($field, array('passwd', 'no-picture')))
$skip = array('required');
/* All availables languages */ if (isset($def['lang']) && $def['lang'] && isset($def['required']) && $def['required'])
$languages = Language::getLanguages(false); {
$value = Tools::getValue($field.'_'.$default_language->id);
if (Tools::isEmpty($value))
$this->errors[$field.'_'.$default_language->id] = sprintf(
Tools::displayError('The field %1$s is required at least in %2$s.'),
$object->displayFieldName($field, $class_name),
$default_language->name
);
foreach (Language::getLanguages(false) as $language)
{
$value = Tools::getValue($field.'_'.$language['id_lang']);
if (!empty($value))
if (($error = $object->validateField($field, $value, $language['id_lang'], $skip, true)) !== true)
$this->errors[$field.'_'.$language['id_lang']] = $error;
}
}
else
if (($error = $object->validateField($field, Tools::getValue($field), null, $skip, true)) !== true)
$this->errors[$field] = $error;
} }
/* Checking for required fields */
if (isset($rules['required']) && is_array($rules['required']))
foreach ($rules['required'] as $field)
if (($value = Tools::getValue($field)) == false && (string)$value != '0')
if (!Tools::getValue($this->identifier) || ($field != 'passwd' && $field != 'no-picture'))
$this->errors[$field] = sprintf(
Tools::displayError('The %s field is required.'),
call_user_func(array($class_name, 'displayFieldName'), $field, $class_name)
);
/* Checking for multilingual required fields */
if (isset($rules['requiredLang']) && is_array($rules['requiredLang']))
foreach ($rules['requiredLang'] as $field_lang)
if (($empty = Tools::getValue($field_lang.'_'.$default_language->id)) === false || $empty !== '0' && empty($empty))
$this->errors[$field_lang.'_'.$default_language->id] = sprintf(
Tools::displayError('The field %1$s is required at least in %2$s.'),
call_user_func(array($class_name, 'displayFieldName'), $field_lang, $class_name),
$default_language->name
);
/* Checking for maximum fields sizes */
if (isset($rules['size']) && is_array($rules['size']))
foreach ($rules['size'] as $field => $max_length)
if (Tools::getValue($field) !== false && Tools::strlen(Tools::getValue($field)) > $max_length)
$this->errors[$field] = sprintf(
Tools::displayError('The %1$s field is too long (%2$d chars max).'),
call_user_func(array($class_name, 'displayFieldName'), $field, $class_name),
$max_length
);
/* Checking for maximum multilingual fields size */
if (isset($rules['sizeLang']) && is_array($rules['sizeLang']))
foreach ($rules['sizeLang'] as $field_lang => $max_length)
foreach ($languages as $language)
{
$field_lang_value = Tools::getValue($field_lang.'_'.$language['id_lang']);
if ($field_lang_value !== false && Tools::strlen($field_lang_value) > $max_length)
$this->errors[$field_lang.'_'.$language['id_lang']] = sprintf(
Tools::displayError('The field %1$s (%2$s) is too long (%3$d chars max, html chars including).'),
call_user_func(array($class_name, 'displayFieldName'), $field_lang, $class_name),
$language['name'],
$max_length
);
}
/* Overload this method for custom checking */ /* Overload this method for custom checking */
$this->_childValidation(); $this->_childValidation();
/* Checking for fields validity */
if (isset($rules['validate']) && is_array($rules['validate']))
foreach ($rules['validate'] as $field => $function)
if (($value = Tools::getValue($field)) !== false && ($field != 'passwd'))
if (!Validate::$function($value) && !empty($value))
$this->errors[$field] = sprintf(
Tools::displayError('The %s field is invalid.'),
call_user_func(array($class_name, 'displayFieldName'), $field, $class_name)
);
/* Checking for passwd_old validity */
if (($value = Tools::getValue('passwd')) != false)
{
if ($class_name == 'Employee' && !Validate::isPasswdAdmin($value))
$this->errors['passwd'] = sprintf(
Tools::displayError('The %s field is invalid.'),
call_user_func(array($class_name, 'displayFieldName'), 'passwd', $class_name)
);
elseif ($class_name == 'Customer' && !Validate::isPasswd($value))
$this->errors['passwd'] = sprintf(
Tools::displayError('The %s field is invalid.'),
call_user_func(array($class_name, 'displayFieldName'), 'passwd', $class_name)
);
}
/* Checking for multilingual fields validity */
if (isset($rules['validateLang']) && is_array($rules['validateLang']))
foreach ($rules['validateLang'] as $field_lang => $function)
foreach ($languages as $language)
if (($value = Tools::getValue($field_lang.'_'.$language['id_lang'])) !== false && !empty($value))
if (!Validate::$function($value))
$this->errors[$field_lang.'_'.$language['id_lang']] = sprintf(
Tools::displayError('The %1$s field (%2$s) is invalid.'),
call_user_func(array($class_name, 'displayFieldName'), $field_lang, $class_name),
$language['name']
);
} }
/** /**