diff options
| author | xue <> | 2006-07-04 23:25:41 +0000 | 
|---|---|---|
| committer | xue <> | 2006-07-04 23:25:41 +0000 | 
| commit | 9cc6b7fffd31f4b9ee9aceef9224c84dcf28aeb8 (patch) | |
| tree | d3d6d907278b06feef3fc77c14d2231cfbff1125 /framework | |
| parent | 2cf86eb80ae66da86eb2e37f0f99b2035241d3ae (diff) | |
Merge from 3.0 branch till 1239.
Diffstat (limited to 'framework')
| -rw-r--r-- | framework/Collections/TList.php | 4 | ||||
| -rw-r--r-- | framework/Collections/TMap.php | 4 | ||||
| -rw-r--r-- | framework/Exceptions/messages.txt | 2 | ||||
| -rw-r--r-- | framework/Web/THttpResponse.php | 2 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TClientScript.php | 154 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TDataGrid.php | 32 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TFileUpload.php | 2 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TStyleSheet.php | 78 | ||||
| -rw-r--r-- | framework/Web/UI/WebControls/TTable.php | 2 | 
9 files changed, 251 insertions, 29 deletions
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,
 - * 
 + *
   * <code>
   * <com:TClientScript UsingPradoScripts="effects, rico" />
   * </code>
 - * 
 + *
   * 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.
 + * <code>
 + * <com:TClientScript ScriptUrl=<%~ test.js %> />
 + * </code>
 + *
 + * 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
 + *
 + *  - <b>Head</b> -- renders the script within the <head>
 + *  - <b>Begin</b> -- renders the script within and near the begining of TForm
 + *  - <b>Here</b> -- renders the script inplace, this is the default
 + *  - <b>End</b> -- renders the script within and near the end of TForm
 + *
 + * TODO: Allow binding expressions inside scripts
   *
   * @author Wei Zhuo <weizhuo[at]gmail[dot]com>
   * @version $Revision: $  $Date: $
 @@ -37,6 +54,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
  	}
  	/**
 @@ -247,6 +247,14 @@ class TDataGrid extends TBaseDataList implements INamingContainer  	}
  	/**
 +	 * @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.
  	 * @return TTableStyle control style to be used
 @@ -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 @@ +<?php +/** + * TStyleSheet class file. + * + * @author Wei Zhuo <weizhuo[at]gmail[dot]com> + * @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 <weizhuo[at]gmail[dot]com> + * @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("<style type=\"text/css\">\n/*<![CDATA[*/\n"); +			$this->renderChildren($writer); +			$writer->write("\n/*]]>*/\n</style>\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()
  	{
  | 
