From 8ab196ce6c2d5de323bdd8ebcc11a73814c0cdca Mon Sep 17 00:00:00 2001 From: xue <> Date: Wed, 26 Apr 2006 21:18:01 +0000 Subject: Merge from 3.0 branch till 971. --- framework/I18N/TDateFormat.php | 11 +- framework/I18N/core/DateFormat.php | 12 +- framework/I18N/core/NumberFormat.php | 7 +- framework/I18N/core/NumberFormatInfo.php | 18 +++ framework/Web/Javascripts/js/validator.js | 50 ++++---- framework/Web/Javascripts/prado/validation3.js | 71 +++++++---- .../Web/UI/WebControls/TDataTypeValidator.php | 13 ++ .../Web/UI/WebControls/TListControlValidator.php | 132 +++++++++++---------- framework/Web/UI/WebControls/TLiteral.php | 7 +- framework/Web/UI/WebControls/TTable.php | 2 +- 10 files changed, 203 insertions(+), 120 deletions(-) (limited to 'framework') diff --git a/framework/I18N/TDateFormat.php b/framework/I18N/TDateFormat.php index 8ebbce5e..0f5507ab 100644 --- a/framework/I18N/TDateFormat.php +++ b/framework/I18N/TDateFormat.php @@ -48,10 +48,9 @@ Prado::using('System.I18N.TI18NControl'); * if the Value property is not specified. * - Pattern, string, *
Gets or sets the formatting pattern. The predefined patterns are - * 'full date', 'long date', 'medium date', 'short date', 'full time', - * 'long time', 'medium time', and 'short time'. Custom patterns can - * specified when the Pattern property does not match the predefined - * patterns. + * 'fulldate', 'longdate', 'mediumdate', 'shortdate', 'fulltime', + * 'longtime', 'mediumtime', and 'shorttime'. Custom patterns can specified + * when the Pattern property does not match the predefined patterns. * * @author Xiang Wei Zhuo * @version v1.0, last update on Sat Dec 11 15:25:11 EST 2004 @@ -69,7 +68,7 @@ class TDateFormat extends TI18NControl * A set of pattern presets and their respective formatting shorthand. * @var array */ - protected $patternPresets = array( + static private $_patternPresets = array( 'fulldate'=>'P','full'=>'P', 'longdate'=>'D','long'=>'d', 'mediumdate'=>'p','medium'=>'p', @@ -132,7 +131,7 @@ class TDateFormat extends TI18NControl protected function getPreset($string) { $string = strtolower($string); - foreach($this->patternPresets as $pattern => $preset) + foreach(self::$_patternPresets as $pattern => $preset) { if($string == $pattern) return $preset; diff --git a/framework/I18N/core/DateFormat.php b/framework/I18N/core/DateFormat.php index 9caca03b..142926f4 100644 --- a/framework/I18N/core/DateFormat.php +++ b/framework/I18N/core/DateFormat.php @@ -128,7 +128,12 @@ class DateFormat if($pattern{0} == "'" && $pattern{strlen($pattern)-1} == "'") { - $tokens[$i] = preg_replace('/(^\')|(\'$)/','',$pattern); + $sub = preg_replace('/(^\')|(\'$)/','',$pattern); + $tokens[$i] = str_replace('``````','\'',$sub); + } + else if($pattern == '``````') + { + $tokens[$i] = '\''; } else { @@ -145,7 +150,7 @@ class DateFormat throw new Exception('function '.$function.' not found.'); } - } + } } return I18N_toEncoding(implode('',$tokens), $charset); @@ -269,6 +274,7 @@ class DateFormat $token = null; $text = false; + $pattern = preg_replace("/''/", '``````', $pattern); for($i = 0; $i < strlen($pattern); $i++) { @@ -278,7 +284,7 @@ class DateFormat } else { - $tokens[] = str_replace("''","'",$token); + $tokens[] = str_replace("","'",$token); $token = $pattern{$i}; } diff --git a/framework/I18N/core/NumberFormat.php b/framework/I18N/core/NumberFormat.php index bde87e65..d1184f86 100644 --- a/framework/I18N/core/NumberFormat.php +++ b/framework/I18N/core/NumberFormat.php @@ -63,7 +63,7 @@ require_once(dirname(__FILE__).'/util.php'); * $ja = new NumberFormat('ja_JP'); * * //Japanese currency pattern, and using Japanese Yen symbol - * $ja->format(123.14,'c','JPY'); //�123 (Yen 123) + * $ja->format(123.14,'c','JPY'); //�?123 (Yen 123) * * For each culture, the symbol for each currency may be different. * @@ -166,12 +166,17 @@ class NumberFormat $string = substr($string, 0, $dp); $integer = ''; + + $digitSize = $this->formatInfo->getDigitSize(); + + $string = str_pad($string, $digitSize, '0',STR_PAD_LEFT); $len = strlen($string); $groupSeparator = $this->formatInfo->GroupSeparator; $groupSize = $this->formatInfo->GroupSizes; + $firstGroup = true; $multiGroup = is_int($groupSize[1]); $count = 0; diff --git a/framework/I18N/core/NumberFormatInfo.php b/framework/I18N/core/NumberFormatInfo.php index 15b9ee5d..3531cc7f 100644 --- a/framework/I18N/core/NumberFormatInfo.php +++ b/framework/I18N/core/NumberFormatInfo.php @@ -324,6 +324,13 @@ class NumberFormatInfo } } } + + if(is_int($decimalPos)) + $digitPattern = substr($pattern,0,$decimalPos); + else + $digitPattern = $pattern; + + $digitPattern = preg_replace('/[^0]/','',$digitPattern); $info['groupPos1'] = $groupPos1; $info['groupSize1'] = $groupSize1; @@ -331,6 +338,7 @@ class NumberFormatInfo $info['groupSize2'] = $groupSize2; $info['decimalPos'] = $decimalPos; $info['decimalPoints'] = $decimalPoints; + $info['digitSize'] = strlen($digitPattern); return $info; } @@ -365,6 +373,16 @@ class NumberFormatInfo return $this->pattern['decimalPoints'] = $value; } + function getDigitSize() + { + return $this->pattern['digitSize']; + } + + function setDigitSize($value) + { + $this->pattern['digitSize'] = $value; + } + /** * Gets the string to use as the decimal separator. * @return string decimal separator. diff --git a/framework/Web/Javascripts/js/validator.js b/framework/Web/Javascripts/js/validator.js index 38d8a2a4..8659d2e9 100644 --- a/framework/Web/Javascripts/js/validator.js +++ b/framework/Web/Javascripts/js/validator.js @@ -353,7 +353,7 @@ validator.manager.updateSummary(validator.group); this._isObserving[control.id+this.options.ID] = true; } }, -trim : function(value) +_trim : function(value) { return typeof(value) == "string" ? value.trim() : ""; }, @@ -393,20 +393,20 @@ getValidationValue : function(control) { case 'TDatePicker': if(control.type == "text") - return this.trim($F(control)); + return this._trim($F(control)); else { - this.observeDatePickerChanges(); + this._observeDatePickerChanges(); return Prado.WebUI.TDatePicker.getDropDownDate(control).getTime(); } default: - if(this.isListControlType()) - return this.getFirstSelectedListValue(); + if(this._isListControlType()) + return this._getFirstSelectedListValue(); else - return this.trim($F(control)); + return this._trim($F(control)); } }, -observeDatePickerChanges : function() +_observeDatePickerChanges : function() { if(Prado.Browser().ie) { @@ -416,11 +416,11 @@ this.observeChanges(DatePicker.getMonthListControl(this.control)); this.observeChanges(DatePicker.getYearListControl(this.control)); } }, -getSelectedValuesAndChecks : function(elements, initialValue) +_getSelectedValuesAndChecks : function(elements, initialValue) { var checked = 0; var values = []; -var isSelected = this.isCheckBoxType(elements[0]) ? 'checked' : 'selected'; +var isSelected = this._isCheckBoxType(elements[0]) ? 'checked' : 'selected'; elements.each(function(element) { if(element[isSelected] && element.value != initialValue) @@ -431,7 +431,7 @@ values.push(element.value); }); return {'checks' : checked, 'values' : values}; }, -getListElements : function() +_getListElements : function() { switch(this.options.ControlType) { @@ -440,7 +440,7 @@ var elements = []; for(var i = 0; i < this.options.TotalItems; i++) { var element = $(this.options.ControlToValidate+"_"+i); -if(this.isCheckBoxType(element)) +if(this._isCheckBoxType(element)) elements.push(element); } return elements; @@ -457,7 +457,7 @@ default: return []; } }, -isCheckBoxType : function(element) +_isCheckBoxType : function(element) { if(element && element.type) { @@ -466,18 +466,18 @@ return type == "checkbox" || type == "radio"; } return false; }, -isListControlType : function() +_isListControlType : function() { var list = ['TCheckBoxList', 'TRadioButtonList', 'TListBox']; return list.include(this.options.ControlType); }, -getFirstSelectedListValue : function() +_getFirstSelectedListValue : function() { var initial = ""; if(typeof(this.options.InitialValue) != "undefined") initial = this.options.InitialValue; -var elements = this.getListElements(); -var selection = this.getSelectedValuesAndChecks(elements, initial); +var elements = this._getListElements(); +var selection = this._getSelectedValuesAndChecks(elements, initial); return selection.values.length > 0 ? selection.values[0] : initial; } } @@ -493,7 +493,7 @@ return true; else { var a = this.getValidationValue(); -var b = this.trim(this.options.InitialValue); +var b = this._trim(this.options.InitialValue); return(a != b); } } @@ -595,16 +595,16 @@ Prado.WebUI.TListControlValidator = Class.extend(Prado.WebUI.TBaseValidator, { evaluateIsValid : function() { -var elements = this.getListElements(); +var elements = this._getListElements(); if(elements && elements.length <= 0) return true; this.observeListElements(elements); -var selection = this.getSelectedValuesAndChecks(elements); +var selection = this._getSelectedValuesAndChecks(elements); return this.isValidList(selection.checks, selection.values); }, observeListElements : function(elements) { -if(Prado.Browser().ie && this.isCheckBoxType(elements[0])) +if(Prado.Browser().ie && this._isCheckBoxType(elements[0])) { var validator = this; elements.each(function(element) @@ -640,3 +640,13 @@ required = this.options.Required.split(/,\s*/); return required; } }); +Prado.WebUI.TDataTypeValidator = Class.extend(Prado.WebUI.TBaseValidator, +{ +evaluateIsValid : function() +{ +var value = this.getValidationValue(); +if(value.length <= 0) +return true; +return this.convert(this.options.DataType, value) != null; +} +}); diff --git a/framework/Web/Javascripts/prado/validation3.js b/framework/Web/Javascripts/prado/validation3.js index 4c189532..40472e7e 100644 --- a/framework/Web/Javascripts/prado/validation3.js +++ b/framework/Web/Javascripts/prado/validation3.js @@ -667,9 +667,9 @@ Prado.WebUI.TBaseValidator.prototype = }, /** - * @return string trims the string value, empty string if value is not string. + * @return string _trims the string value, empty string if value is not string. */ - trim : function(value) + _trim : function(value) { return typeof(value) == "string" ? value.trim() : ""; }, @@ -720,25 +720,26 @@ Prado.WebUI.TBaseValidator.prototype = { case 'TDatePicker': if(control.type == "text") - return this.trim($F(control)); + return this._trim($F(control)); else { - this.observeDatePickerChanges(); + this._observeDatePickerChanges(); return Prado.WebUI.TDatePicker.getDropDownDate(control).getTime(); } default: - if(this.isListControlType()) - return this.getFirstSelectedListValue(); + if(this._isListControlType()) + return this._getFirstSelectedListValue(); else - return this.trim($F(control)); + return this._trim($F(control)); } }, /** * Observe changes in the drop down list date picker, IE only. + * @private */ - observeDatePickerChanges : function() + _observeDatePickerChanges : function() { if(Prado.Browser().ie) { @@ -753,12 +754,13 @@ Prado.WebUI.TBaseValidator.prototype = * Gets numeber selections and their values. * @return object returns selected values in values property * and number of selections in checks property. + * @private */ - getSelectedValuesAndChecks : function(elements, initialValue) + _getSelectedValuesAndChecks : function(elements, initialValue) { var checked = 0; var values = []; - var isSelected = this.isCheckBoxType(elements[0]) ? 'checked' : 'selected'; + var isSelected = this._isCheckBoxType(elements[0]) ? 'checked' : 'selected'; elements.each(function(element) { if(element[isSelected] && element.value != initialValue) @@ -774,8 +776,9 @@ Prado.WebUI.TBaseValidator.prototype = * Gets an array of the list control item input elements, for TCheckBoxList * checkbox inputs are returned, for TListBox HTML option elements are returned. * @return array list control option elements. + * @private */ - getListElements : function() + _getListElements : function() { switch(this.options.ControlType) { @@ -784,7 +787,7 @@ Prado.WebUI.TBaseValidator.prototype = for(var i = 0; i < this.options.TotalItems; i++) { var element = $(this.options.ControlToValidate+"_"+i); - if(this.isCheckBoxType(element)) + if(this._isCheckBoxType(element)) elements.push(element); } return elements; @@ -804,8 +807,9 @@ Prado.WebUI.TBaseValidator.prototype = /** * @return boolean true if element is of checkbox or radio type. + * @private */ - isCheckBoxType : function(element) + _isCheckBoxType : function(element) { if(element && element.type) { @@ -817,8 +821,9 @@ Prado.WebUI.TBaseValidator.prototype = /** * @return boolean true if control to validate is of some of the TListControl type. + * @private */ - isListControlType : function() + _isListControlType : function() { var list = ['TCheckBoxList', 'TRadioButtonList', 'TListBox']; return list.include(this.options.ControlType); @@ -826,14 +831,15 @@ Prado.WebUI.TBaseValidator.prototype = /** * @return string gets the first selected list value, initial value if none found. + * @private */ - getFirstSelectedListValue : function() + _getFirstSelectedListValue : function() { var initial = ""; if(typeof(this.options.InitialValue) != "undefined") initial = this.options.InitialValue; - var elements = this.getListElements(); - var selection = this.getSelectedValuesAndChecks(elements, initial); + var elements = this._getListElements(); + var selection = this._getSelectedValuesAndChecks(elements, initial); return selection.values.length > 0 ? selection.values[0] : initial; } } @@ -862,7 +868,7 @@ Prado.WebUI.TRequiredFieldValidator = Class.extend(Prado.WebUI.TBaseValidator, else { var a = this.getValidationValue(); - var b = this.trim(this.options.InitialValue); + var b = this._trim(this.options.InitialValue); return(a != b); } } @@ -1099,13 +1105,13 @@ Prado.WebUI.TListControlValidator = Class.extend(Prado.WebUI.TBaseValidator, */ evaluateIsValid : function() { - var elements = this.getListElements(); + var elements = this._getListElements(); if(elements && elements.length <= 0) return true; this.observeListElements(elements); - var selection = this.getSelectedValuesAndChecks(elements); + var selection = this._getSelectedValuesAndChecks(elements); return this.isValidList(selection.checks, selection.values); }, @@ -1114,7 +1120,7 @@ Prado.WebUI.TListControlValidator = Class.extend(Prado.WebUI.TBaseValidator, */ observeListElements : function(elements) { - if(Prado.Browser().ie && this.isCheckBoxType(elements[0])) + if(Prado.Browser().ie && this._isCheckBoxType(elements[0])) { var validator = this; elements.each(function(element) @@ -1165,6 +1171,25 @@ Prado.WebUI.TListControlValidator = Class.extend(Prado.WebUI.TBaseValidator, } }); - - +/** + * TDataTypeValidator verifies if the input data is of the type specified + * by DataType option. + * 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 option DateFormat + * will be used to determine how to parse the date string. + */ +Prado.WebUI.TDataTypeValidator = Class.extend(Prado.WebUI.TBaseValidator, +{ + evaluateIsValid : function() + { + var value = this.getValidationValue(); + if(value.length <= 0) + return true; + return this.convert(this.options.DataType, value) != null; + } +}); diff --git a/framework/Web/UI/WebControls/TDataTypeValidator.php b/framework/Web/UI/WebControls/TDataTypeValidator.php index d78be7bf..ebcaace7 100644 --- a/framework/Web/UI/WebControls/TDataTypeValidator.php +++ b/framework/Web/UI/WebControls/TDataTypeValidator.php @@ -98,6 +98,19 @@ class TDataTypeValidator extends TBaseValidator 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. diff --git a/framework/Web/UI/WebControls/TListControlValidator.php b/framework/Web/UI/WebControls/TListControlValidator.php index 9264e891..0d0940ab 100644 --- a/framework/Web/UI/WebControls/TListControlValidator.php +++ b/framework/Web/UI/WebControls/TListControlValidator.php @@ -1,5 +1,4 @@ TListControl that allows multiple selection. + * for a TListControl that allows multiple selection. * * You can specify the minimum or maximum (or both) number of selections * required using the {@link setMinSelection MinSelection} and @@ -37,9 +36,9 @@ Prado::using('System.Web.UI.WebControls.TBaseValidator'); * * * - * * * - "value1" must be selected and at least 1 other @@ -47,14 +46,14 @@ Prado::using('System.Web.UI.WebControls.TBaseValidator'); * * * - * + * * * - * + * ErrorMessage="Please select 'item1' and at least 1 other" /> * * * @author Xiang Wei Zhuo @@ -63,112 +62,115 @@ Prado::using('System.Web.UI.WebControls.TBaseValidator'); * @since 3.0 */ class TListControlValidator extends TBaseValidator -{ +{ /** - * @return int min number of selections + * @return integer min number of selections. Defaults to -1, meaning not set. */ - function getMinSelection() + public function getMinSelection() { - return $this->getViewState('MinSelection',''); + return $this->getViewState('MinSelection',-1); } - + /** - * @param int minimum number of selections. + * @param integer minimum number of selections. */ - function setMinSelection($value) + public function setMinSelection($value) { - $this->setViewState('MinSelection',$value,''); + if(($value=TPropertyValue::ensureInteger($value))<0) + $value=-1; + $this->setViewState('MinSelection',$value,-1); } - + /** - * @return int max number of selections + * @return integer max number of selections. Defaults to -1, meaning not set. */ - function getMaxSelection() + public function getMaxSelection() { - return $this->getViewState('MaxSelection',''); + return $this->getViewState('MaxSelection',-1); } - + /** - * @param int max number of selections. - */ - function setMaxSelection($value) + * @param integer max number of selections. + */ + public function setMaxSelection($value) { - $this->setViewState('MaxSelection',$value,''); + if(($value=TPropertyValue::ensureInteger($value))<0) + $value=-1; + $this->setViewState('MaxSelection',$value,-1); } /** * Get a comma separated list of required selected values. - * @return string comma separated list of required values. + * @return string comma separated list of required values. */ - function getRequiredSelections() + public function getRequiredSelections() { return $this->getViewState('RequiredSelections',''); } - + /** * Set the list of required values, using aa comma separated list. - * @param string comma separated list of required values. + * @param string comma separated list of required values. */ - function setRequiredSelections($value) + public function setRequiredSelections($value) { $this->setViewState('RequiredSelections',$value,''); - } - + } + /** * This method overrides the parent's implementation. * The validation succeeds if the input component changes its data * from the InitialValue or the input component is not given. * @return boolean whether the validation succeeds */ - public function evaluateIsValid() - { + protected function evaluateIsValid() + { $control=$this->getValidationTarget(); - + $exists = true; - list($count, $values) = $this->getSelection($control); + $values = $this->getSelection($control); + $count = count($values); $required = $this->getRequiredValues(); - + //if required, check the values if(!empty($required)) { - if(count($values) < count($required) ) + if($count < count($required) ) return false; foreach($required as $require) $exists = $exists && in_array($require, $values); } - + $min = $this->getMinSelection(); $max = $this->getMaxSelection(); - - if($min !== '' && $max !=- '') - return $exists && $count >= intval($min) && $count <= intval($max); - else if($min === '' && $max !== '') - return $exists && $count <= intval($max); - else if($min !== '' && $max === '') - return $exists && $count >= intval($min); - } - + + if($min !== -1 && $max !== -1) + return $exists && $count >= $min && $count <= $max; + else if($min === -1 && $max !== -1) + return $exists && $count <= $max; + else if($min !== -1 && $max === -1) + return $exists && $count >= $min; + else + return $exists; + } + /** * @param TListControl control to validate * @return array number of selected values and its values. */ protected function getSelection($control) { - $count = 0; $values = array(); //get the data foreach($control->getItems() as $item) { - if($item->getSelected()) - { - $count++; + if($item->getSelected()) $values[] = $item->getValue(); - } } - return array($count, $values); + return $values; } - + /** * @return array list of required values. */ @@ -180,7 +182,7 @@ class TListControlValidator extends TBaseValidator $required = preg_split('/,\s*/', $string); return $required; } - + /** * Returns an array of javascript validator options. * @return array javascript validator options. @@ -189,26 +191,26 @@ class TListControlValidator extends TBaseValidator { $options = parent::getClientScriptOptions(); $control = $this->getValidationTarget(); - + if(!$control instanceof TListControl) { throw new TConfigurationException( - 'tlistcontrolvalidator_invalid_control', + 'tlistcontrolvalidator_invalid_control', $this->getID(),$this->getControlToValidate(), get_class($control)); } - + $min = $this->getMinSelection(); $max = $this->getMaxSelection(); - if($min !== '') - $options['Min']= intval($min); - if($max !== '') - $options['Max']= intval($max); + if($min !== -1) + $options['Min']= $min; + if($max !== -1) + $options['Max']= $max; $required = $this->getRequiredSelections(); if(strlen($required) > 0) $options['Required']= $required; $options['TotalItems'] = $control->getItemCount(); return $options; - } + } } ?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TLiteral.php b/framework/Web/UI/WebControls/TLiteral.php index 35888676..f335499f 100644 --- a/framework/Web/UI/WebControls/TLiteral.php +++ b/framework/Web/UI/WebControls/TLiteral.php @@ -15,11 +15,14 @@ * * TLiteral displays a static text on the Web page. * TLiteral is similar to the TLabel control, except that the TLiteral - * control does not allow child controls and do not have style properties (e.g. BackColor, Font, etc.) + * control does not have style properties (e.g. BackColor, Font, etc.) * You can programmatically control the text displayed in the control by setting * the {@link setText Text} property. The text displayed may be HTML-encoded * if the {@link setEncode Encode} property is set true (defaults to false). * + * TLiteral will render the contents enclosed within its component tag + * if {@link setText Text} is empty. + * * Note, if {@link setEncode Encode} is false, make sure {@link setText Text} * does not contain unwanted characters that may bring security vulnerabilities. * @@ -76,6 +79,8 @@ class TLiteral extends TControl else $writer->write($text); } + else + parent::renderContents($writer); } } diff --git a/framework/Web/UI/WebControls/TTable.php b/framework/Web/UI/WebControls/TTable.php index fe01649c..4fcbb6fb 100644 --- a/framework/Web/UI/WebControls/TTable.php +++ b/framework/Web/UI/WebControls/TTable.php @@ -45,7 +45,7 @@ Prado::using('System.Web.UI.WebControls.TTableRow'); * * * - * + * * * The above can also be accomplished in code as follows, * -- cgit v1.2.3