summaryrefslogtreecommitdiff
path: root/framework/Web/UI
diff options
context:
space:
mode:
Diffstat (limited to 'framework/Web/UI')
-rw-r--r--framework/Web/UI/TClientScriptManager.php183
-rw-r--r--framework/Web/UI/WebControls/TBaseValidator.php65
-rw-r--r--framework/Web/UI/WebControls/TValidationSummary.php55
3 files changed, 197 insertions, 106 deletions
diff --git a/framework/Web/UI/TClientScriptManager.php b/framework/Web/UI/TClientScriptManager.php
index 015ef1c1..064ab34f 100644
--- a/framework/Web/UI/TClientScriptManager.php
+++ b/framework/Web/UI/TClientScriptManager.php
@@ -1,6 +1,6 @@
<?php
/**
- * TClientScriptManager class file
+ * TClientScriptManager and TClientSideOptions class file.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.pradosoft.com/
@@ -116,6 +116,15 @@ class TClientScriptManager extends TApplicationComponent
*/
public function registerPradoScript($name)
{
+ $this->registerPradoScriptInternal($name);
+
+ $params=func_get_args();
+ foreach($this->_page->getCachingStack() as $item)
+ $item->registerAction('Page.ClientScript','registerPradoScript',$params);
+ }
+
+ private function registerPradoScriptInternal($name)
+ {
if(!isset($this->_registeredPradoScripts[$name]))
{
$this->_registeredPradoScripts[$name]=true;
@@ -155,6 +164,21 @@ class TClientScriptManager extends TApplicationComponent
}
}
+ public function getCallbackReference($callbackHandler, $options=null)
+ {
+ $options = !is_array($options) ? array() : $options;
+ $class = new TReflectionClass($callbackHandler);
+ if($class->hasMethod('getClientSide'))
+ {
+ $clientSide = $callbackHandler->getClientSide();
+ $options = array_merge($options, $clientSide->getOptions()->toArray());
+ }
+ $optionString = TJavascript::encode($options);
+ $this->registerPradoScriptInternal('ajax');
+ $id = $callbackHandler->getUniqueID();
+ return "new Prado.CallbackRequest('{$id}',{$optionString})";
+ }
+
/**
* Registers postback javascript for a control.
* @param string javascript class responsible for the control being registered for postback
@@ -162,51 +186,63 @@ class TClientScriptManager extends TApplicationComponent
*/
public function registerPostBackControl($jsClass,$options)
{
- if(!isset($options['FormID']))
- $options['FormID']=$this->_page->getForm()->getClientID();
+ if(!isset($options['FormID']) && ($form=$this->_page->getForm())!==null)
+ $options['FormID']=$form->getClientID();
$optionString=TJavaScript::encode($options);
$code="new $jsClass($optionString);";
- $this->registerEndScript(sprintf('%08X', crc32($code)), $code);
- $this->registerHiddenField(TPage::FIELD_POSTBACK_TARGET,'');
- $this->registerHiddenField(TPage::FIELD_POSTBACK_PARAMETER,'');
+ $this->_endScripts[sprintf('%08X', crc32($code))]=$code;
+ $this->_hiddenFields[TPage::FIELD_POSTBACK_TARGET]='';
+ $this->_hiddenFields[TPage::FIELD_POSTBACK_PARAMETER]='';
+ $this->registerPradoScriptInternal('prado');
- $this->registerPradoScript('prado');
+ $params=func_get_args();
+ foreach($this->_page->getCachingStack() as $item)
+ $item->registerAction('Page.ClientScript','registerPostBackControl',$params);
}
/**
* Register a default button to panel. When the $panel is in focus and
* the 'enter' key is pressed, the $button will be clicked.
- * @param TControl panel to register the default button action
- * @param TControl button to trigger a postback
+ * @param string client ID of the container object
+ * @param string client ID of the button
*/
- public function registerDefaultButton($panel, $button)
+ public function registerDefaultButton($containerID, $buttonID)
{
- $options = TJavaScript::encode($this->getDefaultButtonOptions($panel, $button));
+ $options = TJavaScript::encode($this->getDefaultButtonOptions($containerID, $buttonID));
$code = "new Prado.WebUI.DefaultButton($options);";
- $this->registerEndScript("prado:".$panel->getClientID(), $code);
- $this->registerPradoScript('prado');
+
+ $this->_endScripts['prado:'.$containerID]=$code;
+ $this->registerPradoScriptInternal('prado');
+
+ $params=func_get_args();
+ foreach($this->_page->getCachingStack() as $item)
+ $item->registerAction('Page.ClientScript','registerDefaultButton',$params);
}
/**
* Registers the control to receive default focus.
- * @param TControl|string the control or the client ID of the HTML element to receive default focus
+ * @param string the client ID of the control to receive default focus
*/
public function registerFocusControl($target)
{
- $this->registerPradoScript('prado');
- if($target instanceof TControl)
- $target=$target->getClientID();
- $this->registerEndScript('prado:focus','Prado.Focus.setFocus("'.TJavaScript::quoteString($target).'");');
+ $this->registerPradoScriptInternal('prado');
+ $this->_endScripts['prado:focus']='Prado.Focus.setFocus("'.TJavaScript::quoteString($target).'");';
+
+ $params=func_get_args();
+ foreach($this->_page->getCachingStack() as $item)
+ $item->registerAction('Page.ClientScript','registerFocusControl',$params);
}
/**
+ * @param string client ID of the container object
+ * @param string client ID of the button
* @return array default button options.
*/
- protected function getDefaultButtonOptions($panel, $button)
+ protected function getDefaultButtonOptions($containerID, $buttonID)
{
- $options['Panel'] = $panel->getClientID();
- $options['Target'] = $button->getClientID();
+ $options['Panel'] = $containerID;
+ $options['Target'] = $buttonID;
$options['Event'] = 'click';
return $options;
}
@@ -219,6 +255,10 @@ class TClientScriptManager extends TApplicationComponent
public function registerStyleSheetFile($key,$url)
{
$this->_styleSheetFiles[$key]=$url;
+
+ $params=func_get_args();
+ foreach($this->_page->getCachingStack() as $item)
+ $item->registerAction('Page.ClientScript','registerStyleSheetFile',$params);
}
/**
@@ -229,6 +269,10 @@ class TClientScriptManager extends TApplicationComponent
public function registerStyleSheet($key,$css)
{
$this->_styleSheets[$key]=$css;
+
+ $params=func_get_args();
+ foreach($this->_page->getCachingStack() as $item)
+ $item->registerAction('Page.ClientScript','registerStyleSheet',$params);
}
/**
@@ -239,6 +283,10 @@ class TClientScriptManager extends TApplicationComponent
public function registerHeadScriptFile($key,$url)
{
$this->_headScriptFiles[$key]=$url;
+
+ $params=func_get_args();
+ foreach($this->_page->getCachingStack() as $item)
+ $item->registerAction('Page.ClientScript','registerHeadScriptFile',$params);
}
/**
@@ -249,6 +297,10 @@ class TClientScriptManager extends TApplicationComponent
public function registerHeadScript($key,$script)
{
$this->_headScripts[$key]=$script;
+
+ $params=func_get_args();
+ foreach($this->_page->getCachingStack() as $item)
+ $item->registerAction('Page.ClientScript','registerHeadScript',$params);
}
/**
@@ -258,8 +310,11 @@ class TClientScriptManager extends TApplicationComponent
*/
public function registerScriptFile($key,$url)
{
- if(!isset($this->_scriptFiles[$key]))
- $this->_scriptFiles[$key]=$url;
+ $this->_scriptFiles[$key]=$url;
+
+ $params=func_get_args();
+ foreach($this->_page->getCachingStack() as $item)
+ $item->registerAction('Page.ClientScript','registerScriptFile',$params);
}
/**
@@ -270,6 +325,10 @@ class TClientScriptManager extends TApplicationComponent
public function registerBeginScript($key,$script)
{
$this->_beginScripts[$key]=$script;
+
+ $params=func_get_args();
+ foreach($this->_page->getCachingStack() as $item)
+ $item->registerAction('Page.ClientScript','registerBeginScript',$params);
}
/**
@@ -280,6 +339,10 @@ class TClientScriptManager extends TApplicationComponent
public function registerEndScript($key,$script)
{
$this->_endScripts[$key]=$script;
+
+ $params=func_get_args();
+ foreach($this->_page->getCachingStack() as $item)
+ $item->registerAction('Page.ClientScript','registerEndScript',$params);
}
/**
@@ -290,8 +353,11 @@ class TClientScriptManager extends TApplicationComponent
*/
public function registerHiddenField($name,$value)
{
- if(!isset($this->_hiddenFields[$name]))
- $this->_hiddenFields[$name]=$value;
+ $this->_hiddenFields[$name]=$value;
+
+ $params=func_get_args();
+ foreach($this->_page->getCachingStack() as $item)
+ $item->registerAction('Page.ClientScript','registerHiddenField',$params);
}
/**
@@ -466,4 +532,71 @@ class TClientScriptManager extends TApplicationComponent
}
}
+/**
+ * TClientSideOptions abstract class.
+ *
+ * TClientSideOptions manages client-side options for components that have
+ * common client-side javascript behaviours and client-side events such as
+ * between ActiveControls and validators.
+ *
+ * @author <weizhuo[at]gmail[dot]com>
+ * @version $Revision: $ $Date: $
+ * @package System.Web.UI
+ * @since 3.0
+ */
+abstract class TClientSideOptions extends TComponent
+{
+ /**
+ * @var TMap list of client-side options.
+ */
+ private $_options;
+
+ /**
+ * Constructor, initialize the options list.
+ */
+ public function __construct()
+ {
+ $this->_options = Prado::createComponent('System.Collections.TMap');
+ }
+
+ /**
+ * Adds on client-side event handler by wrapping the code within a
+ * javascript function block. If the code begins with "javascript:", the
+ * code is assumed to be a javascript function block rather than arbiturary
+ * javascript statements.
+ * @param string option name
+ * @param string javascript statements.
+ */
+ protected function setFunction($name, $code)
+ {
+ $this->_options->add($name, $this->ensureFunction($code));
+ }
+
+ /**
+ * @return string gets a particular option, null if not set.
+ */
+ protected function getOption($name)
+ {
+ return $this->_options->itemAt($name);
+ }
+
+ /**
+ * @return TMap gets the list of options as TMap
+ */
+ public function getOptions()
+ {
+ return $this->_options;
+ }
+
+ /**
+ * Ensure that the javascript statements are wrapped in a javascript
+ * function block. Default has no wrapping. Override this method to
+ * customize the wrapping javascript function block.
+ */
+ protected function ensureFunction($javascript)
+ {
+ return $javascript;
+ }
+}
+
?> \ No newline at end of file
diff --git a/framework/Web/UI/WebControls/TBaseValidator.php b/framework/Web/UI/WebControls/TBaseValidator.php
index ea1a5836..e7eb7e33 100644
--- a/framework/Web/UI/WebControls/TBaseValidator.php
+++ b/framework/Web/UI/WebControls/TBaseValidator.php
@@ -80,9 +80,9 @@ abstract class TBaseValidator extends TLabel implements IValidator
*/
private $_registered=false;
/**
- * @var TValidatorClientScript validator client-script options.
+ * @var TClientSideValidatorOptions validator client-script options.
*/
- private $_clientScript;
+ private $_clientSide;
/**
* Constructor.
@@ -154,14 +154,14 @@ abstract class TBaseValidator extends TLabel implements IValidator
$options['ControlCssClass'] = $this->getControlCssClass();
$options['ControlType'] = get_class($control);
- if(!is_null($this->_clientScript))
- $options = array_merge($options,$this->_clientScript->getOptions());
+ if(!is_null($this->_clientSide))
+ $options = array_merge($options,$this->_clientSide->getOptions()->toArray());
return $options;
}
/**
- * Gets the TValidatorClientScript that allows modification of the client-
+ * Gets the TClientSideValidatorOptions that allows modification of the client-
* side validator events.
*
* The client-side validator supports the following events.
@@ -174,21 +174,21 @@ abstract class TBaseValidator extends TLabel implements IValidator
*
* You can attach custom javascript code to each of these events
*
- * @return TValidatorClientScript javascript validator event options.
+ * @return TClientSideValidatorOptions javascript validator event options.
*/
public function getClientSide()
{
- if(is_null($this->_clientScript))
- $this->_clientScript = $this->createClientScript();
- return $this->_clientScript;
+ if(is_null($this->_clientSide))
+ $this->_clientSide = $this->createClientSideOptions();
+ return $this->_clientSide;
}
/**
- * @return TValidatorClientScript javascript validator event options.
+ * @return TClientSideValidatorOptions javascript validator event options.
*/
- protected function createClientScript()
+ protected function createClientSideOptions()
{
- return new TValidatorClientScript;
+ return new TClientSideValidatorOptions;
}
/**
@@ -491,11 +491,11 @@ abstract class TBaseValidator extends TLabel implements IValidator
}
/**
- * TValidatorClientScript class.
+ * TClientSideValidatorOptions class.
*
* Client-side validator events can be modified through the {@link
* TBaseValidator::getClientSide ClientSide} property of a validator. The
- * subproperties of ClientSide are those of the TValidatorClientScript
+ * subproperties of ClientSide are those of the TClientSideValidatorOptions
* properties. The client-side validator supports the following events.
*
* The <tt>OnValidate</tt> event is raise before the validator validation
@@ -513,27 +513,14 @@ abstract class TBaseValidator extends TLabel implements IValidator
* @package System.Web.UI.WebControls
* @since 3.0
*/
-class TValidatorClientScript extends TComponent
+class TClientSideValidatorOptions extends TClientSideOptions
{
/**
- * @var TMap client-side validator event javascript code.
- */
- private $_options;
-
- /**
- * Constructor.
- */
- public function __construct()
- {
- $this->_options = new TMap;
- }
-
- /**
* @return string javascript code for client-side OnValidate event.
*/
public function getOnValidate()
{
- return $this->_options->itemAt['OnValidate'];
+ return $this->getOption('OnValidate');
}
/**
@@ -543,7 +530,7 @@ class TValidatorClientScript extends TComponent
*/
public function setOnValidate($javascript)
{
- $this->_options->add('OnValidate', $this->ensureFunction($javascript));
+ $this->getOptions()->add('OnValidate', $this->ensureFunction($javascript));
}
/**
@@ -553,7 +540,7 @@ class TValidatorClientScript extends TComponent
*/
public function setOnSuccess($javascript)
{
- $this->_options->add('OnSuccess', $this->ensureFunction($javascript));
+ $this->getOptions()->add('OnSuccess', $this->ensureFunction($javascript));
}
/**
@@ -561,7 +548,7 @@ class TValidatorClientScript extends TComponent
*/
public function getOnSuccess()
{
- return $this->_options->itemAt('OnSuccess');
+ return $this->getOption('OnSuccess');
}
/**
@@ -571,7 +558,7 @@ class TValidatorClientScript extends TComponent
*/
public function setOnError($javascript)
{
- $this->_options->add('OnError', $this->ensureFunction($javascript));
+ $this->getOptions()->add('OnError', $this->ensureFunction($javascript));
}
/**
@@ -579,15 +566,7 @@ class TValidatorClientScript extends TComponent
*/
public function getOnError()
{
- return $this->_options->itemAt('OnError');
- }
-
- /**
- * @return array list of client-side event code.
- */
- public function getOptions()
- {
- return $this->_options->toArray();
+ return $this->getOption('OnError');
}
/**
@@ -597,7 +576,7 @@ class TValidatorClientScript extends TComponent
* @param string javascript code.
* @return string javascript function code.
*/
- private function ensureFunction($javascript)
+ protected function ensureFunction($javascript)
{
if(TJavascript::isFunction($javascript))
return $javascript;
diff --git a/framework/Web/UI/WebControls/TValidationSummary.php b/framework/Web/UI/WebControls/TValidationSummary.php
index 87821292..49951e89 100644
--- a/framework/Web/UI/WebControls/TValidationSummary.php
+++ b/framework/Web/UI/WebControls/TValidationSummary.php
@@ -37,9 +37,9 @@
class TValidationSummary extends TWebControl
{
/**
- * @var TValidatorClientScript validator client-script options.
+ * @var TClientSideValidationSummaryOptions validation client side options.
*/
- private $_clientScript;
+ private $_clientSide;
/**
* Constructor.
@@ -248,30 +248,30 @@ class TValidationSummary extends TWebControl
$options['ValidationGroup'] = $this->getValidationGroup();
$options['Display'] = $this->getDisplay();
- if(!is_null($this->_clientScript))
- $options = array_merge($options,$this->_clientScript->getOptions());
+ if(!is_null($this->_clientSide))
+ $options = array_merge($options,$this->_clientSide->getOptions()->toArray());
return $options;
}
/**
- * @return TValidationSummaryClientScript client-side validation summary
+ * @return TClientSideValidationSummaryOptions client-side validation summary
* event options.
*/
public function getClientSide()
{
- if(is_null($this->_clientScript))
- $this->_clientScript = $this->createClientScript();
- return $this->_clientScript;
+ if(is_null($this->_clientSide))
+ $this->_clientSide = $this->createClientScript();
+ return $this->_clientSide;
}
/**
- * @return TValidationSummaryClientScript javascript validation summary
+ * @return TClientSideValidationSummaryOptions javascript validation summary
* event options.
*/
protected function createClientScript()
{
- return new TValidationSummaryClientScript;
+ return new TClientSideValidationSummaryOptions;
}
/**
* Get the list of validation error messages.
@@ -372,7 +372,7 @@ class TValidationSummary extends TWebControl
}
/**
- * TValidationSummaryClientScript class.
+ * TClientSideValidationSummaryOptions class.
*
* Client-side validation summary events such as {@link setOnHideSummary
* OnHideSummary} and {@link setOnShowSummary OnShowSummary} can be modified
@@ -392,27 +392,14 @@ class TValidationSummary extends TWebControl
* @package System.Web.UI.WebControls
* @since 3.0
*/
-class TValidationSummaryClientScript extends TComponent
+class TClientSideValidationSummaryOptions extends TClientSideOptions
{
/**
- * @var TMap client-side validation summary event javascript code.
- */
- private $_options;
-
- /**
- * Constructor.
- */
- public function __construct()
- {
- $this->_options = new TMap;
- }
-
- /**
* @return string javascript code for client-side OnHideSummary event.
*/
public function getOnHideSummary()
{
- return $this->_options->itemAt['OnHideSummary'];
+ return $this->getOption('OnHideSummary');
}
/**
@@ -423,7 +410,7 @@ class TValidationSummaryClientScript extends TComponent
*/
public function setOnHideSummary($javascript)
{
- $this->_options->add('OnHideSummary', $this->ensureFunction($javascript));
+ $this->getOptions()->add('OnHideSummary', $this->ensureFunction($javascript));
}
/**
@@ -434,7 +421,7 @@ class TValidationSummaryClientScript extends TComponent
*/
public function setOnShowSummary($javascript)
{
- $this->_options->add('OnShowSummary', $this->ensureFunction($javascript));
+ $this->getOptions()->add('OnShowSummary', $this->ensureFunction($javascript));
}
/**
@@ -442,15 +429,7 @@ class TValidationSummaryClientScript extends TComponent
*/
public function getOnShowSummary()
{
- return $this->_options->itemAt('OnShowSummary');
- }
-
- /**
- * @return array list of client-side event code.
- */
- public function getOptions()
- {
- return $this->_options->toArray();
+ return $this->getOption('OnShowSummary');
}
/**
@@ -460,7 +439,7 @@ class TValidationSummaryClientScript extends TComponent
* @param string javascript code.
* @return string javascript function code.
*/
- private function ensureFunction($javascript)
+ protected function ensureFunction($javascript)
{
if(TJavascript::isFunction($javascript))
return $javascript;