* @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2011 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.UI */ /** * TClientScriptManager class. * * TClientScriptManager manages javascript and CSS stylesheets for a page. * * @author Qiang Xue * @version $Id$ * @package System.Web.UI * @since 3.0 */ class TClientScriptManager extends TApplicationComponent { /** * directory containing Prado javascript files */ const SCRIPT_PATH='Web/Javascripts/source'; /** * the PHP script for loading Prado javascript files */ const SCRIPT_LOADER='Web/Javascripts/clientscripts.php'; /** * @var TPage page who owns this manager */ private $_page; /** * @var array registered hidden fields, indexed by hidden field names */ private $_hiddenFields=array(); /** * @var array javascript blocks to be rendered at the beginning of the form */ private $_beginScripts=array(); /** * @var array javascript blocks to be rendered at the end of the form */ private $_endScripts=array(); /** * @var array javascript files to be rendered in the form */ private $_scriptFiles=array(); /** * @var array javascript files to be rendered in page head section */ private $_headScriptFiles=array(); /** * @var array javascript blocks to be rendered in page head section */ private $_headScripts=array(); /** * @var array CSS files */ private $_styleSheetFiles=array(); /** * @var array CSS declarations */ private $_styleSheets=array(); /** * @var array registered PRADO script libraries */ private $_registeredPradoScripts=array(); /** * Client-side javascript library dependencies, loads from SCRIPT_PATH.'/packages.php'; * @var array */ private static $_pradoScripts; /** * Client-side javascript library packages, loads from SCRIPT_PATH.'/packages.php'; * @var array */ private static $_pradoPackages; /** * Constructor. * @param TPage page that owns this client script manager */ public function __construct(TPage $owner) { $this->_page=$owner; } /** * @return boolean whether THead is required in order to render CSS and js within head * @since 3.1.1 */ public function getRequiresHead() { return count($this->_styleSheetFiles) || count($this->_styleSheets) || count($this->_headScriptFiles) || count($this->_headScripts); } /** * 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); } /** * Registers a Prado javascript library to be loaded. */ private function registerPradoScriptInternal($name) { if(!isset($this->_registeredPradoScripts[$name])) { if(self::$_pradoScripts === null) { $packageFile = Prado::getFrameworkPath().DIRECTORY_SEPARATOR.self::SCRIPT_PATH.'/packages.php'; list($packages,$deps)= include($packageFile); self::$_pradoScripts = $deps; self::$_pradoPackages = $packages; } if(isset(self::$_pradoScripts[$name])) $this->_registeredPradoScripts[$name]=true; else throw new TInvalidOperationException('csmanager_pradoscript_invalid',$name); } } /** * @return string Prado javascript library base asset url. */ public function getPradoScriptAssetUrl() { $base = Prado::getFrameworkPath().DIRECTORY_SEPARATOR.self::SCRIPT_PATH; $assets = Prado::getApplication()->getAssetManager(); return $assets->getPublishedUrl($base); } /** * Renders the HTML tags for PRADO js files * @param THtmlWriter writer */ protected function renderPradoScripts($writer) { if(($packages=array_keys($this->_registeredPradoScripts))!==array()) { if (Prado::getApplication()->getMode()!==TApplicationMode::Debug) { $base = Prado::getFrameworkPath().DIRECTORY_SEPARATOR.self::SCRIPT_PATH; $url = $this->registerJavascriptPackages($base, $packages); $writer->write(TJavaScript::renderScriptFile($url)); } else { // In debug mode, we add 1