summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitattributes1
-rw-r--r--framework/Web/Javascripts/TJavaScript.php110
-rw-r--r--framework/Web/THttpUtility.php20
-rw-r--r--framework/Web/UI/TClientScriptManager.php164
-rw-r--r--framework/Web/UI/WebControls/TBaseValidator.php5
-rw-r--r--framework/Web/UI/WebControls/TColorPicker.php8
-rw-r--r--framework/Web/UI/WebControls/TDatePicker.php14
-rw-r--r--framework/Web/UI/WebControls/THtmlArea.php3
-rw-r--r--framework/Web/UI/WebControls/TJavascriptLogger.php2
-rw-r--r--framework/Web/UI/WebControls/TRatingList.php5
-rw-r--r--framework/Web/UI/WebControls/TTextHighlighter.php2
-rw-r--r--framework/Web/UI/WebControls/TValidationSummary.php3
-rw-r--r--framework/core.php4
13 files changed, 203 insertions, 138 deletions
diff --git a/.gitattributes b/.gitattributes
index 1a153e47..576c3796 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -589,6 +589,7 @@ framework/TApplicationComponent.php -text
framework/TComponent.php -text
framework/Web/Javascripts/TClientScript.php -text
framework/Web/Javascripts/TJSON.php -text
+framework/Web/Javascripts/TJavaScript.php -text
framework/Web/Javascripts/TJavascriptSerializer.php -text
framework/Web/Javascripts/colorpicker/background.png -text
framework/Web/Javascripts/colorpicker/button.gif -text
diff --git a/framework/Web/Javascripts/TJavaScript.php b/framework/Web/Javascripts/TJavaScript.php
new file mode 100644
index 00000000..f1efb5b3
--- /dev/null
+++ b/framework/Web/Javascripts/TJavaScript.php
@@ -0,0 +1,110 @@
+<?php
+
+/**
+ * TJavascript class file. Javascript utilties, converts basic PHP types into
+ * appropriate javascript types.
+ *
+ * Example:
+ * <code>
+ * $options['onLoading'] = "doit";
+ * $options['onComplete'] = "more";
+ * $js = new TJavascriptSerializer($options);
+ * echo $js->toMap();
+ * //expects the following javascript code
+ * // {'onLoading':'doit','onComplete':'more'}
+ * </code>
+ *
+ * For higher complexity data structures use TJSON to serialize and unserialize.
+ *
+ * Namespace: System.Web.UI
+ *
+ * @author Wei Zhuo<weizhuo[at]gmail[dot]com>
+ * @version $Revision: 1.3 $ $Date: 2005/11/10 23:43:26 $
+ * @package System.Web.UI
+ */
+class TJavaScript
+{
+ public static function quoteJavaScriptString($js,$forUrl=false)
+ {
+ if($forUrl)
+ return strtr($js,array('%'=>'%25',"\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\'));
+ else
+ return strtr($js,array("\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\'));
+ }
+
+ public static function trimJavaScriptString($js)
+ {
+ if($js!=='' && $js!==null)
+ {
+ $js=trim($js);
+ if(($pos=strpos($js,'javascript:'))===0)
+ $js=substr($js,11);
+ $js=rtrim($js,';').';';
+ }
+ return $js;
+ }
+
+ public static function encode($value,$toMap=true)
+ {
+ if(is_string($value))
+ {
+ if(($n=strlen($value))>2)
+ {
+ $first=$value[0];
+ $last=$value[$n-1];
+ if(($first==='[' && $last===']') || ($first==='{' && $last==='}'))
+ return $value;
+ }
+ return "'".self::quoteJavaScriptString($value)."'";
+ }
+ else if(is_bool($value))
+ return $value?'true':'false';
+ else if(is_array($value))
+ {
+ $results=array();
+ if($toMap)
+ {
+ foreach($value as $k=>$v)
+ $results[]="'{$k}':".self::encode($v,$toMap);
+ return '{'.implode(',',$results).'}';
+ }
+ else
+ {
+ foreach($value as $k=>$v)
+ $results[]=self::encode($v,$toMap);
+ return '['.implode(',',$results).']';
+ }
+ }
+ else if(is_integer($value))
+ return "$value";
+ else if(is_float($value))
+ {
+ if($value===-INF)
+ return 'Number.NEGATIVE_INFINITY';
+ else if($value===INF)
+ return 'Number.POSITIVE_INFINITY';
+ else
+ return "$value";
+ }
+ else if(is_object($value))
+ return self::encode(get_object_vars($this->data),$toMap);
+ else if($value===null)
+ return 'null';
+ else
+ return '';
+ }
+
+ public static function encodeJSON($value)
+ {
+ Prado::using('System.Web.Javascripts.TJSON');
+ return TJSON::encode($value);
+ }
+
+ public static function decodeJSON($value)
+ {
+ Prado::using('System.Web.Javascripts.TJSON');
+ return TJSON::decode($value);
+ }
+}
+
+?> \ No newline at end of file
diff --git a/framework/Web/THttpUtility.php b/framework/Web/THttpUtility.php
index 6aadb65d..34f1a8a4 100644
--- a/framework/Web/THttpUtility.php
+++ b/framework/Web/THttpUtility.php
@@ -38,26 +38,6 @@ class THttpUtility
{
self::$_entityTable=array_flip(get_html_translation_table(HTML_ENTITIES,ENT_QUOTES));
}
-
- public static function quoteJavaScriptString($js,$forUrl=false)
- {
- if($forUrl)
- return strtr($js,array('%'=>'%25',"\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\'));
- else
- return strtr($js,array("\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\'));
- }
-
- public static function trimJavaScriptString($js)
- {
- if($js!=='' && $js!==null)
- {
- $js=trim($js);
- if(($pos=strpos($js,'javascript:'))===0)
- $js=substr($js,11);
- $js=rtrim($js,';').';';
- }
- return $js;
- }
}
?> \ No newline at end of file
diff --git a/framework/Web/UI/TClientScriptManager.php b/framework/Web/UI/TClientScriptManager.php
index 39c23b99..c4ac316a 100644
--- a/framework/Web/UI/TClientScriptManager.php
+++ b/framework/Web/UI/TClientScriptManager.php
@@ -22,40 +22,91 @@ Prado::using('System.Web.Javascripts.*');
*/
class TClientScriptManager extends TApplicationComponent
{
- const SCRIPT_DIR='Web/Javascripts/js';
- //const POSTBACK_FUNC='Prado.doPostBack';
+ /**
+ * directory containing Prado javascript files
+ */
+ const SCRIPT_PATH='Web/Javascripts/js';
+ /**
+ * the PHP script for loading Prado javascript files
+ */
+ const SCRIPT_LOADER='clientscripts.php';
+ /**
+ * @var TPage page who owns this manager
+ */
private $_page;
+ /**
+ * @var array registered hidden fields, indexed by hidden field names
+ */
private $_hiddenFields=array();
private $_beginScripts=array();
private $_endScripts=array();
private $_scriptFiles=array();
+ private $_onSubmitStatements=array();
+ private $_arrayDeclares=array();
+ private $_expandoAttributes=array();
- //private $_headScriptFiles=array();
- //private $_headScripts=array();
+ private $_headScriptFiles=array();
+ private $_headScripts=array();
private $_styleSheetFiles=array();
private $_styleSheets=array();
- private $_client;
-
- /*private $_onSubmitStatements=array();
- private $_arrayDeclares=array();
- private $_expandoAttributes=array();
- private $_postBackScriptRegistered=false;
- private $_focusScriptRegistered=false;
- private $_scrollScriptRegistered=false;
- */
-
- private $_publishedScriptFiles=array();
+ private $_registeredPradoScripts=array();
+ private $_registeredPradoFiles=array();
+ /**
+ * Client-side javascript library dependencies
+ * @var array
+ */
+ private static $_pradoScripts=array(
+ 'prado' => array('prado'),
+ 'effects' => array('prado', 'effects'),
+ 'ajax' => array('prado', 'effects', 'ajax'),
+ 'validator' => array('prado', 'validator'),
+ 'logger' => array('prado', 'logger'),
+ 'datepicker' => array('prado', 'datepicker'),
+ 'rico' => array('prado', 'effects', 'ajax', 'rico'),
+ 'colorpicker' => array('prado', 'colorpicker')
+ );
+ /**
+ * Constructor.
+ * @param TPage page that owns this client script manager
+ */
public function __construct(TPage $owner)
{
$this->_page=$owner;
- $this->_client = new TClientScript($this);
}
+ /**
+ * Registers Prado scripts by library name.
+ * The script files will be published.
+ * @param string script library name. Valid names include
+ * 'prado', 'effects', 'ajax', 'validator', 'logger',
+ * 'datepicker', 'rico', 'colorpicker'.
+ */
+ public function registerPradoScript($name)
+ {
+ if(!isset($this->_registeredPradoScripts[$name]))
+ {
+ $this->_registeredPradoScripts[$name]=true;
+ if(!isset(self::$_pradoScripts[$name]))
+ throw new TInvalidOperationException('csmanager_pradoscript_invalid',$name);
+ $basePath=Prado::getFrameworkPath().'/'.self::SCRIPT_PATH;
+ foreach(self::$_pradoScripts[$name] as $script)
+ {
+ $this->publishFilePath($basePath.'/'.$script.'.js');
+ $this->_registeredPradoFiles[$script]=true;
+ }
+ $scriptLoader=$basePath.'/'.self::SCRIPT_LOADER;
+ $url=$this->publishFilePath($scriptLoader);
+ $url.='?js='.implode(',',array_keys($this->_registeredPradoFiles));
+ if($this->getApplication()->getMode()===TApplication::STATE_DEBUG)
+ $url.='&__nocache';
+ $this->registerScriptFile('prado:pradoscripts',$url);
+ }
+ }
public function registerPostBackControl($control,$namespace='Prado.WebUI')
{
@@ -67,7 +118,7 @@ class TClientScriptManager extends TApplicationComponent
$this->registerHiddenField(TPage::FIELD_POSTBACK_TARGET,'');
$this->registerHiddenField(TPage::FIELD_POSTBACK_PARAMETER,'');
- $this->registerClientScript('prado');
+ $this->registerPradoScript('prado');
}
protected function getPostBackOptions($control)
@@ -77,8 +128,7 @@ class TClientScriptManager extends TApplicationComponent
$postback['ID'] = $control->getClientID();
if(!isset($postback['FormID']))
$postback['FormID'] = $this->_page->getForm()->getClientID();
- $options = new TJavascriptSerializer($postback);
- return $options->toJavascript();
+ return TJavaScript::encode($postback);
}
/**
@@ -89,12 +139,9 @@ class TClientScriptManager extends TApplicationComponent
*/
public function registerDefaultButton($panel, $button)
{
- $serializer = new TJavascriptSerializer(
- $this->getDefaultButtonOptions($panel, $button));
- $options = $serializer->toJavascript();
+ $options = TJavaScript::encode($this->getDefaultButtonOptions($panel, $button));
$code = "new Prado.WebUI.DefaultButton($options);";
- $scripts = $this->_page->getClientScript();
- $scripts->registerEndScript("prado:".$panel->getClientID(), $code);
+ $this->registerEndScript("prado:".$panel->getClientID(), $code);
}
/**
@@ -108,63 +155,6 @@ class TClientScriptManager extends TApplicationComponent
return $options;
}
-
- /**
- * Register client scripts.
- */
- public function registerClientScript($script)
- {
- static $scripts = array();
- $scripts = array_unique(array_merge($scripts,
- TClientScript::getScripts($script)));
-
- $this->publishClientScriptAssets($scripts);
-
- //create the client script url
- $url = $this->publishClientScriptCompressorAsset();
- $url .= '?js='.implode(',', $scripts);
- if($this->getApplication()->getMode() == TApplication::STATE_DEBUG)
- $url .= '&__nocache';
- $this->registerScriptFile('prado:gzipscripts', $url);
- }
-
- /**
- * Publish each individual javascript file.
- */
- protected function publishClientScriptAssets($scripts)
- {
- foreach($scripts as $lib)
- {
- if(!isset($this->_publishedScriptFiles[$lib]))
- {
- $base = Prado::getFrameworkPath();
- $clientScripts = self::SCRIPT_DIR;
- $file = "{$base}/{$clientScripts}/{$lib}.js";
- $this->publishFilePath($file);
- $this->_publishedScriptFiles[$lib] = true;
- }
- }
- }
-
- /**
- * @return string URL of the compressor asset script.
- */
- protected function publishClientScriptCompressorAsset()
- {
- $scriptFile = 'clientscripts.php';
- if(isset($this->_publishedScriptFiles[$scriptFile]))
- return $this->_publishedScriptFiles[$scriptFile];
- else
- {
- $base = Prado::getFrameworkPath();
- $clientScripts = self::SCRIPT_DIR;
- $file = "{$base}/{$clientScripts}/{$scriptFile}";
- $url= $this->publishFilePath($file);
- $this->_publishedScriptFiles[$scriptFile] = $url;
- return $url;
- }
- }
-
/* protected function registerPostBackScript()
{
if(!$this->_postBackScriptRegistered)
@@ -449,18 +439,6 @@ class TClientScriptManager extends TApplicationComponent
$this->registerEndScript($key, $script);
}
*/
-
-
- /*
- private void EnsureEventValidationFieldLoaded();
- internal string GetEventValidationFieldValue();
- public string GetWebResourceUrl(Type type, string resourceName);
- public void RegisterClientScriptResource(Type type, string resourceName);
- internal void RegisterDefaultButtonScript(Control button, $writer, bool useAddAttribute);
- public function SaveEventValidationField();
- public void ValidateEvent(string uniqueId, string argument);
- public function getCallbackEventReference()
- */
}
/**
diff --git a/framework/Web/UI/WebControls/TBaseValidator.php b/framework/Web/UI/WebControls/TBaseValidator.php
index 97ba1a8b..46f031ca 100644
--- a/framework/Web/UI/WebControls/TBaseValidator.php
+++ b/framework/Web/UI/WebControls/TBaseValidator.php
@@ -156,7 +156,7 @@ abstract class TBaseValidator extends TLabel implements IValidator
$scriptKey = "TBaseValidator:$formID";
if($this->getEnableClientScript() && !$scripts->isEndScriptRegistered($scriptKey))
{
- $scripts->registerClientScript('validator');
+ $scripts->registerPradoScript('validator');
$scripts->registerEndScript($scriptKey, "Prado.Validation.AddForm('$formID');");
}
if($this->getEnableClientScript())
@@ -194,8 +194,7 @@ abstract class TBaseValidator extends TLabel implements IValidator
$class = get_class($this);
$scriptKey = "prado:".$this->getClientID();
$scripts = $this->getPage()->getClientScript();
- $serializer = new TJavascriptSerializer($this->getClientScriptOptions());
- $options = $serializer->toJavascript();
+ $options = TJavaScript::encode($this->getClientScriptOptions());
$js = "new Prado.Validation(Prado.Validation.{$class}, {$options});";
$scripts->registerEndScript($scriptKey, $js);
}
diff --git a/framework/Web/UI/WebControls/TColorPicker.php b/framework/Web/UI/WebControls/TColorPicker.php
index c0cc3ae7..fda6bced 100644
--- a/framework/Web/UI/WebControls/TColorPicker.php
+++ b/framework/Web/UI/WebControls/TColorPicker.php
@@ -168,8 +168,7 @@ class TColorPicker extends TTextBox
}
$imgs['button.gif'] = $list['button.gif'];
$imgs['background.png'] = $list['background.png'];
- $serializer = new TJavascriptSerializer($imgs);
- $options = $serializer->toJavascript();
+ $options = TJavaScript::encode($imgs);
$code = "Prado.WebUI.TColorPicker.UIImages = {$options};";
$cs->registerEndScript($key, $code);
return $list;
@@ -186,9 +185,8 @@ class TColorPicker extends TTextBox
parent::addAttributesToRender($writer);
$writer->addAttribute('id',$this->getClientID());
$scripts = $this->getPage()->getClientScript();
- $scripts->registerClientScript("colorpicker");
- $serializer = new TJavascriptSerializer($this->getColorPickerOptions());
- $options = $serializer->toJavascript();
+ $scripts->registerPradoScript("colorpicker");
+ $options = TJavaScript::encode($this->getColorPickerOptions());
$id = $this->getClientID();
$code = "Event.OnLoad(function(){ new Prado.WebUI.TColorPicker($options); });";
$scripts->registerEndScript("prado:$id", $code);
diff --git a/framework/Web/UI/WebControls/TDatePicker.php b/framework/Web/UI/WebControls/TDatePicker.php
index fd280938..a70e25b3 100644
--- a/framework/Web/UI/WebControls/TDatePicker.php
+++ b/framework/Web/UI/WebControls/TDatePicker.php
@@ -228,7 +228,8 @@ class TDatePicker extends TTextBox
{
$options['Format'] = $this->getDateFormat();
$options['FirstDayOfWeek'] = $this->getFirstDayOfWeek();
- $options['ClassName'] = $this->getCssClass();
+ if(($cssClass=$this->getCssClass())!=='')
+ $options['ClassName'] = $cssClass;
$options['FromYear'] = $this->getFromYear();
$options['UpToYear'] = $this->getUpToYear();
if($this->getMode()!=='Basic')
@@ -252,10 +253,8 @@ class TDatePicker extends TTextBox
Prado::using('System.I18N.core.DateTimeFormatInfo');
$info = Prado::createComponent('System.I18N.core.CultureInfo', $culture);
$date = $info->getDateTimeFormat();
- $serializer = new TJavascriptSerializer($date->getMonthNames());
- $options['MonthNames'] = $serializer->toList();
- $serializer = new TJavascriptSerializer($date->getAbbreviatedDayNames());
- $options['ShortWeekDayNames'] = $serializer->toList();
+ $options['MonthNames'] = TJavaScript::encode($date->getMonthNames(),false);
+ $options['ShortWeekDayNames'] = TJavaScript::encode($date->getAbbreviatedDayNames(),false);
return $options;
}
@@ -367,9 +366,8 @@ class TDatePicker extends TTextBox
if($this->getShowCalendar())
{
$scripts = $this->getPage()->getClientScript();
- $scripts->registerClientScript("datepicker");
- $serializer = new TJavascriptSerializer($this->getDatePickerOptions());
- $options = $serializer->toJavascript();
+ $scripts->registerPradoScript("datepicker");
+ $options = TJavaScript::encode($this->getDatePickerOptions());
$id = $this->getClientID();
$code = "Event.OnLoad(function(){ new Prado.WebUI.TDatePicker('$id', $options); });";
$scripts->registerEndScript("prado:$id", $code);
diff --git a/framework/Web/UI/WebControls/THtmlArea.php b/framework/Web/UI/WebControls/THtmlArea.php
index 1801e739..70788e2d 100644
--- a/framework/Web/UI/WebControls/THtmlArea.php
+++ b/framework/Web/UI/WebControls/THtmlArea.php
@@ -262,8 +262,7 @@ class THtmlArea extends TTextBox
$scripts = $this->getPage()->getClientScript();
if(!$scripts->isScriptFileRegistered('prado:THtmlArea'))
$scripts->registerScriptFile('prado:THtmlArea', $this->getScriptUrl());
- $serializer = new TJavascriptSerializer($this->getEditorOptions());
- $options = $serializer->toJavascript(true);
+ $options = TJavaScript::encode($this->getEditorOptions());
$script = "if(tinyMCE){ tinyMCE.init($options); }";
$scripts->registerEndScript('THtmlArea'.$this->ClientID,$script);
}
diff --git a/framework/Web/UI/WebControls/TJavascriptLogger.php b/framework/Web/UI/WebControls/TJavascriptLogger.php
index fa28d2b0..c38f7bc4 100644
--- a/framework/Web/UI/WebControls/TJavascriptLogger.php
+++ b/framework/Web/UI/WebControls/TJavascriptLogger.php
@@ -54,7 +54,7 @@ class TJavascriptLogger extends TWebControl
*/
public function renderContents($writer)
{
- $this->Page->ClientScript->registerClientScript('logger');
+ $this->Page->ClientScript->registerPradoScript('logger');
$info = '(<a href="http://gleepglop.com/javascripts/logger/" target="_blank">more info</a>).';
$usage = 'Press ALT-D (Or CTRL-D on OS X) to toggle the javascript log console';
$writer->write("{$usage} {$info}");
diff --git a/framework/Web/UI/WebControls/TRatingList.php b/framework/Web/UI/WebControls/TRatingList.php
index 4302c3b3..006391f7 100644
--- a/framework/Web/UI/WebControls/TRatingList.php
+++ b/framework/Web/UI/WebControls/TRatingList.php
@@ -106,9 +106,8 @@ class TRatingList extends TRadioButtonList
$this->publishRatingListAssets();
$id = $this->getClientID();
$scripts = $this->getPage()->getClientScript();
- $scripts->registerClientScript('prado');
- $serializer = new TJavascriptSerializer($this->getRatingClientOptions());
- $options = $serializer->toJavascript();
+ $scripts->registerPradoScript('prado');
+ $options = TJavaScript::encode($this->getRatingClientOptions());
$code = "new Prado.WebUI.TRatingList($options);";
$scripts->registerEndScript("prado:$id", $code);
}
diff --git a/framework/Web/UI/WebControls/TTextHighlighter.php b/framework/Web/UI/WebControls/TTextHighlighter.php
index 4eec7de1..cedc807f 100644
--- a/framework/Web/UI/WebControls/TTextHighlighter.php
+++ b/framework/Web/UI/WebControls/TTextHighlighter.php
@@ -85,7 +85,7 @@ class TTextHighlighter extends TWebControl
{
parent::onPreRender($writer);
$this->registerHighlightStyleSheet();
- $this->getPage()->getClientScript()->registerClientScript('prado');
+ $this->getPage()->getClientScript()->registerPradoScript('prado');
}
/**
diff --git a/framework/Web/UI/WebControls/TValidationSummary.php b/framework/Web/UI/WebControls/TValidationSummary.php
index 027a2cee..e7115c99 100644
--- a/framework/Web/UI/WebControls/TValidationSummary.php
+++ b/framework/Web/UI/WebControls/TValidationSummary.php
@@ -182,8 +182,7 @@ class TValidationSummary extends TWebControl
{
if(!$this->getEnabled(true) || !$this->getEnableClientScript())
return;
- $serializer = new TJavascriptSerializer($this->getClientScriptOptions());
- $options = $serializer->toJavascript();
+ $options=TJavaScript::encode($this->getClientScriptOptions());
$script = "new Prado.Validation.Summary({$options});";
$this->getPage()->getClientScript()->registerEndScript($this->getClientID(), $script);
}
diff --git a/framework/core.php b/framework/core.php
index c3a14c5d..d660fb81 100644
--- a/framework/core.php
+++ b/framework/core.php
@@ -46,6 +46,10 @@ require_once(PRADO_DIR.'/Data/TXmlDocument.php');
*/
require_once(PRADO_DIR.'/Web/THttpUtility.php');
/**
+ * Includes TJavaScript definition
+ */
+require_once(PRADO_DIR.'/Web/Javascripts/TJavaScript.php');
+/**
* Includes TCache definition
*/
require_once(PRADO_DIR.'/Data/TCache.php');