From 55c4ac1bfe565f1ca7f537fdd8b7a201be28e581 Mon Sep 17 00:00:00 2001 From: xue <> Date: Thu, 10 Nov 2005 12:47:19 +0000 Subject: Initial import of prado framework --- framework/Web/UI/TPage.php | 617 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 617 insertions(+) create mode 100644 framework/Web/UI/TPage.php (limited to 'framework/Web/UI/TPage.php') diff --git a/framework/Web/UI/TPage.php b/framework/Web/UI/TPage.php new file mode 100644 index 00000000..bb8f2253 --- /dev/null +++ b/framework/Web/UI/TPage.php @@ -0,0 +1,617 @@ +_application=Prado::getApplication(); + $this->setPage($this); + if(is_array($initProperties)) + { + foreach($initProperties as $name=>$value) + $this->setPropertyByPath($name,$value); + } + parent::__construct(); + } + + /** + * Loads and parses the control template + * @return ITemplate the parsed template structure + */ + protected function loadTemplate() + { + if($this->_templateFile===null) + return parent::loadTemplate(); + else + { + $template=Prado::getApplication()->getService()->getTemplateManager()->loadTemplateByFileName(Prado::getPathOfNamespace($this->_templateFile,'.tpl')); + $this->setTemplate($template); + return $template; + } + } + + public function getTemplateFile() + { + return $this->_templateFile; + } + + public function setTemplateFile($value) + { + $this->_templateFile=$value; + } + + final public function setForm($form) + { + $this->_form=$form; + } + + final public function getForm() + { + return $this->_form; + } + + public function validate($validationGroup='') + { + $this->_validated=true; + if($validationGroup==='') + { + foreach($this->_validators as $validator) + $validator->validate(); + } + else + { + foreach($this->_validators as $validator) + if($validator->getValidationGroup()===$validationGroup) + $validator->validate(); + } + } + + public function RegisterEnabledControl($control) + { + $this->getEna.EnabledControls.Add(control); + } + + + + /** + * @internal + */ + public function registerPostBackScript() + { + if($this->getClientSupportsJavaScript() && !$this->_postBackScriptRendered) + { + if(!$this->_requirePostBackScript) + { + $this->getClientScript()->registerHiddenField('__EVENTTARGET',''); + $this->getClientScript()->registerHiddenField('__EVENTPARAM',''); + $this->_requirePostBackScript=true; + } + } + } + + public function registerWebFormsScript() + { + if($this->getClientSupportsJavaScript() && !$this->_webFormsScriptRendered) + { + $this->registerPostBackScript(); + $this->_requireWebFormsScript=true; + } + } + + + public function ensureRenderInForm($control) + { + if(!$this->_inFormRender) + throw new THttpException('control_not_in_form',$control->getUniqueID()); + } + + /** + * @internal + */ + final protected function addContentTemplate($name,$template) + { + if(!$this->_contentTemplateCollection) + $this->_contentTemplateCollection=new TMap; + if($this->_contentTemplateCollection->has($name)) + throw new Exception("Content '$name' duplicated."); + $this->_contentTemplateCollection->add($name,$template); + } + + /** + * @internal + */ + final public function applyControlSkin($control) + { + if($this->_theme) + $this->_theme->applySkin($control); + } + + /** + * @internal + */ + final public function applyControlStyleSheet($control) + { + if($this->_styleSheet) + { + $this->_styleSheet->applySkin($control); + return true; + } + else + return false; + } + + private function renderStateFields($writer) + { + $writer->write("\n_pageState."\" />\n"); + } + + private function renderPostBackScript($writer) + { + $id=$this->_form->getUniqueID(); + $str=<< + +\n +EOD; + $writer->write($str); + $this->_postBackScriptRendered=true; + } + + private function renderWebFormsScript($writer) + { + $writer->write("\n\n"); + $this->_webFormsScriptRendered=true; + } + + final public function getClientSupportsJavaScript() + { + // todo + return true; + } + + /** + * @internal + */ + final public function beginFormRender($writer) + { + if($this->_formRendered) + throw new THttpException('multiple_form_not_allowed'); + $this->_formRendered=true; + $this->_inFormRender=true; + + $this->getClientScript()->renderHiddenFields($writer); + //$this->renderStateFields($writer); + if($this->getClientSupportsJavaScript()) + { + /* + if($this->getMaintainScrollPositionOnPostBack() && !$this->_requireScrollScript) + { + $cs=$this->getClientScript(); + $cs->registerHiddenField('_SCROLLPOSITIONX',$this->_scrollPositionX); + $cs->registerHiddenField('_SCROLLPOSITIONY',$this->_scrollPositionY); + $cs->registerStartupScript(get_class($this),"PageScrollPositionScript", "\r\nvar WebForm_ScrollPositionSubmit = theForm.submit;\r\ntheForm.submit = WebForm_SaveScrollPositionSubmit;\r\n\r\nvar WebForm_ScrollPositionOnSubmit = theForm.onsubmit;\r\ntheForm.onsubmit = WebForm_SaveScrollPositionOnSubmit;\r\n\r\nvar WebForm_ScrollPositionLoad = window.onload;\r\nwindow.onload = WebForm_RestoreScrollPosition;\r\n", true); + $this->registerWebFormScript(); + $this->_requireScrollScript=true; + } + */ + if($this->_requirePostBackScript) + $this->renderPostBackScript($writer,$this->_form->getUniqueID()); + if($this->_requireWebFormsScript) + $this->renderWebFormsScript($writer); + } + $this->getClientScript()->renderClientScriptBlocks($writer); + // todo: more .... + } + + final public function getIsPostBackEventControlRegistered() + { + return $this->_registeredControlThatRequireRaiseEvent!==null; + } + + /** + * @internal + */ + final public function endFormRender($writer) + { + $cs=$this->getClientScript(); + if($this->getClientSupportsJavaScript()) + $cs->renderArrayDeclarations($writer); + $cs->renderHiddenFields($writer); + if($this->getClientSupportsJavaScript()) + { + if($this->_requirePostBackScript && !$this->_postBackScriptRendered) + $this->renderPostBackScript($writer); + if($this->_requireWebFormsScript && !$this->_webFormsScriptRendered) + $this->renderWebFormsScript($writer); + } + $cs->renderClientStartupScripts($writer); + $this->_inFormRender=false; + } + + final public function getClientScript() + { + if(!$this->_clientScript) + $this->_clientScript=new TClientScriptManager($this); + return $this->_clientScript; + } + + final public function getClientOnSubmitEvent() + { + // todo + if($this->getClientScript()->getHasSubmitStatements()) + return 'javascript:return WebForm_OnSubmit();'; + else + return ''; + } + + final public function getValidators($validationGroup='') + { + if(!$this->_validators) + $this->_validators=new TList; + if($validationGroup==='') + return $this->_validators; + $list=new TList; + foreach($this->_validators as $validator) + if($validator->getValidationGroup()===$validationGroup) + $list->add($validator); + return $list; + } + + protected function initializeCulture() + { + } + + /** + * @internal + */ + public function initializeStyleSheet() + { + if($this->_styleSheet!=='') + $this->_styleSheet=new TTheme($this->_styleSheetName); + } + + private function initializeThemes() + { + if($this->_themeName!=='') + $this->_theme=new TTheme($this->_themeName); + if($this->_styleSheetName!=='') + $this->_styleSheet=new TTheme($this->_styleSheetName); + } + + /** + * @internal + */ + public function loadScrollPosition() + { + if($this->_previousPagePath==='' && $this->_requestValueCollection) + { + if(isset($_REQUEST['__SCROLLPOSITIONX'])) + $this->_scrollPositionX=(integer)$_REQUEST['__SCROLLPOSITIONX']; + if(isset($_REQUEST['__SCROLLPOSITIONY'])) + $this->_scrollPositionX=(integer)$_REQUEST['__SCROLLPOSITIONY']; + } + } + + protected function onInit($param) + { + parent::onInit($param);/* + if($this->_theme) + $this->_theme->setStyleSheet(); + if($this->_styleSheet) + $this->_styleSheet->setStyleSheet();*/ + } + + protected function onInitComplete($param) + { + $this->raiseEvent('InitComplete',$this,$param); + } + + protected function onLoadComplete($param) + { + $this->raiseEvent('LoadComplete',$this,$param); + } + + protected function onPreInit($param) + { + $this->raiseEvent('PreInit',$this,$param); + } + + protected function onPreLoad($param) + { + $this->raiseEvent('PreLoad',$this,$param); + } + + protected function onPreRenderComplete($param) + { + $this->raiseEvent('PreRenderComplete',$this,$param); + } + + protected function onSaveStateComplete($param) + { + $this->raiseEvent('SaveStateComplete',$this,$param); + } + + final public function registerAsyncTask() + { + } + + final public function registerRequiresPostBack($control) + { + if(!$this->_registeredControlsThatRequirePostBack) + $this->_registeredControlsThatRequirePostBack=new TList; + $this->_registeredControlsThatRequirePostBack->add($control->getUniqueID()); + } + + final public function registerRequiresRaiseEvent($control) + { + $this->_registeredControlThatRequireRaiseEvent=$control; + } + + public function getApplication() + { + return $this->_application; + } + + public function loadStateField() + { + return base64_decode($this->_postData->itemAt('__STATE')); + } + + public function saveStateField($state) + { + $this->getClientScript()->registerHiddenField('__STATE',base64_encode($state)); + } + + protected function determinePostBackMode() + { + /* + $application=$this->getApplication(); + if($application->getPreventPostBack()) + return null; + */ + $postData=new TMap($this->_application->getRequest()->getItems()); + if($postData->itemAt('__STATE')!==null || $postData->itemAt('__EVENTTARGET')!==null) + return $postData; + else + return null; + } + + final public function getIsPostBack() + { + if($this->_postData) + { + if($this->_isCrossPagePostBack) + return true; + if($this->_previousPagePath!=='') + return false; + return !$this->_pageStateChanged; + } + else + return false; + } + + protected function getPageStatePersister() + { + require_once(PRADO_DIR.'/Web/UI/THiddenFieldPageStatePersister.php'); + return new THiddenFieldPageStatePersister($this); + } + + protected function loadPageState() + { + $persister=$this->getPageStatePersister(); + $state=$persister->load(); + $this->loadStateRecursive($state,$this->getEnableViewState()); + } + + protected function savePageState() + { + $state=&$this->saveStateRecursive($this->getEnableViewState()); + $persister=$this->getPageStatePersister(); + $persister->save($state); + } + + protected function processPostData($postData,$beforeLoad) + { + $eventTarget=$postData->itemAt('__EVENTTARGET'); + foreach($postData as $key=>$value) + { + if(in_array($key,self::$_systemPostFields)) + continue; + else if($control=$this->findControl($key)) + { + if($control instanceof IPostBackDataHandler) + { + if($control->loadPostData($key,$this->_postData)) + $this->_changedPostDataConsumers[]=$control; + unset($this->_controlsRequiringPostBack[$key]); + } + else + { + if(empty($eventTarget)) + { + if($control instanceof IPostBackEventHandler) + $this->registerRequiresRaiseEvent($control); + } + else + unset($this->_controlsRequiringPostBack[$key]); + } + } + else if($beforeLoad) + $this->_restPostData->add($key,$value); + } + $list=new TMap; + foreach($this->_controlsRequiringPostBack as $key=>$value) + { + if($control=$this->findControl($key)) + { + if($control instanceof IPostBackDataHandler) + { + if($control->loadPostData($key,$this->_postData)) + $this->_changedPostDataConsumers->add($control); + } + else + throw new THttpException('postback_control_not_found',$key); + } + else if($beforeLoad) + $list->add($key,null); + } + $this->_controlsRequiringPostBack=$list; + } + + final public function getAutoPostBackControl() + { + return $this->_autoPostBackControl; + } + + final public function setAutoPostBackControl($control) + { + $this->_autoPostBackControl=$control; + } + + private function raiseChangedEvents() + { + foreach($this->_changedPostDataConsumers as $control) + $control->raisePostDataChangedEvent(); + } + + private function raisePostBackEvent($postData) + { + if($this->_registeredControlThatRequireRaiseEvent) + { + $this->_registeredControlThatRequireRaiseEvent->raisePostBackEvent(null); + } + else + { + $eventTarget=$postData->itemAt('__EVENTTARGET'); + if(!empty($eventTarget) || $this->getAutoPostBackControl()) + { + if(!empty($eventTarget)) + $control=$this->findControl($eventTarget); + else + $control=null; + if($control instanceof IPostBackEventHandler) + $control->raisePostBackEvent($postData->itemAt('__EVENTPARAM')); + } + else + $this->validate(); + } + } + + public function run($writer) + { + $this->_postData=$this->determinePostBackMode(); + $this->_restPostData=new TMap; + + $this->onPreInit(null); + $this->initializeThemes(); + $this->_preInitWorkComplete=true; + + $this->initRecursive(null); + $this->onInitComplete(null); + + if($this->getIsPostBack()) + { + $this->loadPageState(); + $this->processPostData($this->_postData,true); + } + + $this->onPreLoad(null); + $this->loadRecursive(null); + if($this->getIsPostBack()) + { + $this->processPostData($this->_restPostData,false); + $this->raiseChangedEvents(); + $this->raisePostBackEvent($this->_postData); + } + $this->onLoadComplete(null); + + $this->preRenderRecursive(); + $this->onPreRenderComplete(null); + + $this->savePageState(); + $this->onSaveStateComplete(null); + + $this->renderControl($writer); + $this->unloadRecursive(); + } + + public function getTheme() + { + return $this->_themeName; + } + + public function setTheme($value) + { + $this->_themeName=$value; + } + + public function getStyleSheetTheme() + { + return $this->_styleSheetName; + } + + public function setStyleSheetTheme($value) + { + $this->_styleSheetName=$value; + } + + public function getContainsTheme() + { + return $this->_theme!==null; + } +} + +?> \ No newline at end of file -- cgit v1.2.3