diff --git a/e107_handlers/validator_class.php b/e107_handlers/validator_class.php index b3024f09e..5aa627963 100644 --- a/e107_handlers/validator_class.php +++ b/e107_handlers/validator_class.php @@ -9,12 +9,14 @@ * Handler - general purpose validation functions * * $Source: /cvs_backup/e107_0.8/e107_handlers/validator_class.php,v $ - * $Revision: 1.18 $ - * $Date: 2010-01-12 13:11:48 $ + * $Revision: 1.19 $ + * $Date: 2010-02-07 12:13:43 $ * $Author: secretr $ * */ +if (!defined('e107_INIT')) { exit; } + // List of error numbers which may be returned from validation define('ERR_MISSING_VALUE','01'); define('ERR_UNEXPECTED_VALUE','02'); @@ -38,6 +40,9 @@ define('ERR_GENERIC', '19'); // This requires coder-defined error text define('ERR_IMAGE_TOO_WIDE', '20'); define('ERR_IMAGE_TOO_HIGH', '21'); +// Default error messages +e107::includeLan(e_LANGUAGEDIR.e_LANGUAGE.'/admin/lan_validator.php'); + /** * Validator class - used by e_model and its child classes * @@ -52,7 +57,7 @@ class e_validator /** * @var integer Unknown error code */ - const ERR_UNKNOWN = -1; + const ERR_UNKNOWN = 0; /** * @var integer Value not found error code @@ -60,7 +65,7 @@ class e_validator const ERR_MISSING_VALUE = 101; /** - * @var integer Unexpected value error code (bad rule) + * @var integer Unexpected value type error code (bad rule) */ const ERR_UNEXPECTED_VALUE = 102; @@ -125,7 +130,7 @@ class e_validator const ERR_INSTANCEOF_EXPECTED = 153; /** - * @var integer Type of array expected error code + * @var integer Array type expected error code */ const ERR_ARRAY_EXPECTED = 154; @@ -133,6 +138,26 @@ class e_validator * @var integer Generic (empty value) error code */ const ERR_GENERIC = 191; + + /** + * @var integer File not exists or not a file error code + */ + const ERR_NOT_FILE = 201; + + /** + * @var integer File not writable error code + */ + const ERR_WRITABLE_FILE = 202; + + /** + * @var integer File exceeds allowed file size error code + */ + const ERR_SIZEMIN_FILE = 203; + + /** + * @var integer File lower than minimal file size error code + */ + const ERR_SIZEMAX_FILE = 204; /** * Required rules - Used by validate method @@ -272,7 +297,6 @@ class e_validator */ function validate($data) { - //XXX add direct e_model $data type support? $this->reset(); $rules = array_merge(array_keys($this->_required_rules), array_keys($this->_optional_rules)); @@ -291,7 +315,7 @@ class e_validator if(($required || $this->isOptionalField($field_name)) && !$this->validateField($field_name, $value, $required)) { $this->_is_valid_data = false; - $this->addValidateMessage($this->getFieldName($field_name, $required), $this->getErrorCode($field_name), $this->getFieldMessage($field_name, $required)); + $this->addValidateMessage($this->getFieldName($field_name, $required), $this->getErrorCode($field_name), $this->getFieldMessage($field_name, $required, $value)); continue; } } @@ -345,28 +369,29 @@ class e_validator * Retrieve validation error message for the required field * * @param string $name + * @param mixed $value * @return string */ - function getFieldMessage($name, $required = true) + function getFieldMessage($name, $value = '', $required = true) { if($required) { if(!isset($this->_required_rules[$name][4])) { - return $this->getFieldHelp($name, true, 'Invalid value'); + $msg = $this->getFieldHelp($name, true); } - $msg = $this->_required_rules[$name][4]; + else $msg = $this->_required_rules[$name][4]; } else { if(!isset($this->_optional_rules[$name][4])) { - return $this->getFieldHelp($name, false, 'Invalid value'); + $msg = $this->getFieldHelp($name, false); } - $msg = $this->_optional_rules[$name][4]; + else $msg = $this->_optional_rules[$name][4]; } - return defset($msg, $msg); + return ($msg ? defset($msg, $msg) : ''); } /** @@ -397,30 +422,6 @@ class e_validator */ function validateField($name, $value, $required = true) { - if(!$required && empty($value)) - { - switch($this->_optional_rules[$name][0]) - { - case 'int': - case 'integer': - $value = 0; - break; - - case 'float': - $value = floatval($value); - break; - - case 'array': - $value = array(); - break; - - default: - $value = ''; - break; - } - $this->addValidData($name, $value); - return true; - } if($required) { $type = $this->_required_rules[$name][0]; @@ -428,9 +429,34 @@ class e_validator } else { + if(empty($value)) + { + switch($this->_optional_rules[$name][0]) + { + case 'int': + case 'integer': + $value = 0; + break; + + case 'float': + $value = floatval($value); + break; + + case 'array': + $value = array(); + break; + + default: + $value = ''; + break; + } + $this->addValidData($name, $value); + return true; + } $type = $this->_optional_rules[$name][0]; $cond = $this->_optional_rules[$name][1]; } + switch ($type) { case 'required': @@ -566,6 +592,38 @@ class e_validator return true; break; + case 'file': // TODO - type image - validate dimensions? + parse_str($cond, $params); + $path = e107::getParser()->replaceConstants(varset($params['base']).$value); + if(is_file($path)) + { + $this->addValidateResult($name, self::ERR_NOT_FILE); + return false; + } + if(vartrue($params['writable']) && !is_writable($path)) + { + $this->addValidateResult($name, self::ERR_WRITABLE_FILE); + return false; + } + if(vartrue($params['size'])) + { + $tmp = explode('-', $params['size'], 2); + $fs = filesize($path); + if(!$fs || $fs < (integer) $tmp[0]) + { + $this->addValidateResult($name, self::ERR_SIZEMIN_FILE); + return false; + } + elseif(is_numeric(varset($tmp[1])) && $fs > (integer) $tmp[1]) + { + $this->addValidateResult($name, self::ERR_SIZEMAX_FILE); + return false; + } + } + $this->addValidData($name, $value); + return true; + break; + case 'compare': if(!is_array($value)) { @@ -622,7 +680,7 @@ class e_validator //Core message $msg = sprintf( - '"%s" validation error: [#%d] %s. ', + LAN_VALIDATE_FAILMSG, //'"%s" validation error: [#%d] %s. ' $field_title, $err_code, $this->getErrorByCode($err_code) @@ -631,7 +689,7 @@ class e_validator //Additional message if($err_message) { - $msg .= $err_message; + $msg .= ' '.$err_message; } e107::getMessage()->addStack($msg, $this->_message_stack, E_MESSAGE_ERROR); @@ -702,7 +760,7 @@ class e_validator * @param mixed $default * @return integer error code */ - function getErrorCode($field, $default = -1) + function getErrorCode($field, $default = 0) { return (isset($this->_validation_results[$field]) ? $this->_validation_results[$field] : $default); } diff --git a/e107_languages/English/admin/lan_validator.php b/e107_languages/English/admin/lan_validator.php new file mode 100644 index 000000000..d880f02b2 --- /dev/null +++ b/e107_languages/English/admin/lan_validator.php @@ -0,0 +1,44 @@ +"%1$s" validation error: [#%2$d] %3$s.'); \ No newline at end of file