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 ++++++++++++++ framework/Web/UI/WebControls/TCustomValidator.php | 161 ++++++++ .../UI/WebControls/TRegularExpressionValidator.php | 97 +++++ .../Web/UI/WebControls/TRequiredFieldValidator.php | 33 +- .../Web/UI/WebControls/TValidationSummary.php | 405 +++++++++++++++++++++ 5 files changed, 960 insertions(+), 2 deletions(-) create mode 100644 framework/Web/UI/WebControls/TCompareValidator.php create mode 100644 framework/Web/UI/WebControls/TCustomValidator.php create mode 100644 framework/Web/UI/WebControls/TRegularExpressionValidator.php create mode 100644 framework/Web/UI/WebControls/TValidationSummary.php (limited to 'framework/Web') 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 diff --git a/framework/Web/UI/WebControls/TCustomValidator.php b/framework/Web/UI/WebControls/TCustomValidator.php new file mode 100644 index 00000000..bf80e644 --- /dev/null +++ b/framework/Web/UI/WebControls/TCustomValidator.php @@ -0,0 +1,161 @@ + + * @version $Revision: 1.7 $ $Date: 2005/06/13 07:04:28 $ + * @package System.Web.UI.WebControls + */ + +/** + * TValidator class file + */ +require_once(dirname(__FILE__).'/TValidator.php'); + +/** + * TCustomValidator class + * + * TCustomValidator performs user-defined validation (either + * server-side or client-side or both) on an input component. + * + * To create a server-side validation function, provide a handler for + * the OnServerValidate event that performs the validation. + * The data string of the input component to validate can be accessed + * by the value property of the event parameter which is of type + * TServerValidateEventParameter. The result of the validation + * should be stored in the isValid property of the event parameter. + * + * To create a client-side validation function, add the client-side + * validation javascript function to the page template. + * The function should have the following signature: + * + * + * + * Use the ClientValidationFunction property to specify the name of + * the client-side validation script function associated with the TCustomValidator. + * + * Namespace: System.Web.UI.WebControls + * + * Properties + * - ClientValidationFunction, string, kept in viewstate + *
Gets or sets the name of the custom client-side script function used for validation. + * + * Events + * - OnServerValidate Occurs when validation is performed on the server. + *
Event delegates must set the event parameter TServerValidateEventParameter.isValid + * to false if they find the value is invalid. + * + * @author Qiang Xue + * @version v1.0, last update on 2004/08/13 21:44:52 + * @package System.Web.UI.WebControls + */ +class TCustomValidator extends TValidator +{ + /** + * @return string the name of the custom client-side script function used for validation. + */ + public function getClientValidationFunction() + { + return $this->getViewState('ClientValidationFunction',''); + } + + /** + * Sets the name of the custom client-side script function used for validation. + * @param string the script function name + */ + public function setClientValidationFunction($value) + { + $this->setViewState('ClientValidationFunction',$value,''); + } + + /** + * This method overrides the parent's implementation. + * The validation succeeds if {@link onServerValidate} returns true. + * @return boolean whether the validation succeeds + */ + public function evaluateIsValid() + { + $idPath=$this->getControlToValidate(); + if(strlen($idPath)) + { + $control=$this->getTargetControl($idPath); + $value=$control->getValidationPropertyValue($idPath); + return $this->onServerValidate($value); + } + else + return true; + } + + /** + * This method is invoked when the server side validation happens. + * It will raise the OnServerValidate event. + * The method also allows derived classes to handle the event without attaching a delegate. + * Note The derived classes should call parent implementation + * to ensure the OnServerValidate event is raised. + * @param string the value to be validated + * @return boolean whether the value is valid + */ + public function onServerValidate($value) + { + $param=new TServerValidateEventParameter; + $param->value=$value; + $param->isValid=true; + $this->raiseEvent('OnServerValidate',$this,$param); + return $param->isValid; + } + + /** + * Get a list of options for the client-side javascript validator + * @return array list of options for the validator + */ + protected function getJsOptions() + { + $options = parent::getJsOptions(); + $clientJs = $this->getClientValidationFunction(); + if(strlen($clientJs)) + $options['clientvalidationfunction']=$clientJs; + return $options; + } +} + +/** + * TServerValidateEventParameter class + * + * TServerValidateEventParameter encapsulates the parameter data for + * OnServerValidate event of TCustomValidator components. + * + * @author Qiang Xue + * @version v1.0, last update on 2004/08/13 21:44:52 + * @package System.Web.UI.WebControls + */ +class TServerValidateEventParameter extends TEventParameter +{ + /** + * the value to be validated + * @var string + */ + public $value=''; + /** + * whether the value is valid + * @var boolean + */ + public $isValid=true; +} +?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TRegularExpressionValidator.php b/framework/Web/UI/WebControls/TRegularExpressionValidator.php new file mode 100644 index 00000000..9fe0f778 --- /dev/null +++ b/framework/Web/UI/WebControls/TRegularExpressionValidator.php @@ -0,0 +1,97 @@ + + * @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'); + +/** + * TRegularExpressionValidator class + * + * TRegularExpressionValidator validates whether the value of an associated + * input component matches the pattern specified by a regular expression. + * + * You can specify the regular expression by setting the RegularExpression + * property. Some commonly used regular expressions include: + *
+ * French Phone Number: (0( \d|\d ))?\d\d \d\d(\d \d| \d\d )\d\d
+ * French Postal Code: \d{5}
+ * German Phone Number: ((\(0\d\d\) |(\(0\d{3}\) )?\d )?\d\d \d\d \d\d|\(0\d{4}\) \d \d\d-\d\d?)
+ * German Postal Code: (D-)?\d{5}
+ * Email Address: \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
+ * Internal URL: http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
+ * Japanese Phone Number: (0\d{1,4}-|\(0\d{1,4}\) ?)?\d{1,4}-\d{4}
+ * Japanese Postal Code: \d{3}(-(\d{4}|\d{2}))?
+ * P.R.C. Phone Number: (\(\d{3}\)|\d{3}-)?\d{8}
+ * P.R.C. Postal Code: \d{6}
+ * P.R.C. Social Security Number: \d{18}|\d{15}
+ * U.S. Phone Number: ((\(\d{3}\) ?)|(\d{3}-))?\d{3}-\d{4}
+ * U.S. ZIP Code: \d{5}(-\d{4})?
+ * U.S. Social Security Number: \d{3}-\d{2}-\d{4}
+ * 
+ * + * @author Qiang Xue + * @version $Revision: $ $Date: $ + * @package System.Web.UI.WebControls + * @since 3.0 + */ +class TRegularExpressionValidator extends TBaseValidator +{ + /** + * @return string the regular expression that determines the pattern used to validate a field. + */ + public function getRegularExpression() + { + return $this->getViewState('RegularExpression',''); + } + + /** + * Sets the regular expression that determines the pattern used to validate a field. + * @param string the regular expression + */ + public function setRegularExpression($value) + { + $this->setViewState('RegularExpression',$value,''); + } + + /** + * This method overrides the parent's implementation. + * The validation succeeds if the input data matches the regular expression. + * The validation always succeeds if ControlToValidate is not specified + * or the regular expression is empty, or the input data is empty. + * @return boolean whether the validation succeeds + */ + public function evaluateIsValid() + { + if(($control=$this->getValidationTarget())!==null) + { + if(($value=$this->getValidationValue($control))==='') + return true; + if(($expression=$this->getRegularExpression())!=='') + return preg_match("/^$expression\$/",$value); + else + return true; + } + else + throw new TInvalidDataValueException('regularexpressionvalidator_controltovalidate_invalid'); + } + + protected function getClientScriptOptions() + { + $options = parent::getClientScriptOptions(); + $options['validationexpression']=$this->getRegularExpression(); + return $options; + } +} + +?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TRequiredFieldValidator.php b/framework/Web/UI/WebControls/TRequiredFieldValidator.php index b30de607..c937abf8 100644 --- a/framework/Web/UI/WebControls/TRequiredFieldValidator.php +++ b/framework/Web/UI/WebControls/TRequiredFieldValidator.php @@ -1,5 +1,29 @@ + * @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'); + +/** + * TRequiredFieldValidator class + * + * + * @author Qiang Xue + * @version $Revision: $ $Date: $ + * @package System.Web.UI.WebControls + * @since 3.0 + */ class TRequiredFieldValidator extends TBaseValidator { public function getInitialValue() @@ -14,8 +38,13 @@ class TRequiredFieldValidator extends TBaseValidator protected function evaluateIsValid() { - $value=$this->getValidationValue($this->getValidationTarget()); - return trim($value)!==trim($this->getInitialValue()); + if(($control=$this->getValidationTarget())!==null) + { + $value=$this->getValidationValue($control); + return trim($value)!==trim($this->getInitialValue()); + } + else + throw new TInvalidDataValueException('requiredfieldvalidator_controltovalidate_invalid'); } protected function getClientScriptOptions() diff --git a/framework/Web/UI/WebControls/TValidationSummary.php b/framework/Web/UI/WebControls/TValidationSummary.php new file mode 100644 index 00000000..3810901b --- /dev/null +++ b/framework/Web/UI/WebControls/TValidationSummary.php @@ -0,0 +1,405 @@ + + * @version $Revision: 1.20 $ $Date: 2005/11/21 07:39:41 $ + * @package System.Web.UI.WebControls + */ + +/** + * TValidationSummary class + * + * TValidationSummary displays a summary of all validation errors inline on a Web page, + * in a message box, or both. The summary can be displayed as a list, as a bulleted list, + * or as a single paragraph based on the DisplayMode property. + * The summary can be displayed on the Web page and in a message box by setting + * the ShowSummary and ShowMessageBox properties, respectively. + * + * Namespace: System.Web.UI.WebControls + * + * Properties + * - DisplayMode, string, default=BulletList, kept in viewstate + *
Gets or sets the display mode (BulletList, List, SingleParagraph) of the validation summary. + * - HeaderText, string, kept in viewstate + *
Gets or sets the header text displayed at the top of the summary. + * - EnableClientScript, boolean, default=true, kept in viewstate + *
Gets or sets a value indicating whether the TValidationSummary component + * updates itself using client-side script. + * - ShowMessageBox, boolean, default=false, kept in viewstate + *
Gets or sets a value indicating whether the validation summary is displayed in a message box. + * If EnableClientScript is false, this property has no effect. + * - ShowSummary, boolean, default=true, kept in viewstate + *
Gets or sets a value indicating whether the validation summary is displayed inline. + * - Group, string, kept in viewstate + *
Gets or sets the validation group ID. + * + * @author Qiang Xue + * @version v1.0, last update on 2004/08/13 21:44:52 + * @package System.Web.UI.WebControls + */ +class TValidationSummary extends TWebControl +{ + + protected static $currentGroup; + + public static function setCurrentGroup($group) + { + self::$currentGroup = $group; + } + + public static function getCurrentGroup() + { + return self::$currentGroup; + } + + /** + * Overrides parent implementation to disable body addition. + * @param mixed the object to be added + * @return boolean + */ + public function allowBody($object) + { + return false; + } + + /** + * @return string the header text displayed at the top of the summary + */ + public function getHeaderText() + { + return $this->getViewState('HeaderText',''); + } + + /** + * Sets the header text to be displayed at the top of the summary + * @param string the header text + */ + public function setHeaderText($value) + { + $this->setViewState('HeaderText',$value,''); + } + + /** + * @return string the display mode (BulletList, List, SingleParagraph) of the validation summary. + */ + public function getDisplayMode() + { + return $this->getViewState('DisplayMode','BulletList'); + } + + /** + * Sets the display mode (BulletList, List, SingleParagraph) of the validation summary. + * @param string the display mode (BulletList, List, SingleParagraph) + */ + public function setDisplayMode($value) + { + if($value!='List' && $value!='SingleParagraph') + $value='BulletList'; + $this->setViewState('DisplayMode',$value,'BulletList'); + } + + /** + * @return boolean whether the TValidationSummary component updates itself using client-side script. + */ + public function isClientScriptEnabled() + { + return $this->getViewState('EnableClientScript',true); + } + + /** + * Sets the value whether the TValidationSummary component updates itself using client-side script. + * @param boolean whether the TValidationSummary component updates itself using client-side script. + */ + public function enableClientScript($value) + { + $this->setViewState('EnableClientScript',$value,true); + } + + /** + * @return boolean whether the validation summary is displayed in a message box. + */ + public function isShowMessageBox() + { + return $this->getViewState('ShowMessageBox',false); + } + + /** + * Sets the value whether the validation summary is displayed in a message box. + * @param boolean whether the validation summary is displayed in a message box. + */ + public function setShowMessageBox($value) + { + $this->setViewState('ShowMessageBox',$value,false); + } + + /** + * @return boolean whether the validation summary is displayed inline. + */ + public function isShowSummary() + { + return $this->getViewState('ShowSummary',true); + } + + /** + * Sets the value whether the validation summary is displayed inline. + * @param boolean whether the validation summary is displayed inline. + */ + public function setShowSummary($value) + { + $this->setViewState('ShowSummary',$value,true); + } + + /** + * @return boolean whether the validation summary should be anchored. + */ + public function isShowAnchor() + { + return $this->getViewState('ShowAnchor',false); + } + + /** + * Sets the value whether the validation summary should be anchored. + * @param boolean whether the validation summary should be anchored. + */ + public function setShowAnchor($value) + { + $this->setViewState('ShowAnchor',$value,false); + } + + /** + * Gets the valiation group. + * @param string validation group ID. + */ + public function getGroup() + { + return $this->getViewState('Group', ''); + } + + /** + * Sets the validation group. + * @param string ID of the validation group. + */ + public function setGroup($value) + { + $this->setViewState('Group', $value, ''); + } + + /** + * Sets the summary to auto-update on the client-side + * @param boolean true for automatic summary updates. + */ + public function setAutoUpdate($value) + { + $this->setViewState('AutoUpdate', $value, true); + } + + /** + * Gets the auto-update for this summary. + * @return boolean automatic client-side summary updates. + */ + public function isAutoUpdate() + { + return $this->getViewState('AutoUpdate', true); + } + + /** + * @return string the group which this validator belongs to + */ + public function getValidationGroup() + { + return $this->getViewState('ValidationGroup',''); + } + + /** + * @param string the group which this validator belongs to + */ + public function setValidationGroup($value) + { + $this->setViewState('ValidationGroup',$value,''); + } + + /** + * Get a list of validators considering the validation groups. + * @return array list of validators. + */ + protected function getValidators() + { + $groupID = $this->getGroup(); + if(empty($groupID)) return $this->getPage()->getValidators(); + + $parent = $this->getParent(); + $group = $parent->findObject($groupID); + + $validators = array(); + + foreach($group->getMembers() as $member) + { + $control = $parent->findObject($member); + if(!is_null($control)) + $validators[] = $control; + } + return $validators; + } + + /** + * Render the javascript for validation summary. + * @param array list of options for validation summary. + */ + protected function renderJsSummary($options) + { + if(!$this->isEnabled() || !$this->isClientScriptEnabled()) + return; + $option = TJavascript::toList($options); + $script = "new Prado.Validation.Summary({$option});"; + $this->Page->registerEndScript($this->ClientID, $script); + } + + /** + * Get a list of options for the client-side javascript validation summary. + * @return array list of options for the summary + */ + protected function getJsOptions() + { + $options['id'] = $this->ClientID; + $options['form'] = $this->Page->Form->ClientID; + if($this->isShowMessageBox()) + $options['showmessagebox']='True'; + if(!$this->isShowSummary()) + $options['showsummary']='False'; + + $options['headertext']=$this->getHeaderText(); + $options['displaymode']=$this->getDisplayMode(); + + $group = $this->getGroup(); + if(!empty($group)) + $options['group'] = $this->getParent()->findObject($group)->ClientID; + + $options['refresh'] = $this->isAutoUpdate(); + $options['validationgroup'] = $this->getValidationGroup(); + return $options; + } + + /** + * Get the list of validation error messages. + * @return array list of validator error messages. + */ + protected function getMessages() + { + $validators=$this->getValidators(); + $messages = array(); + foreach(array_keys($validators) as $i) + { + if(!$validators[$i]->isValid()) + { + $msg = $validators[$i]->getErrorMessage(); + if(strlen($msg)) + $messages[] = $validators[$i]->getAnchoredMessage($msg); + } + } + return $messages; + } + + /** + * Overrides parent implementation by rendering TValidationSummary-specific presentation. + * @return string the rendering result + */ + public function render() + { + + $this->renderJsSummary($this->getJsOptions()); + + $content = ""; + if($this->isRenderSummary()) + { + $this->setStyle('display:block'); + $messages = $this->getMessages(); + $headerText = $this->getHeaderText(); + switch($this->getDisplayMode()) + { + case 'List': + $content = $this->renderList($messages, $headerText); + break; + case 'SingleParagraph': + $content = $this->renderSingleParagraph($messages, $headerText); + break; + case 'BulletList': + default: + $content = $this->renderBulletList($messages, $headerText); + } + } + return "
renderAttributes()}>{$content}
"; + } + + protected function isRenderSummary() + { + $group = $this->getGroup(); + $active = TValidatorGroup::isGroupValidation() ? false : true; + if(!empty($group)) + $active = $this->getParent()->findObject($group)->isActive(); + $render = $this->isEnabled() && $active; + $render = $render && !$this->Page->isValid() && $this->isShowSummary(); + $current = self::getCurrentGroup(); + if(!is_null($current)) + $render = $render && $this->getValidationGroup() == $current; + return $render; + } + + /** + * Render the validation summary as a simple list. + * @param array list of messages + * @param string the header text + * @return string summary list + */ + protected function renderList($messages, $header) + { + $content = ''; + if(strlen($header)) + $content.= $header."
\n"; + foreach($messages as $message) + $content.="$message
\n"; + return $content; + } + + /** + * Render the validation summary as a paragraph. + * @param array list of messages + * @param string the header text + * @return string summary paragraph + */ + protected function renderSingleParagraph($messages, $header) + { + $content = $header; + foreach($messages as $message) + $content.= ' '.$message; + return $content; + } + + /** + * Render the validation summary as a bullet list. + * @param array list of messages + * @param string the header text + * @return string summary bullet list + */ + protected function renderBulletList($messages, $header) + { + $content = $header; + $show = count($messages) > 0; + if($show) $content .= "
    \n"; + foreach($messages as $message) + $content.= '
  • '.$message."
  • \n"; + if($show) $content .= "
\n"; + return $content; + } +} + +?> \ No newline at end of file -- cgit v1.2.3