From acfdc83a0bb620d996c80a0787fd515121fcdca0 Mon Sep 17 00:00:00 2001 From: xue <> Date: Mon, 16 Jan 2006 05:26:31 +0000 Subject: Added validator controls. --- framework/Web/UI/WebControls/TCompareValidator.php | 266 +++++++++++++++++++++ 1 file changed, 266 insertions(+) create mode 100644 framework/Web/UI/WebControls/TCompareValidator.php (limited to 'framework/Web/UI/WebControls/TCompareValidator.php') diff --git a/framework/Web/UI/WebControls/TCompareValidator.php b/framework/Web/UI/WebControls/TCompareValidator.php new file mode 100644 index 00000000..b7363792 --- /dev/null +++ b/framework/Web/UI/WebControls/TCompareValidator.php @@ -0,0 +1,266 @@ + + * @link http://www.pradosoft.com/ + * @copyright Copyright © 2005 PradoSoft + * @license http://www.pradosoft.com/license/ + * @version $Revision: $ $Date: $ + * @package System.Web.UI.WebControls + */ + +/** + * Using TBaseValidator class + */ +Prado::using('System.Web.UI.WebControls.TBaseValidator'); + +/** + * TCompareValidator class + * + * TCompareValidator compares the value entered by the user into an input component with the value + * entered into another input component or a constant value. To specify the input component to + * validate, set the ControlToValidate property to the ID of the input component. + * + * To compare the associated input component with another input component, + * set the ControlToCompare property to the ID of the component to compare with. + * + * To compare the associated input component with a constant value, + * specify the constant value to compare with by setting the ValueToCompare property. + * + * The ValueType property is used to specify the data type of both comparison values. + * Both values are automatically converted to this data type before the comparison operation + * is performed. The following value types are supported: + * - Integer A 32-bit signed integer data type. + * - Double A double-precision floating point number data type. + * - Currency A decimal data type that can contain currency symbols. + * - Date A date data type. The format follows the GNU date syntax. + * - String A string data type. + * + * Use the Operator property to specify the type of comparison to perform, + * such as Equal, NotEqual, GreaterThan, GreaterThanEqual, LessThan, LessThanEqual, DataTypeCheck. + * If you set the Operator property to DataTypeCheck, the TCompareValidator component + * will ignore the ControlToCompare and ValueToCompare properties and simply + * indicates whether the value entered into the input component can be converted to the data type + * specified by the ValueType property. + * + * @author Qiang Xue + * @version $Revision: $ $Date: $ + * @package System.Web.UI.WebControls + * @since 3.0 + */ +class TCompareValidator extends TBaseValidator +{ + /** + * @return string the data type that the values being compared are converted to before the comparison is made. Defaults to String. + */ + public function getValueType() + { + return $this->getViewState('ValueType','String'); + } + + /** + * Sets the data type (Integer, Double, Currency, Date, String) that the values being compared are converted to before the comparison is made. + * @param string the data type + */ + public function setValueType($value) + { + $this->setViewState('ValueType',TPropertyValue::ensureEnum($value,'Integer','Double','Date','Currency','String'),'String'); + } + + /** + * @return string the input component to compare with the input control being validated. + */ + public function getControlToCompare() + { + return $this->getViewState('ControlToCompare',''); + } + + /** + * Sets the input component to compare with the input control being validated. + * @param string the ID path of the component to compare with + */ + public function setControlToCompare($value) + { + $this->setViewState('ControlToCompare',$value,''); + } + + /** + * @return string the constant value to compare with the value entered by the user into the input component being validated. + */ + public function getValueToCompare() + { + return $this->getViewState('ValueToCompare',''); + } + + /** + * Sets the constant value to compare with the value entered by the user into the input component being validated. + * @param string the constant value + */ + public function setValueToCompare($value) + { + $this->setViewState('ValueToCompare',$value,''); + } + + /** + * @return string the comparison operation to perform (Equal, NotEqual, GreaterThan, GreaterThanEqual, LessThan, LessThanEqual, DataTypeCheck). Defaults to Equal. + */ + public function getOperator() + { + return $this->getViewState('Operator','Equal'); + } + + /** + * Sets the comparison operation to perform (Equal, NotEqual, GreaterThan, GreaterThanEqual, LessThan, LessThanEqual, DataTypeCheck) + * @param string the comparison operation + */ + public function setOperator($value) + { + $this->setViewState('Operator',TPropertyValue::ensureEnum($value,'Equal','NotEqual','GreaterThan','GreaterThanEqual','LessThan','LessThanEqual','DataTypeCheck'),'Equal'); + } + + /** + * 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', ''); + } + + /** + * This method overrides the parent's implementation. + * The validation succeeds if the input data compares successfully. + * 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(($control=$this->getValidationTarget())===null) + throw new TInvalidDataValueException('comparevalidator_controltovalidate_invalid'); + if(($value=$this->getValidationValue($control))==='') + return true; + + if($this->getOperator()==='DataTypeCheck') + return $this->evaluateDataTypeCheck($value); + + if(($controlToCompare=$this->getControlToCompare())!=='') + { + if(($control2=$this->findControl($controlToCompare))===null) + throw new TInvalidDataValueException('comparevalidator_controltocompare_invalid'); + if(($value2=$this->getValidationValue($control2))==='') + return false; + } + else + $value2=$this->getValueToCompare(); + + $values = $this->getComparisonValues($value, $value2); + switch($this->getOperator()) + { + case 'Equal': + return $values[0] == $values[1]; + case 'NotEqual': + return $values[0] != $values[1]; + case 'GreaterThan': + return $values[0] > $values[1]; + case 'GreaterThanEqual': + return $values[0] >= $values[1]; + case 'LessThan': + return $values[0] < $values[1]; + case 'LessThanEqual': + return $values[0] <= $values[1]; + } + + return false; + } + + /** + * 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) + { + switch($this->getValueType()) + { + case 'Integer': + return preg_match('/^[-+]?[0-9]+$/',trim($value)); + case 'Float': + case 'Double': + return preg_match('/^[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?$/',trim($value)); + case 'Currency': + return preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?$/',trim($value)); + case 'Date': + $dateFormat = $this->getDateFormat(); + if(strlen($dateFormat)) + return pradoParseDate($value, $dateFormat) !== null; + else + return strtotime($value) > 0; + } + return true; + } + + /** + * Parse the pair of values into the appropriate value type. + * @param string value one + * @param string second value + * @return array appropriate type of the value pair, array($value1, $value2); + */ + protected function getComparisonValues($value1, $value2) + { + switch($this->getValueType()) + { + case 'Integer': + return array(intval($value1), intval($value2)); + case 'Float': + case 'Double': + return array(floatval($value1), floatval($value2)); + case 'Currency': + if(preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?/',$value1,$matches)) + $value1=floatval($matches[0]); + else + $value1=0; + if(preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?/',$value2,$matches)) + $value2=floatval($matches[0]); + else + $value2=0; + return array($value1, $value2); + case 'Date': + $dateFormat = $this->getDateFormat(); + if (strlen($dateFormat)) + return array(pradoParseDate($value1, $dateFormat), pradoParseDate($value2, $dateFormat)); + else + return array(strtotime($value1), strtotime($value2)); + } + return array($value1, $value2); + } + + protected function getClientScriptOptions() + { + $options = parent::getClientScriptOptions(); + if(($name=$this->getControlToCompare())!=='') + { + if(($control=$this->findControl($name))!==null) + $options['controltocompare']=$options['controlhookup']=$control->getClientID(); + } + if(($value=$this->getValueToCompare())!=='') + $options['valuetocompare']=$value; + if(($operator=$this->getOperator())!=='Equal') + $options['operator']=$operator; + $options['type']=$this->getValueType(); + if(($dateFormat=$this->getDateFormat())!=='') + $options['dateformat']=$dateFormat; + return $options; + } +} + +?> \ No newline at end of file -- cgit v1.2.3