From b196ea0e2e9ab9078022e88326edecf1ba5b2f9f Mon Sep 17 00:00:00 2001
From: wei <>
Date: Fri, 15 Sep 2006 23:49:56 +0000
Subject: Defer render() calls in callback event handler to a later stage.
---
.gitattributes | 8 ++++
.../Web/UI/ActiveControls/TActivePageAdapter.php | 18 ++++++++
framework/Web/UI/ActiveControls/TActivePanel.php | 16 +++++--
.../UI/ActiveControls/TCallbackClientScript.php | 8 ++--
.../pages/ActiveControlExpressionTag.page | 27 ++++++++++++
.../protected/pages/ActiveControlExpressionTag.php | 26 ++++++++++++
.../protected/pages/ActiveListBoxMasterTest.page | 28 +++++++++++++
.../protected/pages/ActiveListBoxMasterTest.php | 47 +++++++++++++++++++++
.../protected/pages/TActiveCheckBoxListTest.page | 14 +++----
.../protected/pages/TestMasterPage.php | 7 ++++
.../protected/pages/TestMasterPage.tpl | 12 ++++++
.../tests/ActiveControlExpressTagTestCase.php | 20 +++++++++
.../tests/ActiveListBoxMasterTestCase.php | 49 ++++++++++++++++++++++
13 files changed, 267 insertions(+), 13 deletions(-)
create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.page
create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.php
create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxMasterTest.page
create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxMasterTest.php
create mode 100644 tests/FunctionalTests/active-controls/protected/pages/TestMasterPage.php
create mode 100644 tests/FunctionalTests/active-controls/protected/pages/TestMasterPage.tpl
create mode 100644 tests/FunctionalTests/active-controls/tests/ActiveControlExpressTagTestCase.php
create mode 100644 tests/FunctionalTests/active-controls/tests/ActiveListBoxMasterTestCase.php
diff --git a/.gitattributes b/.gitattributes
index b2349fd8..c9758170 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1888,10 +1888,14 @@ requirements/messages.txt -text
requirements/template-bg.html -text
requirements/template-zh.html -text
requirements/template.html -text
+tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.page -text
+tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.php -text
tests/FunctionalTests/active-controls/protected/pages/ActiveImageButtonTest.page -text
tests/FunctionalTests/active-controls/protected/pages/ActiveImageButtonTest.php -text
tests/FunctionalTests/active-controls/protected/pages/ActiveLinkButtonTest.page -text
tests/FunctionalTests/active-controls/protected/pages/ActiveLinkButtonTest.php -text
+tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxMasterTest.page -text
+tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxMasterTest.php -text
tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxTest.page -text
tests/FunctionalTests/active-controls/protected/pages/ActiveListBoxTest.php -text
tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonListTest.page -text
@@ -1910,14 +1914,18 @@ tests/FunctionalTests/active-controls/protected/pages/ReplaceContentTest.page -t
tests/FunctionalTests/active-controls/protected/pages/ReplaceContentTest.php -text
tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.page -text
tests/FunctionalTests/active-controls/protected/pages/TInPlaceTextBoxTest.php -text
+tests/FunctionalTests/active-controls/protected/pages/TestMasterPage.php -text
+tests/FunctionalTests/active-controls/protected/pages/TestMasterPage.tpl -text
tests/FunctionalTests/active-controls/protected/pages/TextBoxValidationCallback.page -text
tests/FunctionalTests/active-controls/protected/pages/TextBoxValidationCallback.php -text
tests/FunctionalTests/active-controls/protected/pages/ValueTriggerCallbackTest.page -text
tests/FunctionalTests/active-controls/protected/pages/ValueTriggerCallbackTest.php -text
tests/FunctionalTests/active-controls/protected/pages/group.gif -text
tests/FunctionalTests/active-controls/protected/pages/report.gif -text
+tests/FunctionalTests/active-controls/tests/ActiveControlExpressTagTestCase.php -text
tests/FunctionalTests/active-controls/tests/ActiveImageButtonTestCase.php -text
tests/FunctionalTests/active-controls/tests/ActiveLinkButtonTestCase.php -text
+tests/FunctionalTests/active-controls/tests/ActiveListBoxMasterTestCase.php -text
tests/FunctionalTests/active-controls/tests/ActiveListBoxTestCase.php -text
tests/FunctionalTests/active-controls/tests/ActiveRadioButtonListTestCase.php -text
tests/FunctionalTests/active-controls/tests/ActiveRadioButtonTestCase.php -text
diff --git a/framework/Web/UI/ActiveControls/TActivePageAdapter.php b/framework/Web/UI/ActiveControls/TActivePageAdapter.php
index 3b386902..2df19053 100644
--- a/framework/Web/UI/ActiveControls/TActivePageAdapter.php
+++ b/framework/Web/UI/ActiveControls/TActivePageAdapter.php
@@ -58,6 +58,8 @@ class TActivePageAdapter extends TControlAdapter
*/
private $_callbackClient;
+ private $_controlsToRender=array();
+
/**
* Constructor, trap errors and exception to let the callback response
* handle them.
@@ -83,6 +85,18 @@ class TActivePageAdapter extends TControlAdapter
$this->raiseCallbackEvent();
}
+ /**
+ * Register a control for defered render() call.
+ * @param TControl control for defered rendering
+ * @param THtmlWriter the renderer
+ */
+ public function registerControlToRender($control,$writer)
+ {
+ $id = $control->getUniqueID();
+ if(!isset($this->_controlsToRender[$id]))
+ $this->_controlsToRender[$id] = array($control,$writer);
+ }
+
/**
* Trap errors and exceptions to be handled by TCallbackErrorHandler.
*/
@@ -108,6 +122,10 @@ class TActivePageAdapter extends TControlAdapter
*/
protected function renderResponse($writer)
{
+ //renders all the defered render() calls.
+ foreach($this->_controlsToRender as $rid => $forRender)
+ $forRender[0]->render($forRender[1]);
+
$response = $this->getResponse();
//send response data in header
diff --git a/framework/Web/UI/ActiveControls/TActivePanel.php b/framework/Web/UI/ActiveControls/TActivePanel.php
index 44f570b3..6f5c87dd 100644
--- a/framework/Web/UI/ActiveControls/TActivePanel.php
+++ b/framework/Web/UI/ActiveControls/TActivePanel.php
@@ -59,13 +59,23 @@ class TActivePanel extends TPanel implements IActiveControl
/**
* Renders and replaces the panel's content on the client-side.
+ * When render() is called before the OnPreRender event, such as when render()
+ * is called during a callback event handler, the rendering
+ * is defered until OnPreRender event is raised.
* @param THtmlWriter html writer
*/
public function render($writer)
{
- parent::render($writer);
- if($this->getActiveControl()->canUpdateClientSide())
- $this->getPage()->getCallbackClient()->replaceContent($this,$writer);
+ if($this->getHasPreRendered())
+ {
+ parent::render($writer);
+ if($this->getActiveControl()->canUpdateClientSide())
+ $this->getPage()->getCallbackClient()->replaceContent($this,$writer);
+ }
+ else
+ {
+ $this->getPage()->getAdapter()->registerControlToRender($this,$writer);
+ }
}
}
diff --git a/framework/Web/UI/ActiveControls/TCallbackClientScript.php b/framework/Web/UI/ActiveControls/TCallbackClientScript.php
index 11f3d1ff..ebc5942f 100644
--- a/framework/Web/UI/ActiveControls/TCallbackClientScript.php
+++ b/framework/Web/UI/ActiveControls/TCallbackClientScript.php
@@ -152,7 +152,7 @@ class TCallbackClientScript extends TApplicationComponent
*/
public function raiseClientEvent($control, $eventName)
{
- $this->callClientFunction('Event.fireEvent',
+ $this->callClientFunction('Event.fireEvent',
array($control, strtolower($eventName)));
}
@@ -382,14 +382,16 @@ class TCallbackClientScript extends TApplicationComponent
/**
* Renders the control and return the content boundary from
* TCallbackResponseWriter. This method should only be used by framework
- * component developers.
+ * component developers. The render() method is defered to be called in the
+ * TActivePageAdapter class.
* @param TControl control to be rendered on callback response.
* @return string the boundary for which the rendered content is wrapped.
*/
private function getRenderedContentBoundary($control)
{
$writer = $this->getResponse()->createHtmlWriter();
- $control->render($writer);
+ $adapter = $control->getPage()->getAdapter();
+ $adapter->registerControlToRender($control, $writer);
return $writer->getWriter()->getBoundary();
}
diff --git a/tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.page b/tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.page
new file mode 100644
index 00000000..7b983cd7
--- /dev/null
+++ b/tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.page
@@ -0,0 +1,27 @@
+Active Control With Expression Tag Test
+
+Active List Box Functional Test
+
+ TActiveCheckBoxList Test Case
-
+