From 769856093ded9e4aae341a7d79b7f1441e7d5478 Mon Sep 17 00:00:00 2001 From: wei <> Date: Fri, 1 Sep 2006 01:07:51 +0000 Subject: Add TActiveCustomValidator --- framework/Exceptions/messages.txt | 3 +- .../Web/Javascripts/js/compressed/validator.js | 7 +- framework/Web/Javascripts/js/debug/validator.js | 39 ++++++ framework/Web/Javascripts/prado/activecontrols3.js | 2 +- framework/Web/Javascripts/prado/validation3.js | 42 +++++++ .../UI/ActiveControls/TActiveCustomValidator.php | 134 +++++++++++++++++++++ framework/Web/UI/WebControls/TCustomValidator.php | 4 +- 7 files changed, 226 insertions(+), 5 deletions(-) create mode 100644 framework/Web/UI/ActiveControls/TActiveCustomValidator.php (limited to 'framework') diff --git a/framework/Exceptions/messages.txt b/framework/Exceptions/messages.txt index 13e1152f..dfa88750 100644 --- a/framework/Exceptions/messages.txt +++ b/framework/Exceptions/messages.txt @@ -344,4 +344,5 @@ xmltransform_transformpath_invalid = TXmlTransform.TransformPath '{0}' is inval xmltransform_documentpath_invalid = TXmlTransform.DocumentPath '{0}' is invalid. xmltransform_transform_required = Either TransformContent or TransformPath property must be set for TXmlTransform. -ttriggeredcallback_invalid_controlid = ControlID property for '{0}' must not be empty. \ No newline at end of file +ttriggeredcallback_invalid_controlid = ControlID property for '{0}' must not be empty. +tactivecustomvalidator_clientfunction_unsupported = {0} does not support client side validator function. \ No newline at end of file diff --git a/framework/Web/Javascripts/js/compressed/validator.js b/framework/Web/Javascripts/js/compressed/validator.js index 037abfeb..79b532e6 100644 --- a/framework/Web/Javascripts/js/compressed/validator.js +++ b/framework/Web/Javascripts/js/compressed/validator.js @@ -180,7 +180,12 @@ return true;switch(this.options.Operator) {case"NotEqual":return(op1!=op2);case"GreaterThan":return(op1>op2);case"GreaterThanEqual":return(op1>=op2);case"LessThan":return(op10) {validate=clientFunction.toFunction();return validate(this,value);} -return true;}});Prado.WebUI.TRangeValidator=Class.extend(Prado.WebUI.TBaseValidator,{evaluateIsValid:function() +return true;}});Prado.WebUI.TActiveCustomValidator=Class.extend(Prado.WebUI.TBaseValidator,{validatingValue:null,requestDispatched:false,evaluateIsValid:function() +{value=this.getValidationValue();if(!this.requestDispatched&&value!=this.validatingValue) +{this.validatingValue=value;request=new Prado.CallbackRequest(this.options.EventTarget,this.options);request.setParameter(value);request.setCausesValidation(false);request.options.onSuccess=this.callbackOnSuccess.bind(this);request.options.onFailure=this.callbackOnFailure.bind(this);request.dispatch();this.requestDispatched=true;return false;} +return this.isValid;},callbackOnSuccess:function(request,data) +{this.isValid=data;this.requestDispatched=false;Prado.Validation.validate(this.options.FormID,this.group,null);},callbackOnFailure:function(request,data) +{this.requestDispatched=false;}});Prado.WebUI.TRangeValidator=Class.extend(Prado.WebUI.TBaseValidator,{evaluateIsValid:function() {var value=this.getValidationValue();if(value.length<=0) return true;if(typeof(this.options.DataType)=="undefined") this.options.DataType="String";if(this.options.DataType!="StringLength") diff --git a/framework/Web/Javascripts/js/debug/validator.js b/framework/Web/Javascripts/js/debug/validator.js index ec57e876..72d9a01d 100644 --- a/framework/Web/Javascripts/js/debug/validator.js +++ b/framework/Web/Javascripts/js/debug/validator.js @@ -1100,6 +1100,45 @@ Prado.WebUI.TCustomValidator = Class.extend(Prado.WebUI.TBaseValidator, } }); +Prado.WebUI.TActiveCustomValidator = Class.extend(Prado.WebUI.TBaseValidator, +{ + validatingValue : null, + requestDispatched : false, + + /** + * Calls custom validation function. + */ + evaluateIsValid : function() + { + value = this.getValidationValue(); + if(!this.requestDispatched && value != this.validatingValue) + { + this.validatingValue = value; + request = new Prado.CallbackRequest(this.options.EventTarget, this.options); + request.setParameter(value); + request.setCausesValidation(false); + request.options.onSuccess = this.callbackOnSuccess.bind(this); + request.options.onFailure = this.callbackOnFailure.bind(this); + request.dispatch(); + this.requestDispatched = true; + return false; + } + return this.isValid; + }, + + callbackOnSuccess : function(request, data) + { + this.isValid = data; + this.requestDispatched = false; + Prado.Validation.validate(this.options.FormID, this.group,null); + }, + + callbackOnFailure : function(request, data) + { + this.requestDispatched = false; + } +}); + /** * TRangeValidator tests whether an input value is within a specified range. * diff --git a/framework/Web/Javascripts/prado/activecontrols3.js b/framework/Web/Javascripts/prado/activecontrols3.js index e5be1d49..01d8a41e 100644 --- a/framework/Web/Javascripts/prado/activecontrols3.js +++ b/framework/Web/Javascripts/prado/activecontrols3.js @@ -91,7 +91,7 @@ Prado.WebUI.TAutoComplete = Class.extend(Prado.WebUI.TAutoComplete, { if(!this.active) { - request = new Prado.CallbackRequest(options.EventTarget, options); + request = new Prado.CallbackRequest(this.options.EventTarget, options); request.dispatch(); Event.stop(event); } diff --git a/framework/Web/Javascripts/prado/validation3.js b/framework/Web/Javascripts/prado/validation3.js index 8df3864c..46db6381 100644 --- a/framework/Web/Javascripts/prado/validation3.js +++ b/framework/Web/Javascripts/prado/validation3.js @@ -1100,6 +1100,48 @@ Prado.WebUI.TCustomValidator = Class.extend(Prado.WebUI.TBaseValidator, } }); +/** + * Uses callback request to perform validation. + */ +Prado.WebUI.TActiveCustomValidator = Class.extend(Prado.WebUI.TBaseValidator, +{ + validatingValue : null, + requestDispatched : false, + + /** + * Calls custom validation function. + */ + evaluateIsValid : function() + { + value = this.getValidationValue(); + if(!this.requestDispatched && value != this.validatingValue) + { + this.validatingValue = value; + request = new Prado.CallbackRequest(this.options.EventTarget, this.options); + request.setParameter(value); + request.setCausesValidation(false); + request.options.onSuccess = this.callbackOnSuccess.bind(this); + request.options.onFailure = this.callbackOnFailure.bind(this); + request.dispatch(); + this.requestDispatched = true; + return false; + } + return this.isValid; + }, + + callbackOnSuccess : function(request, data) + { + this.isValid = data; + this.requestDispatched = false; + Prado.Validation.validate(this.options.FormID, this.group,null); + }, + + callbackOnFailure : function(request, data) + { + this.requestDispatched = false; + } +}); + /** * TRangeValidator tests whether an input value is within a specified range. * diff --git a/framework/Web/UI/ActiveControls/TActiveCustomValidator.php b/framework/Web/UI/ActiveControls/TActiveCustomValidator.php new file mode 100644 index 00000000..2964eaed --- /dev/null +++ b/framework/Web/UI/ActiveControls/TActiveCustomValidator.php @@ -0,0 +1,134 @@ + + * @link http://www.pradosoft.com/ + * @copyright Copyright © 2006 PradoSoft + * @license http://www.pradosoft.com/license/ + * @version $Revision: 31/08/2006 $ + * @package System.Web.UI.ActiveControls + */ + +/** + * TActiveCustomValidator Class + * + * Performs custom validation using only server-side {@link onServerValidate onServerValidate} + * validation event. The client-side uses callbacks to raise + * the {@link onServerValidate onServerValidate} event. + * + * Beware that the {@link onServerValidate onServerValidate} may be + * raised when the control to validate on the client side + * changes value, that is, the server validation may be called many times. + * + * After the callback or postback, the {@link onServerValidate onServerValidate} + * is raised once more. The {@link getIsCallback IsCallback} property + * will be true when validation is made during a callback request. + * + * @author Wei Zhuo + * @version $Revision: $ 31/08/2006 $ + * @package System.Web.UI.ActiveControls + * @since 3.1 + */ +class TActiveCustomValidator extends TCustomValidator + implements ICallbackEventHandler, IActiveControl +{ + /** + * @var boolean true if validation is made during a callback request. + */ + private $_isCallback = false; + + /** + * @return boolean true if validation is made during a callback request. + */ + public function getIsCallback() + { + return $this->_isCallback; + } + + /** + * Creates a new callback control, sets the adapter to + * TActiveControlAdapter. If you override this class, be sure to set the + * adapter appropriately by, for example, by calling this constructor. + */ + public function __construct() + { + parent::__construct(); + $this->setAdapter(new TActiveControlAdapter($this)); + } + + /** + * @return TBaseActiveCallbackControl standard callback control options. + */ + public function getActiveControl() + { + return $this->getAdapter()->getBaseActiveControl(); + } + + /** + * Client validation function is NOT supported. + */ + public function setClientValidationFunction($value) + { + throw new TNotSupportedException('tactivecustomvalidator_clientfunction_unsupported', + get_class($this)); + } + + /** + * Raises the callback event. This method is required by {@link + * ICallbackEventHandler} interface. The {@link onServerValidate + * OnServerValidate} event is raised first and then the + * {@link onCallback OnCallback} event. + * This method is mainly used by framework and control developers. + * @param TCallbackEventParameter the event parameter + */ + public function raiseCallbackEvent($param) + { + $this->_isCallback = true; + $result = $this->onServerValidate($param->getParameter()); + $param->setData($result); + $this->onCallback($param); + } + + /** + * This method is invoked when a callback is requested. The method raises + * 'OnCallback' event to fire up the event handlers. If you override this + * method, be sure to call the parent implementation so that the event + * handler can be invoked. + * @param TCallbackEventParameter event parameter to be passed to the event handlers + */ + public function onCallback($param) + { + $this->raiseEvent('OnCallback', $this, $param); + } + + /** + * Returns an array of javascript validator options. + * @return array javascript validator options. + */ + protected function getClientScriptOptions() + { + $options=TBaseValidator::getClientScriptOptions(); + $options['EventTarget'] = $this->getUniqueID(); + return $options; + } + + /** + * Register the javascript for the active custom validator. + */ + protected function registerClientScriptValidator() + { + $this->getActiveControl()->registerCallbackClientScript( + $this->getClientClassName(), $this->getClientScriptOptions()); + } + + /** + * @return string corresponding javascript class name for this this. + */ + protected function getClientClassName() + { + return 'Prado.WebUI.TActiveCustomValidator'; + } +} + +?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TCustomValidator.php b/framework/Web/UI/WebControls/TCustomValidator.php index 2afa48dc..cdef6f66 100644 --- a/framework/Web/UI/WebControls/TCustomValidator.php +++ b/framework/Web/UI/WebControls/TCustomValidator.php @@ -120,9 +120,9 @@ class TCustomValidator extends TBaseValidator $options['ClientValidationFunction']=$clientJs; return $options; } - + /** - * Only register the client-side validator if + * Only register the client-side validator if * {@link setClientValidationFunction ClientValidationFunction} is set. */ protected function registerClientScriptValidator() -- cgit v1.2.3