* (c) 2004-2006 Sean Kerr. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * sfNumberValidator verifies a parameter is a number and allows you to apply * size constraints. * * Optional parameters: * * # max - [none] - Maximum number size. * # max_error - [Input is too large] - An error message to use when * input is too large. * # min - [none] - Minimum number size. * # min_error - [Input is too small] - An error message to use when * input is too small. * # nan_error - [Input is not a number] - Default error message when * input is not a number. * # type - [Any] - Type of number (Any, Float). * # type_error - [Input is not a number] - An error message to use when * input is not a number. * * @package symfony * @subpackage validator * @author Fabien Potencier * @author Sean Kerr * @version SVN: $Id: sfNumberValidator.class.php 3233 2007-01-11 21:01:08Z fabien $ */ class sfNumberValidator extends sfValidator { /** * Executes this validator. * * @param mixed A file or parameter value/array * @param error An error message reference * * @return bool true, if this validator executes successfully, otherwise false */ public function execute(&$value, &$error) { if (!is_numeric($value)) { // it's NaN, what nerve! $error = $this->getParameterHolder()->get('nan_error'); return false; } $type = strtolower($this->getParameterHolder()->get('type')); switch ($type) { case "decimal": case "float": { if (substr_count($value, '.') != 1) { // value isn't a float, shazbot! $error = $this->getParameterHolder()->get('type_error'); return false; } // cast our value to a float $value = (float) $value; break; } case "int": case "integer": { // Note: (Both 3 AND 3.0 are BOTH considered integers and 3.1 is not) if ((float) $value != (int) $value) { // is not an integer. $error = $this->getParameterHolder()->get('type_error'); return false; } // cast our value to an integer $value = (int) $value; break; } } $min = $this->getParameterHolder()->get('min'); if ($min !== null && $value < $min) { // too small $error = $this->getParameterHolder()->get('min_error'); return false; } $max = $this->getParameterHolder()->get('max'); if ($max !== null && $value > $max) { // too large $error = $this->getParameterHolder()->get('max_error'); return false; } return true; } /** * Initializes this validator. * * @param sfContext The current application context * @param array An associative array of initialization parameters * * @return bool true, if initialization completes successfully, otherwise false */ public function initialize($context, $parameters = null) { // initialize parent parent::initialize($context); // set defaults $this->getParameterHolder()->set('max', null); $this->getParameterHolder()->set('max_error', 'Input is too large'); $this->getParameterHolder()->set('min', null); $this->getParameterHolder()->set('min_error', 'Input is too small'); $this->getParameterHolder()->set('nan_error', 'Input is not a number'); $this->getParameterHolder()->set('type', 'any'); $this->getParameterHolder()->set('type_error', 'Input is not a number'); $this->getParameterHolder()->add($parameters); // check user-specified parameters $type = strtolower($this->getParameterHolder()->get('type')); // array of allowed types $allowed_types = array('any', 'decimal', 'float', 'int', 'integer'); if (!in_array(strtolower($type), $allowed_types)) { // unknown type $error = 'Unknown number type "%s" in NumberValidator'; $error = sprintf($error, $this->getParameterHolder()->get('type')); throw new sfValidatorException($error); } return true; } }