diff options
Diffstat (limited to 'framework/Web/UI/TClientScriptManager.php')
| -rw-r--r-- | framework/Web/UI/TClientScriptManager.php | 139 | 
1 files changed, 87 insertions, 52 deletions
| diff --git a/framework/Web/UI/TClientScriptManager.php b/framework/Web/UI/TClientScriptManager.php index a319595d..4fded17b 100644 --- a/framework/Web/UI/TClientScriptManager.php +++ b/framework/Web/UI/TClientScriptManager.php @@ -4,7 +4,7 @@   *   * @author Qiang Xue <qiang.xue@gmail.com>   * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005 PradoSoft + * @copyright Copyright © 2005-2007 PradoSoft   * @license http://www.pradosoft.com/license/   * @version $Id$   * @package System.Web.UI @@ -25,11 +25,11 @@ class TClientScriptManager extends TApplicationComponent  	/**  	 * directory containing Prado javascript files  	 */ -	const SCRIPT_PATH='Web/Javascripts/js'; +	const SCRIPT_PATH='Web/Javascripts/source';  	/**  	 * the PHP script for loading Prado javascript files  	 */ -	const SCRIPT_LOADER='clientscripts.php'; +	const SCRIPT_LOADER='Web/Javascripts/clientscripts.php';  	/**  	 * @var TPage page who owns this manager @@ -72,22 +72,10 @@ class TClientScriptManager extends TApplicationComponent  	 */  	private $_registeredPradoScripts=array();  	/** -	 * @var array published PRADO script files -	 */ -	private $_publishedPradoFiles=array(); -	/** -	 * Client-side javascript library dependencies +	 * Client-side javascript library dependencies, loads from SCRIPT_PATH.'/packages.php';  	 * @var array  	 */ -	private static $_pradoScripts=array( -		'prado'			=> array('prado'), -		'effects'		=> array('prado', 'effects'), -		'validator'		=> array('prado', 'validator'), -		'logger'		=> array('prado', 'logger'), -		'datepicker'	=> array('prado', 'datepicker'), -		'colorpicker'	=> array('prado', 'colorpicker'), -		'ajax'			=> array('prado', 'effects', 'ajax') -		); +	private static $_pradoScripts;  	/**  	 * Constructor. @@ -99,23 +87,13 @@ class TClientScriptManager extends TApplicationComponent  	}  	/** -	 * Registers Prado scripts by library name. -	 * Each library may include one or several script files. -	 * Currently, the following libraries are available: -	 * - prado : basic prado js framework -	 * - effects : -	 * - ajax : ajax related js -	 * - validator : validator js -	 * - logger : js logger -	 * - datepicker : datepicker js -	 * - colorpicker : colorpicker js -	 * The script files registered will be published. +	 * Registers Prado javascript by library name. See "Web/Javascripts/source/packages.php" +	 * for library names.  	 * @param string script library name.  	 */  	public function registerPradoScript($name)  	{  		$this->registerPradoScriptInternal($name); -  		$params=func_get_args();  		$this->_page->registerCachingAction('Page.ClientScript','registerPradoScript',$params);  	} @@ -127,32 +105,28 @@ class TClientScriptManager extends TApplicationComponent  	{  		if(!isset($this->_registeredPradoScripts[$name]))  		{ +			if(is_null(self::$_pradoScripts)) +			{ +				$packageFile = Prado::getFrameworkPath().'/'.self::SCRIPT_PATH.'/packages.php'; +				list($packages,$deps)= include($packageFile); +				self::$_pradoScripts = $deps; +			} +  			if(isset(self::$_pradoScripts[$name]))  				$this->_registeredPradoScripts[$name]=true;  			else  				throw new TInvalidOperationException('csmanager_pradoscript_invalid',$name); -			$basePath=$this->getPradoScriptBasePath(); -			foreach(self::$_pradoScripts[$name] as $script) -			{ -				if(!isset($this->_publishedPradoFiles[$script])) -				{ -					$this->publishFilePath($basePath.'/'.$script.'.js'); -					$this->_publishedPradoFiles[$script]=true; -				} -			}  		}  	}  	/** -	 * @return string the directory containing the PRADO js script files +	 * @return string Prado javascript library base asset url.  	 */ -	protected function getPradoScriptBasePath() +	public function getPradoScriptAssetUrl()  	{ -		$basePath = Prado::getFrameworkPath().'/'.self::SCRIPT_PATH; -		if($this->getApplication()->getMode()===TApplicationMode::Debug) -			return $basePath.'/debug'; -		else -			return $basePath.'/compressed'; +		$base = Prado::getFrameworkPath().'/'.self::SCRIPT_PATH; +		$assets = Prado::getApplication()->getAssetManager(); +		return $assets->getPublishedUrl($base);  	}  	/** @@ -161,19 +135,80 @@ class TClientScriptManager extends TApplicationComponent  	 */  	protected function renderPradoScripts($writer)  	{ -		$files=implode(',',array_keys($this->_publishedPradoFiles)); -		if($files!=='') +		$files=array_keys($this->_registeredPradoScripts); +		if(count($files) > 0)  		{ -			$basePath=$this->getPradoScriptBasePath(); -			$scriptLoader=$basePath.'/'.self::SCRIPT_LOADER; -			$url=$this->publishFilePath($scriptLoader).'?js='.trim($files,','); -			if($this->getApplication()->getMode()===TApplicationMode::Debug) -				$url.='&mode=debug'; +			$base = Prado::getFrameworkPath().'/'.self::SCRIPT_PATH; +			$url = $this->registerJavascriptPackages($base, $files);  			$writer->write(TJavaScript::renderScriptFile($url));  		}  	}  	/** +	 * Publishes a javascript library path and register packages to be loaded. +	 * See TClientScriptLoader for component that enables users to register custom javascript libraries. +	 * @param string javascript library base path +	 * @param array list of packages or javascript files (without .js extension) to be loaded. +	 * @param boolean true to enable keep comments in javascript files loaded, null to use application configuration. +	 * @param boolean true to gzip the javascript code if browsers and php supports it. +	 * @return string javascript src url +	 * @since 3.1 +	 */ +	public function registerJavascriptPackages($base, $packages, $debug=null, $gzip=true) +	{ +		list($path,$url) = $this->getPackagePathUrl($base); +		$scriptLoaderPath = $path.'/'.basename(self::SCRIPT_LOADER); +		$scriptLoaderSrc = Prado::getFrameworkPath().'/'.self::SCRIPT_LOADER; +		if(!is_file($scriptLoaderPath)) +			copy($scriptLoaderSrc, $scriptLoaderPath); +		$url .= '/'.basename(self::SCRIPT_LOADER).'?js='.implode(',', $packages); +		if($debug!==false && $this->getApplication()->getMode()===TApplicationMode::Debug) +		{ +			$this->verifyJavascriptPackages($base,$path,$packages); +			$url.='&mode=debug'; +		} +		if($gzip===false) +			$url.='&gzip=false'; +		return $url; +	} + +	/** +	 * @throws TConfigurationException when javascript packages mismatch. +	 */ +	protected function verifyJavascriptPackages($base,$path,$scripts) +	{ +		$file = $path.'/packages.php'; +		if(is_file($file)) +		{ +			list($packs,$deps) = include($file); +			if(count($missing = array_diff($scripts, array_keys($deps))) > 0) +			{ +				throw new TConfigurationException('csmanager_invalid_packages', +					$base.'/packages.php',implode(', ', $missing), implode(', ', array_keys($deps))); +			} +		} +	} + +	/** +	 * @param string javascript package path. +	 * @return array tuple($path,$url). +	 */ +	protected function getPackagePathUrl($base) +	{ +		$assets = Prado::getApplication()->getAssetManager(); +		if(strpos($base, $assets->getBaseUrl())===false) +		{ +			if(!is_null($dir = Prado::getPathOfNameSpace($base))) +				$base = $dir; +			return array($assets->getPublishedPath($base), $assets->publishFilePath($base)); +		} +		else +		{ +			return array($assets->getBasePath().str_replace($assets->getBaseUrl(),'',$base), $base); +		} +	} + +	/**  	 * Returns javascript statement that create a new callback request object.  	 * @param ICallbackEventHandler callback response handler  	 * @param array additional callback options | 
