From 4aa1f46fcb508271b09cb5736d8bd0ef7206941d Mon Sep 17 00:00:00 2001 From: wei <> Date: Thu, 27 Apr 2006 08:39:55 +0000 Subject: Added client-side events to client-side validators. see tests/FunctionalTests/features/index.php?page=ValidatorEffects --- framework/Web/UI/WebControls/TBaseValidator.php | 111 ++++++++++++++++++++++++ framework/Web/UI/WebControls/TClientScript.php | 75 ++++++++++++++++ 2 files changed, 186 insertions(+) create mode 100644 framework/Web/UI/WebControls/TClientScript.php (limited to 'framework/Web/UI/WebControls') diff --git a/framework/Web/UI/WebControls/TBaseValidator.php b/framework/Web/UI/WebControls/TBaseValidator.php index adbc85ae..4ca4c1f6 100644 --- a/framework/Web/UI/WebControls/TBaseValidator.php +++ b/framework/Web/UI/WebControls/TBaseValidator.php @@ -41,6 +41,10 @@ * and {@link setText Text} are empty, the body content of the validator will * be displayed. Error display is controlled by {@link setDisplay Display} property. * + * You can also customized the client-side behaviour by adding javascript + * code to the subproperties of the {@link getClientValidation ClientValidation} + * property. + * * You can also place a {@link TValidationSummary} control on a page to display error messages * from the validators together. In this case, only the {@link setErrorMessage ErrorMessage} * property of the validators will be displayed in the {@link TValidationSummary} control. @@ -75,6 +79,8 @@ abstract class TBaseValidator extends TLabel implements IValidator * @var boolean whether the validator has been registered with the page */ private $_registered=false; + + private $_clientScript; /** * Constructor. @@ -145,8 +151,43 @@ abstract class TBaseValidator extends TLabel implements IValidator $options['ControlToValidate'] = $control->getClientID(); $options['ControlCssClass'] = $this->getControlCssClass(); $options['ControlType'] = get_class($control); + + if(!is_null($this->_clientScript)) + $options = array_merge($options,$this->_clientScript->getOptions()); + return $options; } + + /** + * Gets the TValidatorClientScript that allows modification of the client- + * side validator events. + * + * The client-side validator supports the following events. + * # OnValidate -- raised before client-side validation is + * executed. + * # OnSuccess -- raised after client-side validation is completed + * and is successfull, overrides default validator error messages updates. + * # OnError -- raised after client-side validation is completed + * and failed, overrides default validator error message updates. + * + * You can attach custom javascript code to each of these events + * + * @return TValidatorClientScript javascript validator event options. + */ + public function getClientValidation() + { + if(is_null($this->_clientScript)) + $this->_clientScript = $this->createClientScript(); + return $this->_clientScript; + } + + /** + * @return TValidatorClientScript javascript validator event options. + */ + protected function createClientScript() + { + return new TValidatorClientScript($this->getPage()->getClientScript()); + } /** * Renders the javascript code to the end script. @@ -446,4 +487,74 @@ abstract class TBaseValidator extends TLabel implements IValidator parent::renderContents($writer); } } + +/** + * TValidatorClientScript class. + * + * @todo Add doc to quickstart and classes. + * + * @author Wei Zhuo + * @version $Revision: $ $Date: $ + * @package System.Web.UI.WebControls + * @since 3.0 + */ +class TValidatorClientScript extends TComponent +{ + private $_options; + private $_manager; + private $_effectsEnabled = false; + + public function __construct($manager) + { + $this->_options = new TMap; + $this->_manager = $manager; + } + + public function getOnValidate() + { + return $this->_options->itemAt['OnValidate']; + } + + public function setOnValidate($javascript) + { + $this->_options->add('OnValidate', $this->ensureFunction($javascript)); + } + + public function setOnSuccess($javascript) + { + $this->_options->add('OnSuccess', $this->ensureFunction($javascript)); + } + + public function getOnSuccess() + { + return $this->_options->itemAt('OnSuccess'); + } + + public function setOnError($javascript) + { + $this->_options->add('OnError', $this->ensureFunction($javascript)); + } + + public function getOnError() + { + return $this->_options->itemAt('OnError'); + } + + public function getOptions() + { + return $this->_options->toArray(); + } + + private function ensureFunction($javascript) + { + if(TJavascript::isFunction($javascript)) + return $javascript; + else + { + $code = "function(validator, invoker){ {$javascript} }"; + return TJavascript::quoteFunction($code); + } + } +} + ?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TClientScript.php b/framework/Web/UI/WebControls/TClientScript.php new file mode 100644 index 00000000..23aa1425 --- /dev/null +++ b/framework/Web/UI/WebControls/TClientScript.php @@ -0,0 +1,75 @@ + + * @link http://www.pradosoft.com/ + * @copyright Copyright © 2005 PradoSoft + * @license http://www.pradosoft.com/license/ + * @version $Revision: $ $Date: $ + * @package System.Web.UI.WebControls + */ + +/** + * TClientScript class + * + * Allows importing of Prado Client Scripts from template via the + * {@link setUsingPradoScripts UsingPradoScripts} property. Multiple Prado + * client-scripts can be specified using comma delimited string of the + * javascript library to include on the page. For example, + * + * + * + * + * + * @TODO May be use it to include stylesheets as well. + * + * @author Wei Zhuo + * @version $Revision: $ $Date: $ + * @package System.Web.UI.WebControls + * @since 3.0 + */ +class TClientScript extends TControl +{ + /** + * @return string comma delimited list of javascript libraries to included + * on the page. + */ + public function getUsingPradoScripts() + { + return $this->getViewState('PradoScripts', ''); + } + + /** + * Include javascript library to the current page. The current supported + * libraries are: "prado", "effects", "ajax", "validator", "logger", + * "datepicker", "rico", "colorpicker". Library dependencies are + * automatically resolved. + * + * @param string comma delimited list of javascript libraries to include. + */ + public function setUsingPradoScripts($value) + { + $this->setViewState('PradoScripts', $value, ''); + } + + /** + * Calls the client script manager to add each of the requested client + * script libraries. + * @param mixed event parameter + */ + public function onPreRender($param) + { + parent::onPreRender($param); + $scripts = preg_split('/,|\s+/', $this->getUsingPradoScripts()); + $cs = $this->getPage()->getClientScript(); + foreach($scripts as $script) + { + $script = trim($script); + if(strlen($script) > 0) + $cs->registerPradoScript($script); + } + } +} + +?> \ No newline at end of file -- cgit v1.2.3