summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitattributes3
-rw-r--r--framework/Exceptions/messages.txt3
-rw-r--r--framework/Web/Javascripts/js/compressed/validator.js7
-rw-r--r--framework/Web/Javascripts/js/debug/validator.js39
-rw-r--r--framework/Web/Javascripts/prado/activecontrols3.js2
-rw-r--r--framework/Web/Javascripts/prado/validation3.js42
-rw-r--r--framework/Web/UI/ActiveControls/TActiveCustomValidator.php134
-rw-r--r--framework/Web/UI/WebControls/TCustomValidator.php4
-rw-r--r--tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.page38
-rw-r--r--tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.php11
-rw-r--r--tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.page2
11 files changed, 279 insertions, 6 deletions
diff --git a/.gitattributes b/.gitattributes
index 2606fb46..c8c0bdb7 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1750,6 +1750,7 @@ framework/Web/THttpSession.php -text
framework/Web/THttpUtility.php -text
framework/Web/UI/ActiveControls/TActiveButton.php -text
framework/Web/UI/ActiveControls/TActiveControlAdapter.php -text
+framework/Web/UI/ActiveControls/TActiveCustomValidator.php -text
framework/Web/UI/ActiveControls/TActiveLabel.php -text
framework/Web/UI/ActiveControls/TActivePageAdapter.php -text
framework/Web/UI/ActiveControls/TActivePanel.php -text
@@ -1881,6 +1882,8 @@ tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonListTest.
tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonListTest.php -text
tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonTest.page -text
tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonTest.php -text
+tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.page -text
+tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.php -text
tests/FunctionalTests/active-controls/protected/pages/CustomTemplateComponent.php -text
tests/FunctionalTests/active-controls/protected/pages/CustomTemplateComponent.tpl -text
tests/FunctionalTests/active-controls/protected/pages/CustomTemplateControlTest.page -text
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(op1<op2);case"LessThanEqual":return(op1<=op2);default:return(op1==op2);}}});Prado.WebUI.TCustomValidator=Class.extend(Prado.WebUI.TBaseValidator,{evaluateIsValid:function()
{var value=this.getValidationValue();var clientFunction=this.options.ClientValidationFunction;if(typeof(clientFunction)=="string"&&clientFunction.length>0)
{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
@@ -1101,6 +1101,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.
*
* TRangeValidator uses three key properties to perform its validation.
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 @@
+<?php
+/**
+ * TActiveCustomValidator class file.
+ *
+ * @author Wei Zhuo <weizhuo[at]gamil[dot]com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 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 <weizhuo[at]gmail[dot]com>
+ * @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()
diff --git a/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.page b/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.page
new file mode 100644
index 00000000..375ede75
--- /dev/null
+++ b/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.page
@@ -0,0 +1,38 @@
+<com:TForm ID="form1">
+<style>
+ .loader
+ {
+ position:absolute;
+ right:0px;
+ top:0px;
+ color:white;
+ background-color:#900;
+ padding: 0.5em 1em;
+ }
+ input.required
+ {
+ border: 1px solid red;
+ background-color: pink;
+ }
+</style>
+ <h1>Callback Custom Validator Test</h1>
+
+ <com:TTextBox ID="text1" />
+
+ <com:TActiveCustomValidator
+ ControlToValidate="text1"
+ ErrorMessage="*"
+ ControlCssClass="required"
+ OnServerValidate="validate_text1">
+ <prop:ActiveControl.ClientSide
+ OnLoading="Element.show('loader')"
+ OnComplete="Element.hide('loader')" />
+ </com:TActiveCustomValidator>
+
+ <com:TButton Text="Submit" />
+
+ <span id="loader" style="display:none;" onfocus="alert('ok')" class="loader">Loading...</span>
+
+ <com:TJavascriptLogger />
+
+</com:TForm> \ No newline at end of file
diff --git a/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.php b/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.php
new file mode 100644
index 00000000..bf8d730b
--- /dev/null
+++ b/tests/FunctionalTests/active-controls/protected/pages/CallbackCustomValidatorTest.php
@@ -0,0 +1,11 @@
+<?php
+
+class CallbackCustomValidatorTest extends TPage
+{
+ function validate_text1($sender, $param)
+ {
+ $param->IsValid = $param->Value == 'Prado';
+ }
+}
+
+?> \ No newline at end of file
diff --git a/tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.page b/tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.page
index b6b2d040..7010ca0f 100644
--- a/tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.page
+++ b/tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.page
@@ -53,7 +53,7 @@
ControlCssClass="required"
ErrorMessage="*" />
- <span id="loader" style="display:none;" class="loader">Loading...</span>
+ <span id="loader" style="display:none;" onfocus="alert('ok')" class="loader">Loading...</span>
<a href="#" id="link1">Edit</a>