From c927f9343001b456c1fa25dc541c3f1b005510f8 Mon Sep 17 00:00:00 2001
From: wei <>
Date: Sat, 5 Aug 2006 03:42:04 +0000
Subject: Fixed #278
---
.gitattributes | 5 ++
HISTORY | 1 +
demos/quickstart/protected/controls/DocLink.php | 3 +-
.../Samples/TClientSideValidator/Home.page | 41 ++++++++++++++++
.../Controls/Samples/TClientSideValidator/Home.php | 23 +++++++++
.../protected/pages/Controls/Validation.page | 35 ++++++++++++++
framework/I18N/core/Gettext/MO.php | 1 +
framework/I18N/core/Gettext/PO.php | 1 +
framework/I18N/core/MessageSource_XLIFF.php | 1 +
framework/Web/Javascripts/js/validator.js | 3 +-
framework/Web/Javascripts/prado/validation3.js | 2 +
.../tickets/protected/pages/Ticket278.page | 42 +++++++++++++++++
.../tickets/protected/pages/Ticket278.php | 23 +++++++++
.../tickets/tests/Ticket278TestCase.php | 54 ++++++++++++++++++++++
14 files changed, 233 insertions(+), 2 deletions(-)
create mode 100644 demos/quickstart/protected/pages/Controls/Samples/TClientSideValidator/Home.page
create mode 100644 demos/quickstart/protected/pages/Controls/Samples/TClientSideValidator/Home.php
create mode 100644 tests/FunctionalTests/tickets/protected/pages/Ticket278.page
create mode 100644 tests/FunctionalTests/tickets/protected/pages/Ticket278.php
create mode 100644 tests/FunctionalTests/tickets/tests/Ticket278TestCase.php
diff --git a/.gitattributes b/.gitattributes
index 59691acb..59fc1a0d 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -854,6 +854,8 @@ demos/quickstart/protected/pages/Controls/Samples/TCheckBox/Home.page -text
demos/quickstart/protected/pages/Controls/Samples/TCheckBox/Home.php -text
demos/quickstart/protected/pages/Controls/Samples/TCheckBoxList/Home.page -text
demos/quickstart/protected/pages/Controls/Samples/TCheckBoxList/Home.php -text
+demos/quickstart/protected/pages/Controls/Samples/TClientSideValidator/Home.page -text
+demos/quickstart/protected/pages/Controls/Samples/TClientSideValidator/Home.php -text
demos/quickstart/protected/pages/Controls/Samples/TCompareValidator/Home.page -text
demos/quickstart/protected/pages/Controls/Samples/TCompareValidator/Home.php -text
demos/quickstart/protected/pages/Controls/Samples/TCustomValidator/Home.page -text
@@ -1631,6 +1633,8 @@ tests/FunctionalTests/tickets/protected/pages/Ticket239.php -text
tests/FunctionalTests/tickets/protected/pages/Ticket269.page -text
tests/FunctionalTests/tickets/protected/pages/Ticket27.page -text
tests/FunctionalTests/tickets/protected/pages/Ticket274.page -text
+tests/FunctionalTests/tickets/protected/pages/Ticket278.page -text
+tests/FunctionalTests/tickets/protected/pages/Ticket278.php -text
tests/FunctionalTests/tickets/protected/pages/Ticket28.page -text
tests/FunctionalTests/tickets/protected/pages/Ticket28.php -text
tests/FunctionalTests/tickets/protected/pages/Ticket284.page -text
@@ -1658,6 +1662,7 @@ tests/FunctionalTests/tickets/tests/Ticket191TestCase.php -text
tests/FunctionalTests/tickets/tests/Ticket21TestCase.php -text
tests/FunctionalTests/tickets/tests/Ticket239TestCase.php -text
tests/FunctionalTests/tickets/tests/Ticket274TestCase.php -text
+tests/FunctionalTests/tickets/tests/Ticket278TestCase.php -text
tests/FunctionalTests/tickets/tests/Ticket27TestCase.php -text
tests/FunctionalTests/tickets/tests/Ticket284TestCase.php -text
tests/FunctionalTests/tickets/tests/Ticket285TestCase.php -text
diff --git a/HISTORY b/HISTORY
index bb2026ca..8d3aa63f 100644
--- a/HISTORY
+++ b/HISTORY
@@ -20,6 +20,7 @@ ENH: Ticket#223 - Use TRequiredFieldValidator for TRadioButtons with GroupName p
ENH: StringLength, multi-byte, check in TRangeValidator (Wei)
ENH: Ticket#263 - TListBox and TDropDownList support optgroup now (Qiang)
ENH: Ticket#277 - Added TControl.CustomData property (Qiang)
+ENH: Ticket#278 - client-side validator enable/disable (conditional) (Wei)
ENH: Ticket#287 - TControl::broadcastEvent() may raise events now (Qiang)
ENH: Ticket#292 - Added THttpRequest::parseUrl() so that it is easier to be extended (Qiang)
ENH: Ticket#309 - Added THttpRequest.UrlParamSeparator property (Qiang)
diff --git a/demos/quickstart/protected/controls/DocLink.php b/demos/quickstart/protected/controls/DocLink.php
index 74398efb..e8ca7dfa 100644
--- a/demos/quickstart/protected/controls/DocLink.php
+++ b/demos/quickstart/protected/controls/DocLink.php
@@ -22,7 +22,8 @@ class DocLink extends THyperLink
{
$classFile=array_pop($paths).'.html';
$this->setNavigateUrl(self::BASE_URL . '/' . implode('.',$paths) . '/' . $classFile);
- $this->setText('API Manual');
+ if($this->getText() === '')
+ $this->setText('API Manual');
}
}
}
diff --git a/demos/quickstart/protected/pages/Controls/Samples/TClientSideValidator/Home.page b/demos/quickstart/protected/pages/Controls/Samples/TClientSideValidator/Home.page
new file mode 100644
index 00000000..e96e7c12
--- /dev/null
+++ b/demos/quickstart/protected/pages/Controls/Samples/TClientSideValidator/Home.page
@@ -0,0 +1,41 @@
+
+ Validator Toggle - Server and Client Side
+
+
+
+
+
+
+
+
+
+
+
+
+
+ validator.enabled = $("<%= $this->check1->ClientID %>").checked;
+
+
+
+
+
+
+
+
+ Event.OnLoad(function()
+ {
+ Event.observe("<%= $this->check1->ClientID %>", "click", function(ev)
+ {
+ $("<%= $this->panel1->ClientID %>").toggle();
+ });
+ });
+
+
\ No newline at end of file
diff --git a/demos/quickstart/protected/pages/Controls/Samples/TClientSideValidator/Home.php b/demos/quickstart/protected/pages/Controls/Samples/TClientSideValidator/Home.php
new file mode 100644
index 00000000..c5440996
--- /dev/null
+++ b/demos/quickstart/protected/pages/Controls/Samples/TClientSideValidator/Home.php
@@ -0,0 +1,23 @@
+Enabled = $this->check1->Checked;
+ }
+
+ function validate2_onPostValidate($sender, $param)
+ {
+ $sender->Enabled = true;
+ }
+
+ function onPreRender($param)
+ {
+ parent::onPreRender($param);
+ $this->panel1->Style =
+ $this->check1->Checked ? "display:block" : "display:none";
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/demos/quickstart/protected/pages/Controls/Validation.page b/demos/quickstart/protected/pages/Controls/Validation.page
index 12836b8c..2241f346 100644
--- a/demos/quickstart/protected/pages/Controls/Validation.page
+++ b/demos/quickstart/protected/pages/Controls/Validation.page
@@ -151,4 +151,39 @@ The summary can be displayed as a list, a bulleted list, or a single paragraph b
+Client and Server Side Conditional Validation
+
+ All validators contains the following events.
+
+ - The OnValidate event is raise before the validator validation functions are called.
+ - The OnSuccess event is raised after the validator has successfully validate the control.
+ - The OnError event is raised after the validator fails validation.
+
+ The corresponding events for the client side is available as sub-properties
+ of the ClientSide property of the validator.
+
+The following example pop-up a message saying "hello" when the validator fails on the client-side.
+
+<com:TRequiredFieldValidator ... >
+ <prop:ClientSide.OnError>
+ alert("hello");
+ </prop:ClientSide.OnError>
+</com:TRequiredFieldValidator>
+
+The resulting client-side event callback function is of the following form.
+
+function onErrorHandler(validator, sender)
+{
+ alert("hello");
+}
+
+Where validator is the current client-side validator and sender
+is the control that invoked the validator.
+
+Conditional Validation Example
+
+The following example show the use of client-side and server side validator events. The example
+demonstrates conditional validation.
+
+
\ No newline at end of file
diff --git a/framework/I18N/core/Gettext/MO.php b/framework/I18N/core/Gettext/MO.php
index f3be1a30..a93e956f 100644
--- a/framework/I18N/core/Gettext/MO.php
+++ b/framework/I18N/core/Gettext/MO.php
@@ -349,6 +349,7 @@ class TGettext_MO extends TGettext
// done
@flock($this->_handle, LOCK_UN);
@fclose($this->_handle);
+ chmod($file,0777);
return true;
}
}
diff --git a/framework/I18N/core/Gettext/PO.php b/framework/I18N/core/Gettext/PO.php
index 3c69c091..90942fa1 100644
--- a/framework/I18N/core/Gettext/PO.php
+++ b/framework/I18N/core/Gettext/PO.php
@@ -154,6 +154,7 @@ class TGettext_PO extends TGettext
//done
@flock($fh, LOCK_UN);
@fclose($fh);
+ chmod($file,0777);
return true;
}
}
diff --git a/framework/I18N/core/MessageSource_XLIFF.php b/framework/I18N/core/MessageSource_XLIFF.php
index 15af971a..7f2f27c5 100644
--- a/framework/I18N/core/MessageSource_XLIFF.php
+++ b/framework/I18N/core/MessageSource_XLIFF.php
@@ -481,6 +481,7 @@ class MessageSource_XLIFF extends MessageSource
if(!is_dir($dir))
throw new TException("Unable to create directory $dir");
file_put_contents($file, $this->getTemplate($catalogue));
+ chmod($file, 0777);
return array($variant, $file);
}
diff --git a/framework/Web/Javascripts/js/validator.js b/framework/Web/Javascripts/js/validator.js
index 0e39d191..cecc6881 100644
--- a/framework/Web/Javascripts/js/validator.js
+++ b/framework/Web/Javascripts/js/validator.js
@@ -96,7 +96,8 @@ control.addClassName(CssClass);}},hide:function()
{this.isValid=true;this.updateControl();this.visible=false;},validate:function(invoker)
{if(typeof(this.options.OnValidate)=="function")
this.options.OnValidate(this,invoker);if(this.enabled)
-this.isValid=this.evaluateIsValid();if(this.isValid)
+this.isValid=this.evaluateIsValid();else
+this.isValid=true;if(this.isValid)
{if(typeof(this.options.OnSuccess)=="function")
{this.visible=true;this.message.style.visibility="visible";this.updateControlCssClass(this.control,this.isValid);this.options.OnSuccess(this,invoker);}
else
diff --git a/framework/Web/Javascripts/prado/validation3.js b/framework/Web/Javascripts/prado/validation3.js
index b1b20722..139f99f1 100644
--- a/framework/Web/Javascripts/prado/validation3.js
+++ b/framework/Web/Javascripts/prado/validation3.js
@@ -652,6 +652,8 @@ Prado.WebUI.TBaseValidator.prototype =
if(this.enabled)
this.isValid = this.evaluateIsValid();
+ else
+ this.isValid = true;
if(this.isValid)
{
diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket278.page b/tests/FunctionalTests/tickets/protected/pages/Ticket278.page
new file mode 100644
index 00000000..75aed4d9
--- /dev/null
+++ b/tests/FunctionalTests/tickets/protected/pages/Ticket278.page
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ validator.enabled = $("<%= $this->check1->ClientID %>").checked;
+
+
+
+
+
+
+
+
+ Event.OnLoad(function()
+ {
+ Event.observe("<%= $this->check1->ClientID %>", "click", function(ev)
+ {
+ $("<%= $this->panel1->ClientID %>").toggle();
+ });
+ });
+
+
+
\ No newline at end of file
diff --git a/tests/FunctionalTests/tickets/protected/pages/Ticket278.php b/tests/FunctionalTests/tickets/protected/pages/Ticket278.php
new file mode 100644
index 00000000..1aadee77
--- /dev/null
+++ b/tests/FunctionalTests/tickets/protected/pages/Ticket278.php
@@ -0,0 +1,23 @@
+Enabled = $this->check1->Checked;
+ }
+
+ function validate2_onPostValidate($sender, $param)
+ {
+ $sender->Enabled = true;
+ }
+
+ function onPreRender($param)
+ {
+ parent::onPreRender($param);
+ $this->panel1->Style =
+ $this->check1->Checked ? "display:block" : "display:none";
+ }
+}
+
+?>
\ No newline at end of file
diff --git a/tests/FunctionalTests/tickets/tests/Ticket278TestCase.php b/tests/FunctionalTests/tickets/tests/Ticket278TestCase.php
new file mode 100644
index 00000000..bd631c14
--- /dev/null
+++ b/tests/FunctionalTests/tickets/tests/Ticket278TestCase.php
@@ -0,0 +1,54 @@
+open('tickets/index.php?page=Ticket278');
+ $this->assertTitle('Verifying Ticket 278');
+ $this->assertNotVisible($base.'validator1');
+ $this->assertNotVisible($base.'validator2');
+ $this->assertNotVisible($base.'panel1');
+
+ $this->click($base.'button1');
+ $this->assertVisible($base.'validator1');
+ $this->assertNotVisible($base.'validator2');
+
+ $this->type($base.'text1', 'asd');
+ $this->clickAndWait($base.'button1');
+ $this->assertNotVisible($base.'validator1');
+ $this->assertNotVisible($base.'validator2');
+ $this->assertNotVisible($base.'panel1');
+
+ $this->click($base.'check1');
+ $this->click($base.'button1');
+ $this->assertNotVisible($base.'validator1');
+ $this->assertVisible($base.'validator2');
+ $this->assertVisible($base.'panel1');
+
+
+ $this->type($base.'text1', '');
+ $this->type($base.'text2', 'asd');
+ $this->click($base.'button1');
+ $this->assertVisible($base.'validator1');
+ $this->assertNotVisible($base.'validator2');
+ $this->assertVisible($base.'panel1');
+
+
+ $this->type($base.'text1', 'asd');
+ $this->clickAndWait($base.'button1');
+ $this->assertNotVisible($base.'validator1');
+ $this->assertNotVisible($base.'validator2');
+ $this->assertVisible($base.'panel1');
+
+ $this->type($base.'text1', '');
+ $this->type($base.'text2', '');
+ $this->click($base.'button1');
+ $this->assertVisible($base.'validator1');
+ $this->assertVisible($base.'validator2');
+ $this->assertVisible($base.'panel1');
+ }
+}
+
+?>
\ No newline at end of file
--
cgit v1.2.3