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. --- framework/Web/UI/ActiveControls/TActivePageAdapter.php | 18 ++++++++++++++++++ framework/Web/UI/ActiveControls/TActivePanel.php | 16 +++++++++++++--- .../Web/UI/ActiveControls/TCallbackClientScript.php | 8 +++++--- 3 files changed, 36 insertions(+), 6 deletions(-) (limited to 'framework') 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(); } -- cgit v1.2.3