* @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2011 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.UI.WebControls */ /** * Using TBaseValidator class */ Prado::using('System.Web.UI.WebControls.TBaseValidator'); /** * TDataTypeValidator class * * TDataTypeValidator verifies if the input data is of the type specified * by {@link setDataType DataType}. * The following data types are supported: * - Integer A 32-bit signed integer data type. * - Float A double-precision floating point number data type. * - Date A date data type. * - String A string data type. * For Date type, the property {@link setDateFormat DateFormat} * will be used to determine how to parse the date string. If it is not * provided, the string will be assumed to be in GNU datetime format. * * @author Wei Zhuo * @version $Id$ * @package System.Web.UI.WebControls * @since 3.0 */ class TDataTypeValidator extends TBaseValidator { /** * Gets the name of the javascript class responsible for performing validation for this control. * This method overrides the parent implementation. * @return string the javascript class name */ protected function getClientClassName() { return 'Prado.WebUI.TDataTypeValidator'; } /** * @return TValidationDataType the data type that the values being compared are converted to before the comparison is made. Defaults to TValidationDataType::String. */ public function getDataType() { return $this->getViewState('DataType','String'); } /** * Sets the data type that the values being compared are converted to before the comparison is made. * @param TValidationDataType the data type */ public function setDataType($value) { $this->setViewState('DataType',TPropertyValue::ensureEnum($value,'TValidationDataType'),TValidationDataType::String); } /** * Sets the date format for a date validation * @param string the date format value */ public function setDateFormat($value) { $this->setViewState('DateFormat', $value, ''); } /** * @return string the date validation date format if any */ public function getDateFormat() { return $this->getViewState('DateFormat', ''); } /** * Determine if the given value is of a particular type using RegExp. * @param string value to check * @return boolean true if value fits the type expression. */ protected function evaluateDataTypeCheck($value) { if($value=='') return true; switch($this->getDataType()) { case TValidationDataType::Integer: return preg_match('/^[-+]?[0-9]+$/',trim($value)); case TValidationDataType::Float: return preg_match('/^[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?$/',trim($value)); case TValidationDataType::Date: $dateFormat = $this->getDateFormat(); if(strlen($dateFormat)) { $formatter = Prado::createComponent('System.Util.TSimpleDateFormatter',$dateFormat); return $formatter->isValidDate($value); } else return strtotime($value) > 0; } return true; } /** * Returns an array of javascript validator options. * @return array javascript validator options. */ protected function getClientScriptOptions() { $options = parent::getClientScriptOptions(); $options['DataType']=$this->getDataType(); if(($dateFormat=$this->getDateFormat())!=='') $options['DateFormat']=$dateFormat; return $options; } /** * This method overrides the parent's implementation. * The validation succeeds if the input data is of valid type. * The validation always succeeds if ControlToValidate is not specified * or the input data is empty. * @return boolean whether the validation succeeds */ public function evaluateIsValid() { if(($value=$this->getValidationValue($this->getValidationTarget()))==='') return true; return $this->evaluateDataTypeCheck($value); } }