From 9cc6b7fffd31f4b9ee9aceef9224c84dcf28aeb8 Mon Sep 17 00:00:00 2001 From: xue <> Date: Tue, 4 Jul 2006 23:25:41 +0000 Subject: Merge from 3.0 branch till 1239. --- framework/Collections/TList.php | 4 +- framework/Collections/TMap.php | 4 +- framework/Exceptions/messages.txt | 2 + framework/Web/THttpResponse.php | 2 +- framework/Web/UI/WebControls/TClientScript.php | 154 ++++++++++++++++++++++--- framework/Web/UI/WebControls/TDataGrid.php | 32 +++-- framework/Web/UI/WebControls/TFileUpload.php | 2 +- framework/Web/UI/WebControls/TStyleSheet.php | 78 +++++++++++++ framework/Web/UI/WebControls/TTable.php | 2 +- 9 files changed, 251 insertions(+), 29 deletions(-) create mode 100644 framework/Web/UI/WebControls/TStyleSheet.php (limited to 'framework') diff --git a/framework/Collections/TList.php b/framework/Collections/TList.php index 5b27a02e..015781cb 100644 --- a/framework/Collections/TList.php +++ b/framework/Collections/TList.php @@ -152,7 +152,7 @@ class TList extends TComponent implements IteratorAggregate,ArrayAccess throw new TInvalidDataValueException('list_index_invalid',$index); } else - throw new TInvalidOperation('list_readonly',get_class($this)); + throw new TInvalidOperationException('list_readonly',get_class($this)); } /** @@ -201,7 +201,7 @@ class TList extends TComponent implements IteratorAggregate,ArrayAccess throw new TInvalidDataValueException('list_index_invalid',$index); } else - throw new TInvalidOperation('list_readonly',get_class($this)); + throw new TInvalidOperationException('list_readonly',get_class($this)); } /** diff --git a/framework/Collections/TMap.php b/framework/Collections/TMap.php index 28508e1d..e3a26e5f 100644 --- a/framework/Collections/TMap.php +++ b/framework/Collections/TMap.php @@ -123,7 +123,7 @@ class TMap extends TComponent implements IteratorAggregate,ArrayAccess if(!$this->_r) $this->_d[$key]=$value; else - throw new TInvalidOperation('map_readonly',get_class($this)); + throw new TInvalidOperationException('map_readonly',get_class($this)); } /** @@ -146,7 +146,7 @@ class TMap extends TComponent implements IteratorAggregate,ArrayAccess return null; } else - throw new TInvalidOperation('map_readonly',get_class($this)); + throw new TInvalidOperationException('map_readonly',get_class($this)); } /** diff --git a/framework/Exceptions/messages.txt b/framework/Exceptions/messages.txt index 22b28a42..ff9ab1f3 100644 --- a/framework/Exceptions/messages.txt +++ b/framework/Exceptions/messages.txt @@ -320,6 +320,8 @@ databoundcontrol_datasourceid_inexistent = databoundcontrol_datasourceid_inexist databoundcontrol_datasourceid_invalid = databoundcontrol_datasourceid_invalid databoundcontrol_datamember_invalid = databoundcontrol_datamember_invalid +clientscript_invalid_file_position = Invalid file position '{1}' for TClientScript control '{0}', must be 'Head', 'Here' or 'Begin'. + callback_not_support_no_priority_state_update = Callback request does not support unprioritized pagestate update. callback_invalid_callback_options = '{1}' is not a valid TCallbackOptions control for Callback control '{0}'. callback_invalid_clientside_options = Callback ClientSide property must be either a string that is the ID of a TCallbackOptions control or an instance of TCallbackClientSideOptions.======= diff --git a/framework/Web/THttpResponse.php b/framework/Web/THttpResponse.php index e44d6cba..bba0cabc 100644 --- a/framework/Web/THttpResponse.php +++ b/framework/Web/THttpResponse.php @@ -316,7 +316,7 @@ class THttpResponse extends TModule implements ITextWriter $this->getApplication()->onEndRequest(); if($url[0]==='/') $url=$this->getRequest()->getBaseUrl().$url; - header('Location:'.$url); + header('Location: '.$url); exit(); } diff --git a/framework/Web/UI/WebControls/TClientScript.php b/framework/Web/UI/WebControls/TClientScript.php index 513f41c2..79279a93 100644 --- a/framework/Web/UI/WebControls/TClientScript.php +++ b/framework/Web/UI/WebControls/TClientScript.php @@ -13,21 +13,38 @@ /** * TClientScript class * - * Allows importing of Prado Client Scripts from template via the + * Allows importing of Prado Client Scripts from template via the * {@link setUsingPradoScripts UsingPradoScripts} property. Multiple Prado * client-scripts can be specified using comma delimited string of the * javascript library to include on the page. For example, - * + * * * * - * + * * The {@link setPreRenderControlTypes PreRenderControlTypes} property can * be used to specify that controls type/class names that should pre-render itself * even though they may not be rendered on the page. This is useful to publish * controls that require assets and is only visible after a callback response. - * - * @TODO May be use it to include stylesheets as well. + * + * Custom javascript files can be register using the {@link setScriptUrl ScriptUrl} + * property. + * + * /> + * + * + * Contents within TClientScript will be treated as javascript code and will be + * rendered. + * + * The {@link setScriptPosition ScriptPosition} property specifies where the script + * will be rendered. The allows values of {@link setScriptPosition ScriptPosition} are + * + * - Head -- renders the script within the <head> + * - Begin -- renders the script within and near the begining of TForm + * - Here -- renders the script inplace, this is the default + * - End -- renders the script within and near the end of TForm + * + * TODO: Allow binding expressions inside scripts * * @author Wei Zhuo * @version $Revision: $ $Date: $ @@ -36,6 +53,11 @@ */ class TClientScript extends TControl { + /** + * @var string body contents + */ + private $_content = ''; + /** * @return string comma delimited list of javascript libraries to included * on the page. @@ -44,29 +66,45 @@ class TClientScript extends TControl { return $this->getViewState('PradoScripts', ''); } - + /** * Include javascript library to the current page. The current supported * libraries are: "prado", "effects", "ajax", "validator", "logger", * "datepicker", "rico", "colorpicker". Library dependencies are * automatically resolved. - * + * * @param string comma delimited list of javascript libraries to include. */ public function setUsingPradoScripts($value) { $this->setViewState('PradoScripts', $value, ''); } - + + /** + * @return string custom javascript file url. + */ + public function getScriptUrl() + { + return $this->getViewState('ScriptUrl', ''); + } + + /** + * @param string custom javascript file url. + */ + public function setScriptUrl($value) + { + $this->setViewState('ScriptUrl', $value, ''); + } + /** - * @param string comma delimited list of controls that wish to be prerendered + * @param string comma delimited list of controls that wish to be prerendered * so as to publish its assets. */ public function setPreRenderControlTypes($value) { $this->setViewState('PreRenderControls', $value); } - + /** * @return string comma delimited list of controls types that require prerendering. */ @@ -74,7 +112,26 @@ class TClientScript extends TControl { return $this->getViewState('PreRenderControls', ''); } - + + /** + * @return string position the script should be rendered, default is 'Here'. + */ + public function getScriptPosition() + { + return $this->getViewState('ScriptPosition', 'Here'); + } + + /** + * Sets the position where the script will be rendered. + * The allow positions are 'Head', 'Begin', 'Here', and 'End', default is 'Here'. + * @param string script position 'Head', 'Begin', 'Here' or 'End'. + */ + public function setScriptPosition($value) + { + $this->setViewState('ScriptPosition', + TPropertyValue::ensureEnum($value, 'Head', 'Begin', 'Here', 'End'), 'Here'); + } + /** * Calls the client script manager to add each of the requested client * script libraries. @@ -91,9 +148,78 @@ class TClientScript extends TControl if(strlen($script) > 0) $cs->registerPradoScript($script); } + if($this->getEnabled(true)) + { + $this->registerCustomScriptFile(); + $this->registerCustomScript(); + } $this->preRenderControls($param); } - + + /** + * Registers the custom script file. + */ + protected function registerCustomScriptFile() + { + $scriptUrl = $this->getScriptUrl(); + if(strlen($scriptUrl)) + { + $position = $this->getScriptPosition(); + $cs = $this->getPage()->getClientScript(); + switch($this->getScriptPosition()) + { + case 'Head': + $cs->registerHeadScriptFile($scriptUrl, $scriptUrl); + break; + case 'Begin': + $cs->registerScriptFile($scriptUrl, $scriptUrl); + break; + case 'Here': + $this->_content .= TJavascript::renderScriptFile($scriptUrl); + break; + default : + throw new TConfigurationException('clientscript_invalid_file_position', + $this->getID(), $position); + } + } + } + + /** + * Renders the body content as javascript block. + * Overrides parent implementation, parent renderChildren method is called during + * {@link registerCustomScript}. + * @param THtmlWriter the renderer + */ + public function render($writer) + { + if($this->getEnabled(true) && strlen($this->_content) > 0) + $writer->write($this->_content); + } + + /** + * Registers the body content as scripts at specific locations. Calls + * {@link parent::renderChildren} to capture the body contents. + */ + protected function registerCustomScript() + { + $textWriter=new TTextWriter; + $this->renderChildren(new THtmlWriter($textWriter)); + $script=$textWriter->flush(); + if(strlen($script)>0) + { + $cs = $this->getPage()->getClientScript(); + $position = $this->getScriptPosition(); + if($position == 'Here') + $this->_content .= TJavaScript::renderScriptBlock($script); + else + { + $key = sprintf('%08X', crc32($script)); + $method = 'register'.$position.'Script'; + $cs->{$method}($key, $script); + } + } + } + /** * PreRender other controls to allow them to publish their assets. Useful * when callback response components that require assets to be present on the page. @@ -110,8 +236,8 @@ class TClientScript extends TControl $control->setPage($this->getPage()); $control->onPreRender($param); } - } + } } } -?> \ No newline at end of file +?> diff --git a/framework/Web/UI/WebControls/TDataGrid.php b/framework/Web/UI/WebControls/TDataGrid.php index fead5344..f7697fec 100644 --- a/framework/Web/UI/WebControls/TDataGrid.php +++ b/framework/Web/UI/WebControls/TDataGrid.php @@ -213,7 +213,7 @@ class TDataGrid extends TBaseDataList implements INamingContainer if($object instanceof TDataGridColumn) $this->getColumns()->add($object); else - parent::addParsedObject($object); + parent::addParsedObject($object); // this is needed by EmptyTemplate } /** @@ -246,6 +246,14 @@ class TDataGrid extends TBaseDataList implements INamingContainer return $this->_items; } + /** + * @return integer number of items + */ + public function getItemCount() + { + return $this->_items?$this->_items->getCount():0; + } + /** * Creates a style object for the control. * This method creates a {@link TTableStyle} to be used by datagrid. @@ -892,13 +900,16 @@ class TDataGrid extends TBaseDataList implements INamingContainer { foreach($columns as $column) $column->initialize(); - if($allowPaging) - $this->_topPager=$this->createPager(); - $this->_header=$this->createItemInternal(-1,-1,self::IT_HEADER,false,null,$columns); $selectedIndex=$this->getSelectedItemIndex(); $editIndex=$this->getEditItemIndex(); for($index=0;$index<$itemCount;++$index) { + if($index===0) + { + if($allowPaging) + $this->_topPager=$this->createPager(); + $this->_header=$this->createItemInternal(-1,-1,self::IT_HEADER,false,null,$columns); + } if($index===$editIndex) $itemType=self::IT_EDITITEM; else if($index===$selectedIndex) @@ -910,9 +921,12 @@ class TDataGrid extends TBaseDataList implements INamingContainer $items->add($this->createItemInternal($index,$dsIndex,$itemType,false,null,$columns)); $dsIndex++; } - $this->_footer=$this->createItemInternal(-1,-1,self::IT_FOOTER,false,null,$columns); - if($allowPaging) - $this->_bottomPager=$this->createPager(); + if($index>0) + { + $this->_footer=$this->createItemInternal(-1,-1,self::IT_FOOTER,false,null,$columns); + if($allowPaging) + $this->_bottomPager=$this->createPager(); + } } if(!$dsIndex && $this->_emptyTemplate!==null) { @@ -1287,6 +1301,8 @@ class TDataGrid extends TBaseDataList implements INamingContainer foreach($this->getControls() as $index=>$item) { + if(!($item instanceof TDataGridItem) && !($item instanceof TDataGridPager)) + continue; $itemType=$item->getItemType(); switch($itemType) { @@ -1423,7 +1439,7 @@ class TDataGrid extends TBaseDataList implements INamingContainer $this->renderContents($writer); $control->renderEndTag($writer); } - else + else if($this->getViewState('ItemCount',0)>0) { $this->applyItemStyles(); if($this->_topPager) diff --git a/framework/Web/UI/WebControls/TFileUpload.php b/framework/Web/UI/WebControls/TFileUpload.php index 37689746..62c51ccf 100644 --- a/framework/Web/UI/WebControls/TFileUpload.php +++ b/framework/Web/UI/WebControls/TFileUpload.php @@ -189,7 +189,7 @@ class TFileUpload extends TWebControl implements IPostBackDataHandler, IValidata throw new TInvalidOperationException('fileupload_saveas_failed'); } else - throw new TInvalidOperation('fileupload_saveas_forbidden'); + throw new TInvalidOperationException('fileupload_saveas_forbidden'); } /** diff --git a/framework/Web/UI/WebControls/TStyleSheet.php b/framework/Web/UI/WebControls/TStyleSheet.php new file mode 100644 index 00000000..02ac40cd --- /dev/null +++ b/framework/Web/UI/WebControls/TStyleSheet.php @@ -0,0 +1,78 @@ + + * @link http://www.pradosoft.com/ + * @copyright Copyright © 2005 PradoSoft + * @license http://www.pradosoft.com/license/ + * @version $Revision: $ $Date: $ + * @package System.Web.UI.WebControls + */ + +/** + * TStyleSheet class. + * + * TStyleSheet represents the link to a stylesheet file and/or a piece of + * stylesheet code. To specify the link to a CSS file, set {@link setStyleSheetUrl StyleSheetUrl}. + * The child rendering result of TStyleSheet is treated as CSS code and + * is rendered within an appropriate style HTML element. + * Therefore, if the child content is not empty, you should place the TStyleSheet + * control in the head section of your page to conform to the HTML standard. + * If only CSS file URL is specified, you may place the control anywhere on your page + * and the style element will be rendered in the right position. + * + * @author Wei Zhuo + * @version : $ Tue Jul 4 04:38:16 EST 2006 $ + * @package System.Web.UI.WebControl + * @since 3.0.2 + */ +class TStyleSheet extends TControl +{ + /** + * @param string URL to the stylesheet file + */ + public function setStyleSheetUrl($value) + { + $this->setViewState('StyleSheetUrl', $value); + } + + /** + * @return string URL to the stylesheet file + */ + public function getStyleSheetUrl() + { + return $this->getViewState('StyleSheetUrl', ''); + } + + /** + * Registers the stylesheet file and content to be rendered. + * This method overrides the parent implementation and is invoked right before rendering. + * @param mixed event parameter + */ + public function onPreRender($param) + { + if($this->getEnabled(true)) + { + if(($url=$this->getStyleSheetUrl())!=='') + $this->getPage()->getClientScript()->registerStyleSheetFile($url,$url); + } + } + + /** + * Renders the control. + * This method overrides the parent implementation and renders nothing. + * @param ITextWriter writer + */ + public function render($writer) + { + if($this->getHasControls()) + { + $writer->write("\n"); + } + } +} + +?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TTable.php b/framework/Web/UI/WebControls/TTable.php index 1c58c62e..ac61eb3f 100644 --- a/framework/Web/UI/WebControls/TTable.php +++ b/framework/Web/UI/WebControls/TTable.php @@ -129,7 +129,7 @@ class TTable extends TWebControl } /** - * @return TTableCellCollection list of {@link TTableCell} controls + * @return TTableRowCollection list of {@link TTableRow} controls */ public function getRows() { -- cgit v1.2.3