summaryrefslogtreecommitdiff
path: root/framework
diff options
context:
space:
mode:
authorwei <>2006-06-15 00:56:57 +0000
committerwei <>2006-06-15 00:56:57 +0000
commit67e09d150afe55d7a956beb299dc0534f7da68eb (patch)
tree793669c130d7cb17b56b75fb42fe1fac07c5fccc /framework
parent469fe68e8a08330cb0ed8b56f758bee8d7c9445e (diff)
Update active controls. Add comments. Add THttpResponseAdapter
Diffstat (limited to 'framework')
-rw-r--r--framework/Web/THttpResponse.php69
-rw-r--r--framework/Web/THttpResponseAdapter.php69
-rw-r--r--framework/Web/UI/ActiveControls/TActiveButton.php61
-rw-r--r--framework/Web/UI/ActiveControls/TActiveControlAdapter.php2
-rw-r--r--framework/Web/UI/ActiveControls/TActiveLabel.php16
-rw-r--r--framework/Web/UI/ActiveControls/TActivePageAdapter.php70
-rw-r--r--framework/Web/UI/ActiveControls/TActivePanel.php2
-rw-r--r--framework/Web/UI/ActiveControls/TActiveTextBox.php2
-rw-r--r--framework/Web/UI/ActiveControls/TAutoComplete.php29
-rw-r--r--framework/Web/UI/ActiveControls/TBaseActiveControl.php128
-rw-r--r--framework/Web/UI/ActiveControls/TCallback.php23
-rw-r--r--framework/Web/UI/ActiveControls/TCallbackOptions.php2
-rwxr-xr-xframework/Web/UI/ActiveControls/TCallbackResponseAdapter.php65
13 files changed, 437 insertions, 101 deletions
diff --git a/framework/Web/THttpResponse.php b/framework/Web/THttpResponse.php
index 6ee23cf2..0c9406c4 100644
--- a/framework/Web/THttpResponse.php
+++ b/framework/Web/THttpResponse.php
@@ -11,6 +11,11 @@
*/
/**
+ * Includes the THttpResponse adapter.
+ */
+Prado::using('System.Web.THttpResponseAdapter');
+
+/**
* THttpResponse class
*
* THttpResponse implements the mechanism for sending output to client users.
@@ -70,7 +75,11 @@ class THttpResponse extends TModule implements ITextWriter
* @var string character set, e.g. UTF-8
*/
private $_charset='';
-
+ /**
+ * @var THttpResponseAdapter adapter.
+ */
+ private $_adapter;
+
/**
* Destructor.
* Flushes any existing content in buffer.
@@ -80,6 +89,30 @@ class THttpResponse extends TModule implements ITextWriter
//if($this->_bufferOutput)
// @ob_end_flush();
}
+
+ /**
+ * @param THttpResponseAdapter response adapter
+ */
+ public function setAdapter(THttpResponseAdapter $adapter)
+ {
+ $this->_adapter=$adapter;
+ }
+
+ /**
+ * @return THttpResponseAdapter response adapter, null if not exist.
+ */
+ public function getAdapter()
+ {
+ return $this->_adapter;
+ }
+
+ /**
+ * @return boolean true if adapter exists, false otherwise.
+ */
+ public function getHasAdapter()
+ {
+ return !is_null($this->_adapter);
+ }
/**
* Initializes the module.
@@ -215,7 +248,7 @@ class THttpResponse extends TModule implements ITextWriter
{
echo $str;
}
-
+
/**
* Sends a file back to user.
* Make sure not to output anything else after calling this method.
@@ -295,14 +328,25 @@ class THttpResponse extends TModule implements ITextWriter
}
/**
- * Outputs the buffered content, sends content-type and charset header.
+ * Flush the response contents and headers.
*/
public function flush()
{
+ if($this->getHasAdapter())
+ $this->_adapter->flushContent();
+ else
+ $this->flushContent();
+ }
+
+ /**
+ * Outputs the buffered content, sends content-type and charset header.
+ */
+ public function flushContent()
+ {
Prado::trace("Flushing output",'System.Web.THttpResponse');
$this->sendContentTypeHeader();
if($this->_bufferOutput)
- ob_flush();
+ ob_flush();
}
/**
@@ -419,8 +463,21 @@ class THttpResponse extends TModule implements ITextWriter
public function createHtmlWriter($type=null)
{
if($type===null)
- $type=$this->_htmlWriterType;
- return Prado::createComponent($type,$this);
+ $type=$this->getHtmlWriterType();
+ if($this->getHasAdapter())
+ return $this->_adapter->createNewHtmlWriter($type, $this);
+ else
+ return $this->createNewHtmlWriter($type, $this);
+ }
+
+ /**
+ * Create a new html writer intance.
+ * @param string type of HTML writer to be created.
+ * @param ITextWriter text writer holding the contents.
+ */
+ public function createNewHtmlWriter($type, $writer)
+ {
+ return Prado::createComponent($type, $writer);
}
}
diff --git a/framework/Web/THttpResponseAdapter.php b/framework/Web/THttpResponseAdapter.php
new file mode 100644
index 00000000..6931eda8
--- /dev/null
+++ b/framework/Web/THttpResponseAdapter.php
@@ -0,0 +1,69 @@
+<?php
+/**
+ * THttpResponseAdatper class
+ *
+ * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 2005 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @version $Revision: $ $Date: $
+ * @package System.Web
+ */
+
+/**
+ * THttpResponseAdapter class.
+ *
+ * THttpResponseAdapter allows the base http response class to change behaviour
+ * without change the class hierachy.
+ *
+ * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version : $ Fri Jun 16 07:03:03 EST 2006 $
+ * @package System.Web
+ * @since 3.0
+ */
+class THttpResponseAdapter extends TApplicationComponent
+{
+ /**
+ * @var THttpResponse the response object the adapter is attached.
+ */
+ private $_response;
+
+ /**
+ * Constructor. Attach a response to be adapted.
+ * @param THttpResponse the response object the adapter is to attach to.
+ */
+ public function __construct($response)
+ {
+ $this->_response=$response;
+ }
+
+ /**
+ * @return THttpResponse the response object adapted.
+ */
+ public function getResponse()
+ {
+ return $this->_response;
+ }
+
+ /**
+ * This method is invoked when the response flushes the content and headers.
+ * Default implementation calls the attached response flushContent method.
+ */
+ public function flushContent()
+ {
+ $this->_response->flushContent();
+ }
+
+ /**
+ * This method is invoked when a new HtmlWriter needs to be created.
+ * Default implementation calls the attached response createNewHtmlWriter method.
+ * @param string type of the HTML writer to be created.
+ * @param ITextWriter the writer responsible for holding the content.
+ */
+ public function createNewHtmlWriter($type, $writer)
+ {
+ return $this->_response->createNewHtmlWriter($type,$writer);
+ }
+}
+
+?> \ No newline at end of file
diff --git a/framework/Web/UI/ActiveControls/TActiveButton.php b/framework/Web/UI/ActiveControls/TActiveButton.php
index 84db60fc..f4bfc678 100644
--- a/framework/Web/UI/ActiveControls/TActiveButton.php
+++ b/framework/Web/UI/ActiveControls/TActiveButton.php
@@ -1,8 +1,33 @@
<?php
-/*
- * Created on 5/05/2006
+/**
+ * TActiveButton 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: $ $Date: $
+ * @package System.Web.UI.WebControls
*/
+/**
+ * TActiveButton is the active control counter part to TButton.
+ *
+ * When a TActiveButton is clicked, rather than a normal post back request a
+ * callback request is initiated.
+ *
+ * The {@link onCallback OnCallback} event is raised during a callback request
+ * and it is raise before the {@link onClick OnClick} event.
+ *
+ * When the {@link TBaseActiveCallbackControl::setEnableUpdate ActiveControl.EnableUpdate}
+ * property is true, changing the {@link setText Text} property during callback request
+ * will update the button's caption upon callback response completion.
+ *
+ * @author Wei Zhuo <weizhuo[at]gamil[dot]com>
+ * @version $Revision: $ $Date: $
+ * @package System.Web.UI.ActiveControls
+ * @since 3.0
+ */
class TActiveButton extends TButton implements ICallbackEventHandler
{
/**
@@ -17,11 +42,11 @@ class TActiveButton extends TButton implements ICallbackEventHandler
}
/**
- * @return TBaseActiveCallbackControl base callback options.
+ * @return TBaseActiveCallbackControl standard callback control options.
*/
public function getActiveControl()
{
- return $this->getAdapter()->getActiveControl();
+ return $this->getAdapter()->getBaseActiveControl();
}
/**
@@ -29,14 +54,14 @@ class TActiveButton extends TButton implements ICallbackEventHandler
* ICallbackEventHandler} interface. If {@link getCausesValidation
* CausesValidation} is true, it will invoke the page's {@link TPage::
* validate validate} method first. It will raise {@link onCallback
- * OnCallback} event and then the {@link onClick OnClick} event. This method
- * is mainly used by framework and control developers.
+ * OnCallback} event first and then the {@link onClick OnClick} event.
+ * This method is mainly used by framework and control developers.
* @param TCallbackEventParameter the event parameter
*/
public function raiseCallbackEvent($param)
{
- $this->raisePostBackEvent($param);
$this->onCallback($param);
+ $this->raisePostBackEvent($param);
}
/**
@@ -51,7 +76,9 @@ class TActiveButton extends TButton implements ICallbackEventHandler
$this->raiseEvent('OnCallback', $this, $param);
}
- /**
+ /**
+ * Updates the button text on the client-side if the
+ * {@link setEnableUpdate EnableUpdate} property is set to true.
* @param string caption of the button
*/
public function setText($value)
@@ -62,17 +89,31 @@ class TActiveButton extends TButton implements ICallbackEventHandler
}
/**
- * Renders the callback control javascript statement.
+ * Override parent implementation, no javascript is rendered here instead
+ * the javascript required for active control is registered in {@link addAttributesToRender}.
*/
protected function renderClientControlScript($writer)
{
}
+ /**
+ * Ensure that the ID attribute is rendered and registers the javascript code
+ * for initializing the active control.
+ */
protected function addAttributesToRender($writer)
{
parent::addAttributesToRender($writer);
$writer->addAttribute('id',$this->getClientID());
- $this->getActiveControl()->registerCallbackClientScript($this->getPostBackOptions());
+ $this->getActiveControl()->registerCallbackClientScript(
+ $this->getClientClassName(), $this->getPostBackOptions());
+ }
+
+ /**
+ * @return string corresponding javascript class name for this TActiveButton.
+ */
+ protected function getClientClassName()
+ {
+ return 'Prado.WebUI.TActiveButton';
}
/**
diff --git a/framework/Web/UI/ActiveControls/TActiveControlAdapter.php b/framework/Web/UI/ActiveControls/TActiveControlAdapter.php
index af4131ea..ab842976 100644
--- a/framework/Web/UI/ActiveControls/TActiveControlAdapter.php
+++ b/framework/Web/UI/ActiveControls/TActiveControlAdapter.php
@@ -59,7 +59,7 @@ class TActiveControlAdapter extends TControlAdapter
}
}
- public function getActiveControl()
+ public function getBaseActiveControl()
{
if(is_null($this->_baseActiveControl))
{
diff --git a/framework/Web/UI/ActiveControls/TActiveLabel.php b/framework/Web/UI/ActiveControls/TActiveLabel.php
index fd2d49b8..c1cb1fba 100644
--- a/framework/Web/UI/ActiveControls/TActiveLabel.php
+++ b/framework/Web/UI/ActiveControls/TActiveLabel.php
@@ -13,11 +13,12 @@
/**
* TActiveLabel class
*
- * The active control counterpart of TLabel component. During a callback
- * request, setting {@link setText Text} property will also set the text of the
- * label on the client upon callback completion. Similarly, setting {@link
- * setForControl ForControl} will set the client-side for attribute on the
- * label.
+ * The active control counterpart of TLabel component. When
+ * {@link TBaseActiveControl::setEnableUpdate ActiveControl.EnableUpdate}
+ * property is true the during a callback request, setting {@link setText Text}
+ * property will also set the text of the label on the client upon callback
+ * completion. Similarly, setting {@link setForControl ForControl} will also set
+ * the client-side "for" attribute on the label.
*
* @author Wei Zhuo <weizhuo[at]gmail[dot]com>
* @version $Revision: $ $Date: $
@@ -37,9 +38,12 @@ class TActiveLabel extends TLabel
$this->setAdapter(new TActiveControlAdapter($this));
}
+ /**
+ * @return TBaseActiveControl basic active control options.
+ */
public function getActiveControl()
{
- return $this->getAdapter()->getActiveControl();
+ return $this->getAdapter()->getBaseActiveControl();
}
/**
diff --git a/framework/Web/UI/ActiveControls/TActivePageAdapter.php b/framework/Web/UI/ActiveControls/TActivePageAdapter.php
index 9148a27f..77d8a7fe 100644
--- a/framework/Web/UI/ActiveControls/TActivePageAdapter.php
+++ b/framework/Web/UI/ActiveControls/TActivePageAdapter.php
@@ -1,6 +1,6 @@
<?php
/**
- * TActivePageAdapter class file
+ * TActivePageAdapter class file.
*
* @author Wei Zhuo <weizhuo[at]gamil[dot]com>
* @link http://www.pradosoft.com/
@@ -39,11 +39,7 @@ class TActivePageAdapter extends TControlAdapter
* @var TCallbackClientScript callback client script handler
*/
private $_callbackClient;
- /**
- * @var TCallbackEventParameter callback result.
- */
- private $_result;
-
+
/**
* Constructor, trap errors and exception to let the callback response
* handle them.
@@ -51,7 +47,11 @@ class TActivePageAdapter extends TControlAdapter
public function __construct(TPage $control)
{
parent::__construct($control);
- $this->getApplication()->setResponse($this->createCallbackResponseHandler());
+
+ //TODO: can this be done later?
+ $response = $this->getApplication()->getResponse();
+ $response->setAdapter(new TCallbackResponseAdapter($response));
+
$this->trapCallbackErrorsExceptions();
}
@@ -88,11 +88,19 @@ class TActivePageAdapter extends TControlAdapter
$executeJavascript = $this->getCallbackClientHandler()->getClientFunctionsToExecute()->toArray();
$actions = TJavascript::jsonEncode($executeJavascript);
$response->appendHeader(self::CALLBACK_ACTION_HEADER.': '.$actions);
- if($this->_result)
+
+ //send response data in header
+ if($response->getHasAdapter())
{
- $data = TJavascript::jsonEncode($this->_result->getData());
- $response->appendHeader(self::CALLBACK_DATA_HEADER.': '.$data);
+ $responseData = $response->getAdapter()->getResponseData();
+ if(!is_null($responseData))
+ {
+ $data = TJavascript::jsonEncode($responseData);
+ $response->appendHeader(self::CALLBACK_DATA_HEADER.': '.$data);
+ }
}
+
+ //sends page state in header
if(($handler = $this->getCallbackEventTarget()) !== null)
{
if($handler->getActiveControl()->getClientSide()->getEnablePageStateUpdate())
@@ -102,7 +110,7 @@ class TActivePageAdapter extends TControlAdapter
}
}
}
-
+
/**
* Trys to find the callback event handler and raise its callback event.
* @throws TInvalidCallbackRequestException if call back target is not found.
@@ -116,8 +124,8 @@ class TActivePageAdapter extends TControlAdapter
if($callbackHandler instanceof ICallbackEventHandler)
{
$param = $this->getCallbackEventParameter();
- $this->_result = new TCallbackEventParameter($this->getResponse(), $param);
- $callbackHandler->raiseCallbackEvent($this->_result);
+ $result = new TCallbackEventParameter($this->getResponse(), $param);
+ $callbackHandler->raiseCallbackEvent($result);
}
else
{
@@ -132,14 +140,6 @@ class TActivePageAdapter extends TControlAdapter
}
/**
- * @return mixed callback event result.
- */
- public function getCallbackEventResult()
- {
- return $this->_callbackEventResult->getResult();
- }
-
- /**
* @return TControl the control responsible for the current callback event,
* null if nonexistent
*/
@@ -196,21 +196,7 @@ class TActivePageAdapter extends TControlAdapter
if(is_null($this->_callbackClient))
$this->_callbackClient = new TCallbackClientScript;
return $this->_callbackClient;
- }
-
- /**
- * @param TCallbackClientScript new callback client handler.
- */
- public function setCallbackClientHandler($handler)
- {
- $this->_callbackClient = $handler;
- }
-
- protected function createCallbackResponseHandler()
- {
- return new TCallbackResponse();
- }
-
+ }
}
/**
@@ -231,17 +217,13 @@ class TActivePageAdapter extends TControlAdapter
class TCallbackEventParameter extends TEventParameter
{
/**
- * @var TCallbackResponse output content.
+ * @var THttpResponse output content.
*/
private $_response;
/**
* @var mixed callback request parameter.
*/
private $_parameter;
- /**
- * @var mixed callback response data.
- */
- private $_data;
/**
* Creates a new TCallbackEventParameter.
@@ -257,7 +239,7 @@ class TCallbackEventParameter extends TEventParameter
*/
public function getOutput()
{
- return $this->_response->createHtmlWriter(null,$this);
+ return $this->_response->createHtmlWriter(null);
}
/**
@@ -273,7 +255,7 @@ class TCallbackEventParameter extends TEventParameter
*/
public function setData($value)
{
- $this->_data = $value;
+ $this->_response->getAdapter()->setResponseData($value);
}
/**
@@ -281,7 +263,7 @@ class TCallbackEventParameter extends TEventParameter
*/
public function getData()
{
- return $this->_data;
+ return $this->_response->getAdapter()->getResponseData();
}
}
diff --git a/framework/Web/UI/ActiveControls/TActivePanel.php b/framework/Web/UI/ActiveControls/TActivePanel.php
index bd7b2200..db1d8a7d 100644
--- a/framework/Web/UI/ActiveControls/TActivePanel.php
+++ b/framework/Web/UI/ActiveControls/TActivePanel.php
@@ -18,7 +18,7 @@ class TActivePanel extends TPanel
public function getActiveControl()
{
- return $this->getAdapter()->getActiveControl();
+ return $this->getAdapter()->getBaseActiveControl();
}
}
diff --git a/framework/Web/UI/ActiveControls/TActiveTextBox.php b/framework/Web/UI/ActiveControls/TActiveTextBox.php
index 91adf8c7..ece08e11 100644
--- a/framework/Web/UI/ActiveControls/TActiveTextBox.php
+++ b/framework/Web/UI/ActiveControls/TActiveTextBox.php
@@ -18,7 +18,7 @@ class TActiveTextBox extends TTextBox
public function getActiveControl()
{
- return $this->getAdapter()->getActiveControl();
+ return $this->getAdapter()->getBaseActiveControl();
}
/**
diff --git a/framework/Web/UI/ActiveControls/TAutoComplete.php b/framework/Web/UI/ActiveControls/TAutoComplete.php
index 5a76847d..63b1d089 100644
--- a/framework/Web/UI/ActiveControls/TAutoComplete.php
+++ b/framework/Web/UI/ActiveControls/TAutoComplete.php
@@ -139,7 +139,7 @@ class TAutoComplete extends TActiveTextBox implements ICallbackEventHandler, INa
{
$this->getSuggestions()->render($writer);
$boundary = $writer->getWriter()->getBoundary();
- $writer->getWriter()->getResponse()->setData($boundary);
+ $this->getResponse()->getAdapter()->setResponseData($boundary);
}
}
@@ -162,17 +162,34 @@ class TAutoComplete extends TActiveTextBox implements ICallbackEventHandler, INa
return $options;
}
+ /**
+ * Override parent implementation, no javascript is rendered here instead
+ * the javascript required for active control is registered in {@link addAttributesToRender}.
+ */
+ protected function renderClientControlScript($writer)
+ {
+ }
+
+ /**
+ * Ensure that the ID attribute is rendered and registers the javascript code
+ * for initializing the active control.
+ */
+
public function addAttributesToRender($writer)
{
parent::addAttributesToRender($writer);
$writer->addAttribute('id',$this->getClientID());
- $this->getActiveControl()->registerCallbackClientScript($this->getAutoCompleteOptions());
+ $this->getActiveControl()->registerCallbackClientScript(
+ $this->getClientClassName(), $this->getAutoCompleteOptions());
}
-
- protected function renderClientControlScript($writer)
+
+ /**
+ * @return string corresponding javascript class name for this TActiveButton.
+ */
+ protected function getClientClassName()
{
-
- }
+ return 'Prado.WebUI.TAutoComplete';
+ }
}
/**
diff --git a/framework/Web/UI/ActiveControls/TBaseActiveControl.php b/framework/Web/UI/ActiveControls/TBaseActiveControl.php
index d2f1ef57..13d953c8 100644
--- a/framework/Web/UI/ActiveControls/TBaseActiveControl.php
+++ b/framework/Web/UI/ActiveControls/TBaseActiveControl.php
@@ -1,18 +1,59 @@
<?php
-/*
- * Created on 13/05/2006
+/**
+ * TBaseActiveControl and TBaseActiveCallbackControl class file.
+ *
+ * @author Wei Zhuo <weizhuo[at]gamil[dot]com>
+ * @link http://www.pradosoft.com/
+ * @copyright Copyright &copy; 2005 PradoSoft
+ * @license http://www.pradosoft.com/license/
+ * @version $Revision: $ $Date: $
+ * @package System.Web.UI.ActiveControls
+ */
+
+/**
+ * TBaseActiveControl class provided additional basic property for every
+ * active control. An instance of TBaseActiveControl or its decendent
+ * TBaseActiveCallbackControl is created by {@link TActiveControlAdapter::getBaseActiveControl()}
+ * method.
+ *
+ * The {@link setEnableUpdate EnableUpdate} property determines wether the active
+ * control is allowed to update the contents of the client-side when the callback
+ * response returns.
+ *
+ * @author Wei Zhuo <weizhuo[at]gamil[dot]com>
+ * @version $Revision: $ $Date: $
+ * @package System.Web.UI.ActiveControls
+ * @since 3.0
*/
class TBaseActiveControl extends TComponent
{
+ /**
+ * @TMap map of active control options.
+ */
private $_options;
+ /**
+ * @TControl attached control.
+ */
private $_control;
+ /**
+ * Constructor. Attach a base active control to an active control instance.
+ * @param TControl active control
+ */
public function __construct($control)
{
$this->_control = $control;
$this->_options = new TMap;
}
+ /**
+ * Sets a named options with a value. Options are used to store and retrive
+ * named values for the base active controls.
+ * @param string option name.
+ * @param mixed new value.
+ * @param mixed default value.
+ * @return mixed options value.
+ */
protected function setOption($name,$value,$default=null)
{
$value = is_null($value) ? $default : $value;
@@ -20,17 +61,30 @@ class TBaseActiveControl extends TComponent
$this->_options->add($name,$value);
}
+ /**
+ * Gets an option named value. Options are used to store and retrive
+ * named values for the base active controls.
+ * @param string option name.
+ * @param mixed default value.
+ * @return mixed options value.
+ */
protected function getOption($name,$default=null)
{
$item = $this->_options->itemAt($name);
return is_null($item) ? $default : $item;
}
+ /**
+ * @return TPage the page containing the attached control.
+ */
protected function getPage()
{
return $this->_control->getPage();
}
+ /**
+ * @return TControl the attached control.
+ */
protected function getControl()
{
return $this->_control;
@@ -44,14 +98,21 @@ class TBaseActiveControl extends TComponent
$this->setOption('EnableUpdate', TPropertyValue::ensureBoolean($value), true);
}
- /**
- * @return true to allow fine grain callback updates.
+ /**
+ * @return boolean true to allow fine grain callback updates.
*/
public function getEnableUpdate()
{
return $this->getOption('EnableUpdate', true);
}
+ /**
+ * Returns true if callback response is allowed to update the browser contents.
+ * Is is true if the control is initilized, and is a callback request and
+ * the {@link setEnableUpdate EnabledUpdate} property is true.
+ * @return boolean true if the callback response is allowed update
+ * client-side contents.
+ */
public function canUpdateClientSide()
{
return $this->getControl()->getIsInitialized()
@@ -60,21 +121,44 @@ class TBaseActiveControl extends TComponent
}
}
-
+/**
+ * TBaseActiveCallbackControl is a common set of options and functionality for
+ * active controls that can perform callback requests.
+ *
+ * The properties of TBaseActiveCallbackControl can be accessed and changed from
+ * each individual active controls' {@link getActiveControl ActiveControl}
+ * property.
+ *
+ * The following example to set the validation group property of a TCallback component.
+ * <code>
+ * <com:TCallback ActiveControl.ValidationGroup="group1" ... />
+ * </code>
+ *
+ * Additional client-side options and events can be set using the
+ * {@link getClientSide ClientSide} property. The following example to show
+ * an alert box when a TCallback component response returns successfully.
+ * <code>
+ * <com:TCallback Active.Control.ClientSide.OnSuccess="alert('ok!')" ... />
+ * </code>
+ *
+ * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
+ * @version $Revision: $ Fri Jun 16 08:40:43 EST 2006 $
+ * @package System.Web.UI.ActiveControls
+ * @since 3.0
+ */
class TBaseActiveCallbackControl extends TBaseActiveControl
{
/**
* Callback client-side options can be set by setting the properties of
- * the ClientSide property. E.g. <com:TCallback ClientSide.OnSuccess="..." />
- * See {@link TCallbackClientSideOptions} for details on the properties of
- * ClientSide.
+ * the ClientSide property. E.g. <com:TCallback ActiveControl.ClientSide.OnSuccess="..." />
+ * See {@link TCallbackClientSideOptions} for details on the properties of ClientSide.
* @return TCallbackClientSideOptions client-side callback options.
*/
public function getClientSide()
{
if(is_null($client = $this->getOption('ClientSide')))
{
- $client = $this->createClientSide();
+ $client = $this->createClientSideOptions();
$this->setOption('ClientSide', $client);
}
return $client;
@@ -83,9 +167,9 @@ class TBaseActiveCallbackControl extends TBaseActiveControl
/**
* @return TCallbackClientSideOptions callback client-side options.
*/
- protected function createClientSide()
+ protected function createClientSideOptions()
{
- if(($id=$this->getCallbackOptions())!==''
+ if(($id=$this->getCallbackOptionID())!==''
&& ($control=$this->getControl()->findControl($id))!==null)
{
if($control instanceof TCallbackOptions)
@@ -101,7 +185,7 @@ class TBaseActiveCallbackControl extends TBaseActiveControl
* @param string ID of a TCallbackOptions control from which ClientSide
* options are cloned.
*/
- public function setCallbackOptions($value)
+ public function setCallbackOptionID($value)
{
$this->setOption('CallbackOptions', $value, '');
}
@@ -110,7 +194,7 @@ class TBaseActiveCallbackControl extends TBaseActiveControl
* @return string ID of a TCallbackOptions control from which ClientSide
* options are cloned.
*/
- public function getCallbackOptions()
+ public function getCallbackOptionID()
{
return $this->getOption('CallbackOptions', '');
}
@@ -178,17 +262,23 @@ class TBaseActiveCallbackControl extends TBaseActiveControl
return $options;
}
- public function registerCallbackClientScript($options=null)
+ /**
+ * Registers the callback control javascript code. Client-side options are
+ * merged and passed to the javascript code. This method should be called by
+ * Active component developers wanting to register the javascript to initialize
+ * the active component with additional options offered by the
+ * {@link getClientSide ClientSide} property.
+ * @param string client side javascript class name.
+ * @param array additional callback options.
+ */
+ public function registerCallbackClientScript($class,$options=null)
{
$cs = $this->getPage()->getClientScript();
if(is_array($options))
$options = array_merge($this->getClientSideOptions(),$options);
else
- $options = $this->getClientSideOptions();
- // TODO (xue):
- // We need explicitly specify what js class is to be used
- // to avoid problem that may occur in extended child class
- $cs->registerCallbackControl('Prado.WebUI.'.get_class($this->getControl()), $options);
+ $options = $this->getClientSideOptions();
+ $cs->registerCallbackControl($class, $options);
}
/**
diff --git a/framework/Web/UI/ActiveControls/TCallback.php b/framework/Web/UI/ActiveControls/TCallback.php
index 681093ee..c42b2cd7 100644
--- a/framework/Web/UI/ActiveControls/TCallback.php
+++ b/framework/Web/UI/ActiveControls/TCallback.php
@@ -15,9 +15,20 @@
*
* The TCallback provides a basic callback handler that can be invoke from the
* client side by running the javascript code obtained from the
- * {@link getCallbackReference CallbackReference} property. The event {@link
- * onCallback OnCallback} is raise when a callback is requested by the TCallback
- * component.
+ * {@link TBaseActiveCallbackControl::getJavascript ActiveControl.Javascript} property.
+ * The event {@link onCallback OnCallback} is raise when a callback is requested made.
+ *
+ * Example usage:
+ * <code>
+ * <com:TCallback ID="callback1" OnCallback="callback1_Requested" />
+ * <script type="text/javascript">
+ * function do_callback1()
+ * {
+ * <%= $this->callback1->ActiveControl->Javascript %>
+ * }
+ * </script>
+ * <div onclick="do_callback1()">Click Me!</div>
+ * </code>
*
* @author Wei Zhuo <weizhuo[at]gmail[dot]com>
* @version $Revision: $ $Date: $
@@ -38,17 +49,17 @@ class TCallback extends TControl implements ICallbackEventHandler
}
/**
- * @return TBaseActiveCallbackControl base callback options.
+ * @return TBaseActiveCallbackControl standard callback options.
*/
public function getActiveControl()
{
- return $this->getAdapter()->getActiveControl();
+ return $this->getAdapter()->getBaseActiveControl();
}
/**
* Raises the callback event. This method is required by {@link
* ICallbackEventHandler} interface. If {@link getCausesValidation
- * CausesValidation} is true, it will invoke the page's {@link TPage::
+ * ActiveControl.CausesValidation} is true, it will invoke the page's {@link TPage::
* validate validate} method first. It will raise {@link onCallback
* OnCallback} event. This method is mainly used by framework and control
* developers.
diff --git a/framework/Web/UI/ActiveControls/TCallbackOptions.php b/framework/Web/UI/ActiveControls/TCallbackOptions.php
index e9c48c43..fc0becb5 100644
--- a/framework/Web/UI/ActiveControls/TCallbackOptions.php
+++ b/framework/Web/UI/ActiveControls/TCallbackOptions.php
@@ -9,7 +9,7 @@ class TCallbackOptions extends TControl
/**
* Callback client-side options can be set by setting the properties of
- * the ClientSide property. E.g. <com:TCallback ClientSide.OnSuccess="..." />
+ * the ClientSide property. E.g. <com:TCallbackOptions ClientSide.OnSuccess="..." />
* See {@link TCallbackClientSideOptions} for details on the properties of
* ClientSide.
* @return TCallbackClientSideOptions client-side callback options.
diff --git a/framework/Web/UI/ActiveControls/TCallbackResponseAdapter.php b/framework/Web/UI/ActiveControls/TCallbackResponseAdapter.php
new file mode 100755
index 00000000..d1ec67ad
--- /dev/null
+++ b/framework/Web/UI/ActiveControls/TCallbackResponseAdapter.php
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ *
+ */
+class TCallbackResponseAdapter extends THttpResponseAdapter
+{
+ private $_writers=array();
+
+ private $_data;
+
+ public function createNewHtmlWriter($type,$response)
+ {
+ $writer = new TCallbackResponseWriter();
+ $this->_writers[] = $writer;
+ return parent::createNewHtmlWriter($type,$writer);
+ }
+
+ public function flushContent()
+ {
+ foreach($this->_writers as $writer)
+ echo $writer->flush();
+ parent::flushContent();
+ }
+
+ public function setResponseData($data)
+ {
+ $this->_data = $data;
+ }
+
+ public function getResponseData()
+ {
+ return $this->_data;
+ }
+}
+
+class TCallbackResponseWriter extends TTextWriter
+{
+ private $_boundary;
+
+ public function __construct()
+ {
+ $this->_boundary = sprintf('%x',crc32((string)$this));
+ }
+
+ public function getBoundary()
+ {
+ return $this->_boundary;
+ }
+
+ public function setBoundary($value)
+ {
+ $this->_boundary = $value;
+ }
+
+ public function flush()
+ {
+ $content = '<!--'.$this->getBoundary().'-->';
+ $content .= parent::flush();
+ $content .= '<!--//'.$this->getBoundary().'-->';
+ return $content;
+ }
+}
+
+?> \ No newline at end of file