diff options
author | Ciro Mattia Gonano <ciromattia@gmail.com> | 2013-07-24 12:22:49 +0200 |
---|---|---|
committer | Ciro Mattia Gonano <ciromattia@gmail.com> | 2013-07-24 12:22:49 +0200 |
commit | 0f332e6564ed67ef7eb4d715ce3bcb5ff54c50cf (patch) | |
tree | 00cecb80224872c25e712a59b417c5f1dff240cb | |
parent | 3c208455c7775838e795909923536a7de13d9c5c (diff) |
Upgrade to newly released 3.2.23.2.2
29 files changed, 714 insertions, 199 deletions
@@ -1,3 +1,27 @@ +Version 3.2.2 Jul 20, 2013 + +ENH: Issue #50 - TUrlMapping - implement caching for loadUrlMappings (ctrlaltca) +ENH: Issue #433 - Prado object-creation performance micro-optimizations (gabor) +BUG: Issue #434 - Buttons stops working properly after response->writeFile (ctrlaltca) +BUG: Issue #435 - TWizard + No ID = Prototype Error (ctrlaltca) +BUG: Issue #436 - French Canadian date formats should be the same in TDateFormat and TDatePicker (ctrlaltca) +ENH: Issue #437 - TUrlMapping optimizations: merge DxUrlMapping (gabor) +ENH: Issue #439 - Module lazy loading (ctrlaltca) +BUG: Issue #441 - TAccordion's ActiveViewIndex property is not honored on postback (ctrlatca) +BUG: Issue #442 - TWizard's ShowSideBar property can't be changed from php (ctrlaltca) +BUG: Issue #444 - Input validation vulnerability in unit test (ctrlaltca) +BUG: Issue #446 - THtmlArea can't be updated in a callback (ctrlaltca) +BUG: Issue #447 - Array to string conversion notice in TClientScriptManager (ctrlaltca) +ENH: Issue #448 - Add TEACache eAccellerator cache module (drigolin) +BUG: Issue #315 - TEmailAddressValidator regex (ctrlaltca) +ENH: Issue #454 - TDraggableConstraint missing (ctrlaltca) +ENH: Issue #455 - Support PDO::sqlsrv to support MS SQL database servers for PHP5.2+ (jonathan.martens) +ENH: Issue #456 - Add ImageAlign to THyperLink (raoul@bhatia.at) +ENH: Issue #459 - Add ToolTip and AlternateText to TButtonColumn (raoul@bhatia.at) +ENH: Issue #451 - TRequiredFieldValidator should (automatically?) consider PromptValue as error (ctrlaltca) +BUG: Issue #460 - Minor error in TUrlMappingPattern (raoul@bhatia.at) +BUG: Issue #464 - Do not issue a callback request if an ActiveControl is disabled (ctrlaltca) + Version 3.2.1 Jan 19, 2013 BUG: Issue #44 - [895] SDateFormatter cannot parse date earlier than 1970 (ctrlaltca) @@ -1,5 +1,5 @@ - Upgrading Instructions for PRADO Framework v3.2.1 + Upgrading Instructions for PRADO Framework v3.2.2 ================================================= !!!IMPORTANT!!! @@ -9,6 +9,10 @@ if you want to upgrade from version A to version C and there is version B between A and C, you need to following the instructions for both A and B. +Upgrading from v3.2.1 +--------------------- +- TEmailAddressValidator's CheckMXRecord property now defaults to false. + Upgrading from v3.2.0 --------------------- - The TSecurityManagerValidationMode class and TSecurityManager's Validation property have been deprecated. diff --git a/buildscripts/texbuilder/quickstart/quickstart.tex b/buildscripts/texbuilder/quickstart/quickstart.tex index 4bf3402b..deaba73c 100644 --- a/buildscripts/texbuilder/quickstart/quickstart.tex +++ b/buildscripts/texbuilder/quickstart/quickstart.tex @@ -52,7 +52,7 @@ %----------------- TITLE -------------- -\title{\Huge \bfseries PRADO v3.2.1 Quickstart Tutorial +\title{\Huge \bfseries PRADO v3.2.2 Quickstart Tutorial \thanks{Copyright 2004-2013. All Rights Reserved.} } \author{Qiang Xue and Wei Zhuo} diff --git a/demos/quickstart/protected/pages/Configurations/AppConfig.page b/demos/quickstart/protected/pages/Configurations/AppConfig.page index 83f1bc7e..7887d959 100644 --- a/demos/quickstart/protected/pages/Configurations/AppConfig.page +++ b/demos/quickstart/protected/pages/Configurations/AppConfig.page @@ -56,4 +56,61 @@ An external configuration file has the same format as described above. Although By default without explicit configuration, a PRADO application will load a few core modules, such as <tt>THttpRequest</tt>, <tt>THttpResponse</tt>, etc. It will also provide the <tt>TPageService</tt> as a default service. Configuration and usage of these modules and services are covered in individual sections of this tutorial. Note, if your application takes default settings for these modules and service, you do not need to provide an application configuration. However, if these modules or services are not sufficient, or you want to change their behavior by configuring their property values, you will need an application configuration.
</p>
+<com:SinceVersion Version="3.2.2" />
+<p class="block-content">
+By default PRADO instanciates all modules defined in the application configuration at the beginning of the application lifecycle. This can hit the application performance if you have a lot of modules defined but not used at every request.
+Since version 3.2.2 you can set the <tt>lazy</tt> property on modules defined in the application configuration to enable the lazy loading of that module.
+
+<com:TTextHighlighter Language="xml" CssClass="source block-content">
+ <modules>
+ <module id="ModuleID" class="ModuleClass" lazy="true" PropertyName="PropertyValue" ... />
+ </modules>
+</com:TTextHighlighter>
+
+A module with the <tt>lazy</tt> property set won't be instanciated until the first time it gets actually used by the application:
+
+<com:TTextHighlighter Language="php" CssClass="source block-content">
+ // requesting the lazy module to the application will instanciate it
+ Prado::getApplication()->getModule('ModuleID');
+</com:TTextHighlighter>
+</p>
+
+<com:SinceVersion Version="3.2" />
+<p class="block-content">
+Since version 3.2 the application configuration can be stored in PHP array format in a file named <tt>application.php</tt>.
+The format of the configuration file is exactly the same of its XML counterpart, but following the PHP syntax.
+</p>
+
+<com:TTextHighlighter Language="php" CssClass="source block-content">
+<?php
+return array(
+ 'application' => array(
+ 'PropertyName' => 'PropertyValue'
+ ),
+ 'modules' => array(
+ 'ModuleID' => array(
+ 'class' => 'ModuleClass',
+ 'properties' => array(
+ 'PropertyName' => 'PropertyValue'
+ ),
+ ),
+ ),
+ 'services' => array(
+ 'ServiceID' => array(
+ 'class' => 'ServiceClass',
+ 'properties' => array(
+ 'PropertyName' => 'PropertyValue'
+ ),
+ ),
+ ),
+);
+</com:TTextHighlighter>
+
+The use of a PHP application configuration must be defined in the <tt>TApplication</tt> constructor, tipically located in the <tt>index.php</tt> entry script:
+
+<com:TTextHighlighter Language="php" CssClass="source block-content">
+$application=new TApplication('protected',false,TApplication::CONFIG_TYPE_PHP);
+$application->run();
+</com:TTextHighlighter>
+
</com:TContent>
diff --git a/demos/quickstart/protected/pages/Controls/ClientScriptLoader.page b/demos/quickstart/protected/pages/Controls/ClientScriptLoader.page deleted file mode 100644 index e69de29b..00000000 --- a/demos/quickstart/protected/pages/Controls/ClientScriptLoader.page +++ /dev/null diff --git a/demos/quickstart/protected/pages/GettingStarted/NewFeatures.page b/demos/quickstart/protected/pages/GettingStarted/NewFeatures.page index 98adc925..aaeb2b9c 100644 --- a/demos/quickstart/protected/pages/GettingStarted/NewFeatures.page +++ b/demos/quickstart/protected/pages/GettingStarted/NewFeatures.page @@ -6,11 +6,19 @@ This page summarizes the main new features that are introduced in each PRADO release. </p> +<h2 id="8001">Version 3.2.2</h2> +<ul> +<li>TUrlMappingPattern support for constant parameters</li> +<li>Added EnableCache property to THttpRequest to enable caching of the TUrlManager and any TMappingUrl pattern</li> +<li>Lazy module loading in application configuration</li> +<li>TEACache eAccellerator cache module</li> +</ul> + <h2 id="8001">Version 3.2.1</h2> <ul> -<li>TSecurityManager has been enhanced to support all the ciphers available in php</a></li> -<li>Added a new UrlFormat for TUrlManager: HiddenPath; works like the 'Path' format, but hides the entryscript.php name</a></li> -<li>Updated external packages</a></li> +<li>TSecurityManager has been enhanced to support all the ciphers available in php</li> +<li>Added a new UrlFormat for TUrlManager: HiddenPath; works like the 'Path' format, but hides the entryscript.php name</li> +<li>Updated external packages</li> </ul> <h2 id="8001">Version 3.2.0</h2> diff --git a/framework/Data/Common/TDbMetaData.php b/framework/Data/Common/TDbMetaData.php index 91cf9616..2ad5c592 100644 --- a/framework/Data/Common/TDbMetaData.php +++ b/framework/Data/Common/TDbMetaData.php @@ -6,7 +6,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: TDbMetaData.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TDbMetaData.php 3284 2013-04-11 07:14:59Z ctrlaltca $ * @package System.Data.Common */ @@ -17,7 +17,7 @@ * Use the {@link getTableInfo} method to retrieve a table information. * * @author Wei Zhuo <weizho[at]gmail[dot]com> - * @version $Id: TDbMetaData.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TDbMetaData.php 3284 2013-04-11 07:14:59Z ctrlaltca $ * @package System.Data.Common * @since 3.1 */ @@ -70,6 +70,7 @@ abstract class TDbMetaData extends TComponent Prado::using('System.Data.Common.Sqlite.TSqliteMetaData'); return new TSqliteMetaData($conn); case 'mssql': // Mssql driver on windows hosts + case 'sqlsrv': // sqlsrv driver on windows hosts case 'dblib': // dblib drivers on linux (and maybe others os) hosts Prado::using('System.Data.Common.Mssql.TMssqlMetaData'); return new TMssqlMetaData($conn); diff --git a/framework/Data/SqlMap/Statements/TPreparedCommand.php b/framework/Data/SqlMap/Statements/TPreparedCommand.php index 59a58b5d..1e6906a1 100644 --- a/framework/Data/SqlMap/Statements/TPreparedCommand.php +++ b/framework/Data/SqlMap/Statements/TPreparedCommand.php @@ -6,7 +6,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: TPreparedCommand.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TPreparedCommand.php 3261 2013-01-22 22:36:51Z ctrlaltca $ * @package System.Data.SqlMap.Statements */ @@ -17,7 +17,7 @@ Prado::using('System.Data.Common.TDbCommandBuilder'); * TPreparedCommand class. * * @author Wei Zhuo <weizho[at]gmail[dot]com> - * @version $Id: TPreparedCommand.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TPreparedCommand.php 3261 2013-01-22 22:36:51Z ctrlaltca $ * @package System.Data.SqlMap.Statements * @since 3.1 */ @@ -47,9 +47,10 @@ class TPreparedCommand protected function applyParameterMap($manager,$command,$prepared, $statement, $parameterObject) { - $properties = $prepared->getParameterNames(); - $parameters = $prepared->getParameterValues(); + $properties = $prepared->getParameterNames(false); + //$parameters = $prepared->getParameterValues(); $registry=$manager->getTypeHandlers(); + if ($properties) for($i = 0, $k=$properties->getCount(); $i<$k; $i++) { $property = $statement->parameterMap()->getProperty($i); diff --git a/framework/Data/SqlMap/Statements/TPreparedStatement.php b/framework/Data/SqlMap/Statements/TPreparedStatement.php index f46994ab..4127eae0 100644 --- a/framework/Data/SqlMap/Statements/TPreparedStatement.php +++ b/framework/Data/SqlMap/Statements/TPreparedStatement.php @@ -6,7 +6,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: TPreparedStatement.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TPreparedStatement.php 3261 2013-01-22 22:36:51Z ctrlaltca $ * @package System.Data.SqlMap.Statements */ @@ -14,7 +14,7 @@ * TpreparedStatement class. * * @author Wei Zhuo <weizho[at]gmail[dot]com> - * @version $Id: TPreparedStatement.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TPreparedStatement.php 3261 2013-01-22 22:36:51Z ctrlaltca $ * @package System.Data.SqlMap.Statements * @since 3.1 */ @@ -24,33 +24,32 @@ class TPreparedStatement extends TComponent private $_parameterNames; private $_parameterValues; - public function __construct() - { - $this->_parameterNames=new TList; - $this->_parameterValues=new TMap; - } - public function getPreparedSql(){ return $this->_sqlString; } public function setPreparedSql($value){ $this->_sqlString = $value; } - public function getParameterNames(){ return $this->_parameterNames; } - public function setParameterNames($value){ $this->_parameterNames = $value; } + public function getParameterNames($needed = true) + { + if (!$this->_parameterNames and $needed) + $this->_parameterNames = new TList; + return $this->_parameterNames; + } - public function getParameterValues(){ return $this->_parameterValues; } - public function setParameterValues($value){ $this->_parameterValues = $value; } + public function setParameterNames($value){ $this->_parameterNames = $value; } - public function __wakeup() - { - parent::__wakeup(); - if (!$this->_parameterNames) $this->_parameterNames = new TList; - if (!$this->_parameterValues) $this->_parameterValues = new TMap; + public function getParameterValues($needed = true) + { + if (!$this->_parameterValues and $needed) + $this->_parameterValues=new TMap; + return $this->_parameterValues; } + + public function setParameterValues($value){ $this->_parameterValues = $value; } public function __sleep() { $exprops = array(); $cn = __CLASS__; - if (!$this->_parameterNames->getCount()) $exprops[] = "\0$cn\0_parameterNames"; - if (!$this->_parameterValues->getCount()) $exprops[] = "\0$cn\0_parameterValues"; + if (!$this->_parameterNames or !$this->_parameterNames->getCount()) $exprops[] = "\0$cn\0_parameterNames"; + if (!$this->_parameterValues or !$this->_parameterValues->getCount()) $exprops[] = "\0$cn\0_parameterValues"; return array_diff(parent::__sleep(),$exprops); } } diff --git a/framework/Exceptions/messages/messages.txt b/framework/Exceptions/messages/messages.txt index 69fd89fc..c9e7f9c5 100644 --- a/framework/Exceptions/messages/messages.txt +++ b/framework/Exceptions/messages/messages.txt @@ -102,11 +102,11 @@ memcache_host_unchangeable = TMemCache.Host cannot be modified after the modu memcache_port_unchangeable = TMemCache.Port cannot be modified after the module is initialized. apccache_extension_required = TAPCCache requires APC PHP extension. -apccache_add_unsupported = TAPCCache.add() is not supported. -apccache_replace_unsupported = TAPCCache.replace() is not supported. apccache_extension_not_enabled = TAPCCache need apc.enabled = 1 in php.ini in order to work. apccache_extension_not_enabled_cli = TAPCCache need apc.enable_cli = 1 in php.ini in order to work with PHP from the command line. +eacceleratorcache_extension_required = TEACache requires eAccellerator PHP extension. + errorhandler_errortemplatepath_invalid = TErrorHandler.ErrorTemplatePath '{0}' is invalid. Make sure it is in namespace form and points to a valid directory containing error template files. pageservice_page_unknown = Page '{0}' Not Found diff --git a/framework/I18N/core/data/fr_CA.dat b/framework/I18N/core/data/fr_CA.dat index fb152bf0..855fe7a6 100644 --- a/framework/I18N/core/data/fr_CA.dat +++ b/framework/I18N/core/data/fr_CA.dat @@ -1 +1 @@ -a:4:{s:10:"Currencies";a:2:{s:3:"CAD";a:2:{i:0;s:1:"$";i:1;s:15:"dollar canadien";}s:3:"USD";a:2:{i:0;s:4:"$ US";i:1;s:22:"dollar des États-Unis";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;(#,##0.00¤)";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:1;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:24:"HH' h 'mm' min 'ss' s 'z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:8:"yy-MM-dd";i:7;s:8:"yy-MM-dd";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:7;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file +a:4:{s:10:"Currencies";a:2:{s:3:"CAD";a:2:{i:0;s:1:"$";i:1;s:15:"dollar canadien";}s:3:"USD";a:2:{i:0;s:4:"$ US";i:1;s:22:"dollar des États-Unis";}}s:14:"NumberPatterns";a:4:{i:0;s:20:"#,##0.###;-#,##0.###";i:1;s:24:"#,##0.00 ¤;(#,##0.00¤)";i:2;s:6:"#,##0%";i:3;s:3:"#E0";}s:7:"Version";a:1:{i:0;s:3:"1.2";}s:8:"calendar";a:1:{s:9:"gregorian";a:3:{s:26:"DateTimeElements:intvector";a:2:{i:0;i:1;i:1;i:4;}s:16:"DateTimePatterns";a:9:{i:0;s:24:"HH' h 'mm' min 'ss' s 'z";i:1;s:10:"HH:mm:ss z";i:2;s:8:"HH:mm:ss";i:3;s:5:"HH:mm";i:4;s:16:"EEEE d MMMM yyyy";i:5;s:11:"d MMMM yyyy";i:6;s:10:"yyyy-MM-dd";i:7;s:8:"yy-MM-dd";i:8;s:7:"{1} {0}";}s:17:"weekend:intvector";a:4:{i:0;i:7;i:1;i:0;i:2;i:1;i:3;i:86400000;}}}}
\ No newline at end of file diff --git a/framework/TApplication.php b/framework/TApplication.php index 6a404bcc..a4a4b423 100644 --- a/framework/TApplication.php +++ b/framework/TApplication.php @@ -6,7 +6,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: TApplication.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TApplication.php 3272 2013-02-13 21:43:28Z ctrlaltca $ * @package System */ @@ -105,7 +105,7 @@ Prado::using('System.I18N.TGlobalization'); * </code> * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TApplication.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TApplication.php 3272 2013-02-13 21:43:28Z ctrlaltca $ * @package System * @since 3.0 */ @@ -205,10 +205,14 @@ class TApplication extends TComponent */ private $_service; /** - * @var array list of application modules + * @var array list of loaded application modules */ private $_modules=array(); /** + * @var array list of application modules yet to be loaded + */ + private $_lazyModules=array(); + /** * @var TMap list of application parameters */ private $_parameters; @@ -607,7 +611,7 @@ class TApplication extends TComponent } /** - * @return string the applictaion configuration type. default is 'xml' + * @return string the application configuration type. default is 'xml' */ public function getConfigurationFileExt() { @@ -685,9 +689,9 @@ class TApplication extends TComponent * Adds a module to application. * Note, this method does not do module initialization. * @param string ID of the module - * @param IModule module object + * @param IModule module object or null if the module has not been loaded yet */ - public function setModule($id,IModule $module) + public function setModule($id,IModule $module=null) { if(isset($this->_modules[$id])) throw new TConfigurationException('application_moduleid_duplicated',$id); @@ -700,10 +704,22 @@ class TApplication extends TComponent */ public function getModule($id) { - return isset($this->_modules[$id])?$this->_modules[$id]:null; + if(!array_key_exists($id, $this->_modules)) + return null; + + // force loading of a lazy module + if($this->_modules[$id]===null) + { + $module = $this->internalLoadModule($id, true); + $module[0]->init($module[1]); + } + + return $this->_modules[$id]; } /** + * Returns a list of application modules indexed by module IDs. + * Modules that have not been loaded yet are returned as null objects. * @return array list of loaded application modules, indexed by module IDs */ public function getModules() @@ -938,6 +954,28 @@ class TApplication extends TComponent return 'TApplicationConfiguration'; } + protected function internalLoadModule($id, $force=false) + { + list($moduleClass, $initProperties, $configElement)=$this->_lazyModules[$id]; + if(isset($initProperties['lazy']) && $initProperties['lazy'] && !$force) + { + Prado::trace("Postponed loading of lazy module $id ({$moduleClass})",'System.TApplication'); + $this->setModule($id, null); + return null; + } + + Prado::trace("Loading module $id ({$moduleClass})",'System.TApplication'); + $module=Prado::createComponent($moduleClass); + foreach($initProperties as $name=>$value) + { + if($name==='lazy') continue; + $module->setSubProperty($name,$value); + } + $this->setModule($id,$module); + unset($this->_lazyModules[$id]); + + return array($module,$configElement); + } /** * Applies an application configuration. * @param TApplicationConfiguration the configuration @@ -982,18 +1020,11 @@ class TApplication extends TComponent $modules=array(); foreach($config->getModules() as $id=>$moduleConfig) { - Prado::trace("Loading module $id ({$moduleConfig[0]})",'System.TApplication'); - list($moduleClass, $initProperties, $configElement)=$moduleConfig; - $module=Prado::createComponent($moduleClass); if(!is_string($id)) - { - $id='_module'.count($this->_modules); - $initProperties['id']=$id; - } - $this->setModule($id,$module); - foreach($initProperties as $name=>$value) - $module->setSubProperty($name,$value); - $modules[]=array($module,$configElement); + $id='_module'.count($this->_lazyModules); + $this->_lazyModules[$id]=$moduleConfig; + if($module = $this->internalLoadModule($id)) + $modules[]=$module; } foreach($modules as $module) $module[0]->init($module[1]); @@ -1248,7 +1279,7 @@ class TApplication extends TComponent * - Normal: the application is running in normal production mode. * - Performance: the application is running in performance mode. * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TApplication.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TApplication.php 3272 2013-02-13 21:43:28Z ctrlaltca $ * @package System * @since 3.0.4 */ @@ -1268,7 +1299,7 @@ class TApplicationMode extends TEnumerable * * @author Qiang Xue <qiang.xue@gmail.com> * @author Carl G. Mathisen <carlgmathisen@gmail.com> - * @version $Id: TApplication.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TApplication.php 3272 2013-02-13 21:43:28Z ctrlaltca $ * @package System * @since 3.0 */ @@ -1777,7 +1808,7 @@ class TApplicationConfiguration extends TComponent * Cache will be exploited if it is enabled. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TApplication.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TApplication.php 3272 2013-02-13 21:43:28Z ctrlaltca $ * @package System * @since 3.0 */ diff --git a/framework/Web/Javascripts/TJavaScript.php b/framework/Web/Javascripts/TJavaScript.php index 7f4733a2..0f6fef1c 100644 --- a/framework/Web/Javascripts/TJavaScript.php +++ b/framework/Web/Javascripts/TJavaScript.php @@ -6,7 +6,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: TJavaScript.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TJavaScript.php 3291 2013-05-09 17:44:58Z ctrlaltca $ * @package System.Web.Javascripts */ @@ -17,7 +17,7 @@ * functions. * * @author Wei Zhuo<weizhuo[at]gmail[dot]com> - * @version $Id: TJavaScript.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TJavaScript.php 3291 2013-05-09 17:44:58Z ctrlaltca $ * @package System.Web.Javascripts * @since 3.0 */ @@ -219,7 +219,7 @@ class TJavaScript ($g=Prado::getApplication()->getGlobalization(false))!==null && strtoupper($enc=$g->getCharset())!='UTF-8') $value=iconv($enc, 'UTF-8', $value); - $s = json_encode($value,$options); + $s = @json_encode($value,$options); self::checkJsonError(); return $s; } @@ -234,7 +234,7 @@ class TJavaScript */ public static function jsonDecode($value, $assoc = false, $depth = 512) { - $s= json_decode($value, $assoc, $depth); + $s= @json_decode($value, $assoc, $depth); self::checkJsonError(); return $s; } diff --git a/framework/Web/Javascripts/source/prado/prado.js b/framework/Web/Javascripts/source/prado/prado.js index 36a08426..b827b125 100644 --- a/framework/Web/Javascripts/source/prado/prado.js +++ b/framework/Web/Javascripts/source/prado/prado.js @@ -8,7 +8,7 @@ var Prado = * Version of Prado clientscripts * @var Version */ - Version: '3.2.1', + Version: '3.2.2', /** * Registry for Prado components diff --git a/framework/Web/Javascripts/source/prado/scriptaculous-adapter.js b/framework/Web/Javascripts/source/prado/scriptaculous-adapter.js index 3c186d3e..febe6ad9 100644 --- a/framework/Web/Javascripts/source/prado/scriptaculous-adapter.js +++ b/framework/Web/Javascripts/source/prado/scriptaculous-adapter.js @@ -202,6 +202,9 @@ Prado.PostBack = function(event,options) /*if(options['StopEvent']) */ Event.stop(event); Event.fireEvent(form,"submit"); + + $('PRADO_POSTBACK_TARGET').value = ''; + $('PRADO_POSTBACK_PARAMETER').value = ''; }; /** @@ -283,7 +286,7 @@ Prado.Element = { var el = $(element); if(!el) return; - if((attribute == "disabled" || attribute == "multiple" || attribute == "readonly") && value==false) + if((attribute == "disabled" || attribute == "multiple" || attribute == "readonly" || attribute == "href") && value==false) el.removeAttribute(attribute); else if(attribute.match(/^on/i)) //event methods { diff --git a/framework/Web/THttpRequest.php b/framework/Web/THttpRequest.php index 7752d54d..f621d1eb 100644 --- a/framework/Web/THttpRequest.php +++ b/framework/Web/THttpRequest.php @@ -6,7 +6,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: THttpRequest.php 3253 2013-01-16 08:57:12Z ctrlaltca $ + * @version $Id: THttpRequest.php 3273 2013-02-13 21:51:21Z ctrlaltca $ * @package System.Web */ @@ -64,7 +64,7 @@ Prado::using('System.Web.TUrlManager'); * request module. It can be accessed via {@link TApplication::getRequest()}. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: THttpRequest.php 3253 2013-01-16 08:57:12Z ctrlaltca $ + * @version $Id: THttpRequest.php 3273 2013-02-13 21:51:21Z ctrlaltca $ * @package System.Web * @since 3.0 */ @@ -114,6 +114,10 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar private $_enableCookieValidation=false; private $_cgiFix=0; /** + * @var boolean whether to cache the TUrlManager class (useful with a lot of TUrlMappings) + */ + private $_enableCache=false; + /** * @var string request URL */ private $_url=null; @@ -151,20 +155,6 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar */ public function init($config) { - if(empty($this->_urlManagerID)) - { - $this->_urlManager=new TUrlManager; - $this->_urlManager->init(null); - } - else - { - $this->_urlManager=$this->getApplication()->getModule($this->_urlManagerID); - if($this->_urlManager===null) - throw new TConfigurationException('httprequest_urlmanager_inexist',$this->_urlManagerID); - if(!($this->_urlManager instanceof TUrlManager)) - throw new TConfigurationException('httprequest_urlmanager_invalid',$this->_urlManagerID); - } - // Fill in default request info when the script is run in command line if(php_sapi_name()==='cli') { @@ -246,6 +236,72 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar } /** + * Set true to cache the UrlManager instance. Consider to enable this cache + * when the application defines a lot of TUrlMappingPatterns + * @param boolean true to cache urlmanager instance. + */ + public function setEnableCache($value) + { + $this->_enableCache = TPropertyValue::ensureBoolean($value); + } + + /** + * @return boolean true if urlmanager instance should be cached, false otherwise. + */ + public function getEnableCache() + { + return $this->_enableCache; + } + + protected function getCacheKey() + { + return $this->getID(); + } + + /** + * Saves the current UrlManager instance to cache. + * @return boolean true if UrlManager instance was cached, false otherwise. + */ + protected function cacheUrlManager($manager) + { + if($this->getEnableCache()) + { + $cache = $this->getApplication()->getCache(); + if($cache !== null) + { + $dependencies = null; + if($this->getApplication()->getMode() !== TApplicationMode::Performance) + if ($manager instanceof TUrlMapping && $fn = $manager->getConfigFile()) + { + $fn = Prado::getPathOfNamespace($fn,$this->getApplication()->getConfigurationFileExt()); + $dependencies = new TFileCacheDependency($fn); + } + return $cache->set($this->getCacheKey(), $manager, 0, $dependencies); + } + } + return false; + } + + /** + * Loads UrlManager instance from cache. + * @return TUrlManager intance if load was successful, null otherwise. + */ + protected function loadCachedUrlManager() + { + if($this->getEnableCache()) + { + $cache = $this->getApplication()->getCache(); + if($cache !== null) + { + $manager = $cache->get($this->getCacheKey()); + if($manager instanceof TUrlManager) + return $manager; + } + } + return null; + } + + /** * @return string the ID of the URL manager module */ public function getUrlManager() @@ -271,6 +327,26 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar */ public function getUrlManagerModule() { + if($this->_urlManager===null) + { + if(($this->_urlManager = $this->loadCachedUrlManager())===null) + { + if(empty($this->_urlManagerID)) + { + $this->_urlManager=new TUrlManager; + $this->_urlManager->init(null); + } + else + { + $this->_urlManager=$this->getApplication()->getModule($this->_urlManagerID); + if($this->_urlManager===null) + throw new TConfigurationException('httprequest_urlmanager_inexist',$this->_urlManagerID); + if(!($this->_urlManager instanceof TUrlManager)) + throw new TConfigurationException('httprequest_urlmanager_invalid',$this->_urlManagerID); + } + $this->cacheUrlManager($this->_urlManager); + } + } return $this->_urlManager; } @@ -643,7 +719,7 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar { if ($this->_cookieOnly===null) $this->_cookieOnly=(int)ini_get('session.use_cookies') && (int)ini_get('session.use_only_cookies'); - $url=$this->_urlManager->constructUrl($serviceID,$serviceParam,$getItems,$encodeAmpersand,$encodeGetItems); + $url=$this->getUrlManagerModule()->constructUrl($serviceID,$serviceParam,$getItems,$encodeAmpersand,$encodeGetItems); if(defined('SID') && SID != '' && !$this->_cookieOnly) return $url . (strpos($url,'?')===false? '?' : ($encodeAmpersand?'&':'&')) . SID; else @@ -658,7 +734,7 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar */ protected function parseUrl() { - return $this->_urlManager->parseUrl(); + return $this->getUrlManagerModule()->parseUrl(); } /** @@ -893,7 +969,7 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar * </code> * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: THttpRequest.php 3253 2013-01-16 08:57:12Z ctrlaltca $ + * @version $Id: THttpRequest.php 3273 2013-02-13 21:51:21Z ctrlaltca $ * @package System.Web * @since 3.0 */ @@ -981,7 +1057,7 @@ class THttpCookieCollection extends TList * domain, path, expire, and secure. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: THttpRequest.php 3253 2013-01-16 08:57:12Z ctrlaltca $ + * @version $Id: THttpRequest.php 3273 2013-02-13 21:51:21Z ctrlaltca $ * @package System.Web * @since 3.0 */ @@ -1156,7 +1232,7 @@ class THttpCookie extends TComponent * - fragment: anchor * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: THttpRequest.php 3253 2013-01-16 08:57:12Z ctrlaltca $ + * @version $Id: THttpRequest.php 3273 2013-02-13 21:51:21Z ctrlaltca $ * @package System.Web * @since 3.0 */ @@ -1323,7 +1399,7 @@ class TUri extends TComponent * - HiddenPath: the URL format is like /path/to/name1,value1/name2,value2... * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: THttpRequest.php 3253 2013-01-16 08:57:12Z ctrlaltca $ + * @version $Id: THttpRequest.php 3273 2013-02-13 21:51:21Z ctrlaltca $ * @package System.Web * @since 3.0.4 */ diff --git a/framework/Web/TUrlMapping.php b/framework/Web/TUrlMapping.php index ecbe5935..abfa02fd 100644 --- a/framework/Web/TUrlMapping.php +++ b/framework/Web/TUrlMapping.php @@ -6,7 +6,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: TUrlMapping.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TUrlMapping.php 3290 2013-05-06 08:32:15Z ctrlaltca $ * @package System.Web */ @@ -63,7 +63,7 @@ Prado::using('System.Collections.TAttributeCollection'); * in the GET variables. * * @author Wei Zhuo <weizhuo[at]gmail[dot]com> - * @version $Id: TUrlMapping.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TUrlMapping.php 3290 2013-05-06 08:32:15Z ctrlaltca $ * @package System.Web * @since 3.0.5 */ @@ -109,7 +109,15 @@ class TUrlMapping extends TUrlManager $this->loadConfigFile(); $this->loadUrlMappings($config); if($this->_urlPrefix==='') - $this->_urlPrefix=$this->getRequest()->getApplicationUrl(); + { + $request=$this->getRequest(); + if($request->getUrlFormat()===THttpRequestUrlFormat::HiddenPath) + { + $this->_urlPrefix=dirname($request->getApplicationUrl()); + } else { + $this->_urlPrefix=$request->getApplicationUrl(); + } + } $this->_urlPrefix=rtrim($this->_urlPrefix,'/'); } @@ -331,6 +339,9 @@ class TUrlMapping extends TUrlManager * If {@link THttpRequest::setUrlFormat THttpRequest.UrlFormat} is 'Path', * the following format is used instead: * /entryscript.php/serviceID/serviceParameter/get1,value1/get2,value2... + * If {@link THttpRequest::setUrlFormat THttpRequest.UrlFormat} is 'HiddenPath', + * the following format is used instead: + * /serviceID/serviceParameter/get1,value1/get2,value2... * @param string service ID * @param string service parameter * @param array GET parameters, null if not provided @@ -450,7 +461,7 @@ class TUrlMapping extends TUrlManager * * <url ServiceParameter="adminpages.*" pattern="admin/{*}/{id}" parameters.id="\d+" /> * - * To enable automatic parameter encoding in a path format fro wildcard patterns you can set + * To enable automatic parameter encoding in a path format from wildcard patterns you can set * {@setUrlFormat UrlFormat} to 'Path': * * <url ServiceParameter="adminpages.*" pattern="admin/{*}" UrlFormat="Path" /> @@ -465,8 +476,19 @@ class TUrlMapping extends TUrlManager * * <tt>.../index.php/admin/listuser/param1-value1/param2-value2</tt>. * + * Since 3.2.2 you can also add a list of "constants" parameters that can be used just + * like the original "parameters" parameters, except that the supplied value will be treated + * as a simple string constant instead of a regular expression. For example + * + * <url ServiceParameter="MyPage" pattern="/mypage/mypath/list/detail/{pageidx}" parameters.pageidx="\d+" constants.listtype="detailed"/> + * <url ServiceParameter="MyPage" pattern="/mypage/mypath/list/summary/{pageidx}" parameters.pageidx="\d+" constants.listtype="summarized"/> + * + * These rules, when matched by the actual request, will make the application see a "lisstype" parameter present + * (even through not supplied in the request) and equal to "detailed" or "summarized", depending on the friendly url matched. + * The constants is practically a table-based validation and translation of specified, fixed-set parameter values. + * * @author Wei Zhuo <weizhuo[at]gmail[dot]com> - * @version $Id: TUrlMapping.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TUrlMapping.php 3290 2013-05-06 08:32:15Z ctrlaltca $ * @package System.Web * @since 3.0.5 */ @@ -485,10 +507,14 @@ class TUrlMappingPattern extends TComponent */ private $_pattern; /** - * @var TMap parameter regular expressions. + * @var TAttributeCollection parameter regular expressions. */ private $_parameters; /** + * @var TAttributeCollection of constant parameters. + */ + protected $_constants; + /** * @var string regular expression pattern. */ private $_regexp=''; @@ -518,8 +544,6 @@ class TUrlMappingPattern extends TComponent public function __construct(TUrlManager $manager) { $this->_manager=$manager; - $this->_parameters=new TAttributeCollection; - $this->_parameters->setCaseSensitive(true); } /** @@ -552,12 +576,16 @@ class TUrlMappingPattern extends TComponent { $params=array(); $values=array(); - foreach($this->_parameters as $key=>$value) + if ($this->_parameters) { - $params[]='{'.$key.'}'; - $values[]='(?P<'.$key.'>'.$value.')'; + foreach($this->_parameters as $key=>$value) + { + $params[]='{'.$key.'}'; + $values[]='(?P<'.$key.'>'.$value.')'; + } } - if ($this->getIsWildCardPattern()) { + if ($this->getIsWildCardPattern()) + { $params[]='{*}'; // service parameter must not contain '=' and '/' $values[]='(?P<'.$this->getServiceID().'>[^=/]+)'; @@ -660,6 +688,11 @@ class TUrlMappingPattern extends TComponent */ public function getParameters() { + if (!$this->_parameters) + { + $this->_parameters=new TAttributeCollection; + $this->_parameters->setCaseSensitive(true); + } return $this->_parameters; } @@ -672,6 +705,20 @@ class TUrlMappingPattern extends TComponent } /** + * @return TAttributeCollection constanst parameter key value pairs. + * @since 3.2.2 + */ + public function getConstants() + { + if (!$this->_constants) + { + $this->_constants = new TAttributeCollection; + $this->_constants->setCaseSensitive(true); + } + return $this->_constants; + } + + /** * Uses URL pattern (or full regular expression if available) to * match the given url path. * @param THttpRequest the request module @@ -708,6 +755,12 @@ class TUrlMappingPattern extends TComponent unset($matches['urlparams']); } + if(count($matches) > 0 && $this->_constants) + { + foreach($this->_constants->toArray() as $key=>$value) + $matches[$key] = $value; + } + return $matches; } @@ -755,7 +808,7 @@ class TUrlMappingPattern extends TComponent * Changing the UrlFormat will affect {@link constructUrl} and how GET variables * are parsed. * @param THttpRequestUrlFormat the format of URLs. - * @param since 3.1.4 + * @since 3.1.4 */ public function setUrlFormat($value) { @@ -809,10 +862,24 @@ class TUrlMappingPattern extends TComponent { if(!$this->_customUrl || $this->getPattern()===null) return false; - foreach($this->_parameters as $key=>$value) + if ($this->_parameters) + { + foreach($this->_parameters as $key=>$value) + { + if(!isset($getItems[$key])) + return false; + } + } + + if ($this->_constants) { - if(!isset($getItems[$key])) - return false; + foreach($this->_constants->toArray() as $key=>$value) + { + if (!isset($getItems[$key])) + return false; + if ($getItems[$key]!=$value) + return false; + } } return true; } @@ -827,12 +894,20 @@ class TUrlMappingPattern extends TComponent */ public function constructUrl($getItems,$encodeAmpersand,$encodeGetItems) { + if ($this->_constants) + { + foreach($this->_constants->toArray() as $key=>$value) + { + unset($getItems[$key]); + } + } + $extra=array(); $replace=array(); // for the GET variables matching the pattern, put them in the URL path foreach($getItems as $key=>$value) { - if($this->_parameters->contains($key) || $key==='*' && $this->getIsWildCardPattern()) + if(($this->_parameters && $this->_parameters->contains($key)) || ($key==='*' && $this->getIsWildCardPattern())) $replace['{'.$key.'}']=$encodeGetItems ? rawurlencode($value) : $value; else $extra[$key]=$value; @@ -930,7 +1005,7 @@ class TUrlMappingPattern extends TComponent * URL prefix behavior that can be used by {@link TUrlMappingPattern::constructUrl()}. * * @author Yves Berkholz <godzilla80[at]gmx[dot]net> - * @version $Id: TUrlMapping.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TUrlMapping.php 3290 2013-05-06 08:32:15Z ctrlaltca $ * @package System.Web * @since 3.2 */ diff --git a/framework/Web/UI/ActiveControls/TActiveLinkButton.php b/framework/Web/UI/ActiveControls/TActiveLinkButton.php index b95dad88..d8a8ffcb 100644 --- a/framework/Web/UI/ActiveControls/TActiveLinkButton.php +++ b/framework/Web/UI/ActiveControls/TActiveLinkButton.php @@ -6,7 +6,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: TActiveLinkButton.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TActiveLinkButton.php 3292 2013-05-31 08:51:42Z ctrlaltca $ * @package System.Web.UI.ActiveControls */ @@ -29,7 +29,7 @@ Prado::using('System.Web.UI.ActiveControls.TActiveControlAdapter'); * will update the link text upon callback response completion. * * @author Wei Zhuo <weizhuo[at]gmail[dot]com> - * @version $Id: TActiveLinkButton.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TActiveLinkButton.php 3292 2013-05-31 08:51:42Z ctrlaltca $ * @package System.Web.UI.ActiveControls * @since 3.1 */ @@ -118,9 +118,36 @@ class TActiveLinkButton extends TLinkButton implements IActiveControl, ICallback { parent::addAttributesToRender($writer); $writer->addAttribute('id',$this->getClientID()); - $this->renderLinkButtonHref($writer); - $this->getActiveControl()->registerCallbackClientScript( - $this->getClientClassName(), $this->getPostBackOptions()); + + if($this->getEnabled(true)) + { + $this->getActiveControl()->registerCallbackClientScript( + $this->getClientClassName(), $this->getPostBackOptions()); + } + } + + /** + * Ensures that the anchor is rendered correctly when its Enabled property + * changes in a callback + * @param bool enabled + */ + public function setEnabled($value) + { + parent::setEnabled($value); + if($this->getActiveControl()->canUpdateClientSide()) + { + if($this->getEnabled(true)) + { + $nop = "javascript:;//".$this->getClientID(); + $this->getPage()->getCallbackClient()->setAttribute($this, 'href', $nop); + + $this->getActiveControl()->registerCallbackClientScript( + $this->getClientClassName(), $this->getPostBackOptions()); + + } else { + $this->getPage()->getCallbackClient()->setAttribute($this, 'href', false); + } + } } /** diff --git a/framework/Web/UI/ActiveControls/TDraggable.php b/framework/Web/UI/ActiveControls/TDraggable.php index 23687207..df92bec5 100755 --- a/framework/Web/UI/ActiveControls/TDraggable.php +++ b/framework/Web/UI/ActiveControls/TDraggable.php @@ -6,7 +6,27 @@ * @copyright Copyright © 2008, PradoSoft * @license http://www.pradosoft.com/license * @package System.Web.UI.ActiveControls - * @version $Id: TDraggable.php 3247 2013-01-07 21:38:18Z ctrlaltca $ + * @version $Id: TDraggable.php 3285 2013-04-11 07:28:07Z ctrlaltca $ + */ + +/** + * TDraggable is a control which can be dragged + * + * This control will make "draggable" control. + * Properties : + * + * <b>{@link setGhosting Ghosting}</b> : If set to "Ghosting" or "True", the dragged element will be cloned, and the clone will be dragged. + * If set to "SuperGhosting", the element will be cloned, and attached to body, so it can be dragged outside of its parent. + * If set to "None" of "False" (default), the element itself is dragged + * <b>{@link setRevert Revert}</b>: Set to True if you want your dragged element to revert to its initial position if not dropped on a valid area. + * <b>{@link setConstraint Constraint}</b>: Set this to Horizontal or Vertical if you want to constraint your move in one direction. + * <b>{@link setHandle Handle}</b>: + * + * @author Christophe BOULAIN (Christophe.Boulain@gmail.com) + * @copyright Copyright © 2008, PradoSoft + * @license http://www.pradosoft.com/license + * @package System.Web.UI.ActiveControls + * @version $Id: TDraggable.php 3285 2013-04-11 07:28:07Z ctrlaltca $ */ class TDraggable extends TPanel { @@ -193,7 +213,21 @@ class TDraggable extends TPanel * @copyright Copyright © 2008, PradoSoft * @license http://www.pradosoft.com/license * @package System.Web.UI.ActiveControls - * @version $Id: TDraggable.php 3247 2013-01-07 21:38:18Z ctrlaltca $ + * @version $Id: TDraggable.php 3285 2013-04-11 07:28:07Z ctrlaltca $ + */ +class TDraggableConstraint extends TEnumerable +{ + const None='None'; + const Horizontal='Horizontal'; + const Vertical='Vertical'; +} + +/** + * @author Christophe BOULAIN (Christophe.Boulain@gmail.com) + * @copyright Copyright © 2008, PradoSoft + * @license http://www.pradosoft.com/license + * @package System.Web.UI.ActiveControls + * @version $Id: TDraggable.php 3285 2013-04-11 07:28:07Z ctrlaltca $ */ class TDraggableGhostingOptions extends TEnumerable { @@ -207,7 +241,7 @@ class TDraggableGhostingOptions extends TEnumerable * @copyright Copyright © 2008, PradoSoft * @license http://www.pradosoft.com/license * @package System.Web.UI.ActiveControls - * @version $Id: TDraggable.php 3247 2013-01-07 21:38:18Z ctrlaltca $ + * @version $Id: TDraggable.php 3285 2013-04-11 07:28:07Z ctrlaltca $ */ class TDraggableRevertOptions extends TEnumerable { diff --git a/framework/Web/UI/ActiveControls/TDropContainer.php b/framework/Web/UI/ActiveControls/TDropContainer.php index e603adf9..43e8017c 100755 --- a/framework/Web/UI/ActiveControls/TDropContainer.php +++ b/framework/Web/UI/ActiveControls/TDropContainer.php @@ -7,7 +7,40 @@ * @license http://www.pradosoft.com/license * @version $Id: TDropContainer.php 3159 2012-2013 PradoSoft * @license http://www.pradosoft.com/license - * @version $Id: TDropContainer.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TDropContainer.php 3285 2013-04-11 07:28:07Z ctrlaltca $ + * @package System.Web.UI.ActiveControls + */ + +/** + * Load active control adapter. + */ +Prado::using('System.Web.UI.ActiveControls.TActiveControlAdapter'); +/** + * Load active panel. + */ +Prado::using('System.Web.UI.ActiveControls.TActivePanel'); + + +/** + * TDropContainer is a panel where TDraggable controls can be dropped. + * When a TDraggable component is dropped into a TDropContainer, the {@link OnDrop OnDrop} event is raised. + * The {@link TDropContainerEventParameter} param will contain the dropped control. + * + * Properties : + * + * <b>{@link setAcceptCssClass AcceptCssClass}</b> : a coma delimited classname of elements that the drop container can accept. + * <b>{@link setHoverCssClass HoverCssClass}</b>: CSS classname of the container when a draggable element hovers over the container. + * + * Events: + * + * <b>{@link OnDrop OnDrop}</b> : raised when a TDraggable control is dropped. The dropped control id is encapsulated in the event parameter, + * as well as mouse coordinates and key modifiers status + * + * + * @author Christophe BOULAIN (Christophe.Boulain@gmail.com) + * @copyright Copyright © 2008, PradoSoft + * @license http://www.pradosoft.com/license + * @version $Id: TDropContainer.php 3285 2013-04-11 07:28:07Z ctrlaltca $ * @package System.Web.UI.ActiveControls */ class TDropContainer extends TPanel implements IActiveControl, ICallbackEventHandler @@ -225,7 +258,7 @@ class TDropContainer extends TPanel implements IActiveControl, ICallbackEventHan * @author Christophe BOULAIN (Christophe.Boulain@ceram.fr) * @copyright Copyright © 2008, PradoSoft * @license http://www.pradosoft.com/license - * @version $Id: TDropContainer.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TDropContainer.php 3285 2013-04-11 07:28:07Z ctrlaltca $ * @package System.Web.UI.ActiveControls */ class TDropContainerEventParameter extends TEventParameter diff --git a/framework/Web/UI/TClientScriptManager.php b/framework/Web/UI/TClientScriptManager.php index 8a7afdad..0cdf3e32 100644 --- a/framework/Web/UI/TClientScriptManager.php +++ b/framework/Web/UI/TClientScriptManager.php @@ -7,7 +7,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: TClientScriptManager.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TClientScriptManager.php 3280 2013-03-13 20:19:30Z ctrlaltca $ * @package System.Web.UI */ @@ -18,7 +18,7 @@ * * @author Qiang Xue <qiang.xue@gmail.com> * @author Gabor Berczi <gabor.berczi@devworx.hu> (lazyload additions & progressive rendering) - * @version $Id: TClientScriptManager.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TClientScriptManager.php 3280 2013-03-13 20:19:30Z ctrlaltca $ * @package System.Web.UI * @since 3.0 */ @@ -406,8 +406,14 @@ class TClientScriptManager extends TApplicationComponent */ public function getStyleSheetUrls() { - - $stylesheets = array_values(array_merge($this->_styleSheetFiles, $this->_styleSheets)); + $stylesheets = array_values( + array_merge( + array_map( + create_function('$e', 'return is_array($e) ? $e[0] : $e;'), + $this->_styleSheetFiles), + $this->_styleSheets + ) + ); foreach(Prado::getApplication()->getAssetManager()->getPublished() as $path=>$url) if (substr($url,strlen($url)-4)=='.css') @@ -758,7 +764,7 @@ class TClientScriptManager extends TApplicationComponent * between ActiveControls and validators. * * @author <weizhuo[at]gmail[dot]com> - * @version $Id: TClientScriptManager.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TClientScriptManager.php 3280 2013-03-13 20:19:30Z ctrlaltca $ * @package System.Web.UI * @since 3.0 */ @@ -770,14 +776,6 @@ abstract class TClientSideOptions extends TComponent private $_options; /** - * Constructor, initialize the options list. - */ - public function __construct() - { - $this->_options = Prado::createComponent('System.Collections.TMap'); - } - - /** * Adds on client-side event handler by wrapping the code within a * javascript function block. If the code begins with "javascript:", the * code is assumed to be a javascript function block rather than arbiturary @@ -797,7 +795,10 @@ abstract class TClientSideOptions extends TComponent */ protected function getOption($name) { - return $this->_options->itemAt($name); + if ($this->_options) + return $this->_options->itemAt($name); + else + return null; } /** @@ -806,7 +807,7 @@ abstract class TClientSideOptions extends TComponent */ protected function setOption($name, $value) { - $this->_options->add($name, $value); + $this->getOptions()->add($name, $value); } /** @@ -814,6 +815,8 @@ abstract class TClientSideOptions extends TComponent */ public function getOptions() { + if (!$this->_options) + $this->_options = Prado::createComponent('System.Collections.TMap'); return $this->_options; } diff --git a/framework/Web/UI/WebControls/TButtonColumn.php b/framework/Web/UI/WebControls/TButtonColumn.php index 7a0484c3..258fecf2 100644 --- a/framework/Web/UI/WebControls/TButtonColumn.php +++ b/framework/Web/UI/WebControls/TButtonColumn.php @@ -6,7 +6,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: TButtonColumn.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TButtonColumn.php 3287 2013-04-30 10:10:16Z ctrlaltca $ * @package System.Web.UI.WebControls */ @@ -31,7 +31,7 @@ Prado::using('System.Web.UI.WebControls.TImageButton'); * If {@link setDataTextFormatString DataTextFormatString} is not empty, * the value will be formatted before rendering. * - * The buttons in the column can be set to display as hyperlinks or push buttons + * The buttons in the column can be set to display as hyperlinks, push buttons or images * by setting the {@link setButtonType ButtonType} property. * The {@link setCommandName CommandName} will assign its value to * all button's <b>CommandName</b> property. The datagrid will capture @@ -48,7 +48,7 @@ Prado::using('System.Web.UI.WebControls.TImageButton'); * datagrid cell is the first child. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TButtonColumn.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TButtonColumn.php 3287 2013-04-30 10:10:16Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -237,6 +237,7 @@ class TButtonColumn extends TDataGridColumn { $button=new TImageButton; $button->setImageUrl($this->getImageUrl()); + $button->setToolTip($this->getText()); } $button->setText($this->getText()); $button->setCommandName($this->getCommandName()); diff --git a/framework/Web/UI/WebControls/TEmailAddressValidator.php b/framework/Web/UI/WebControls/TEmailAddressValidator.php index 3bfd3e7b..dffe912e 100644 --- a/framework/Web/UI/WebControls/TEmailAddressValidator.php +++ b/framework/Web/UI/WebControls/TEmailAddressValidator.php @@ -6,7 +6,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: TEmailAddressValidator.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TEmailAddressValidator.php 3283 2013-03-24 10:19:08Z ctrlaltca $ * @package System.Web.UI.WebControls */ @@ -24,7 +24,7 @@ Prado::using('System.Web.UI.WebControls.TRegularExpressionValidator'); * checkdnsrr() is available in the installed PHP. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TEmailAddressValidator.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TEmailAddressValidator.php 3283 2013-03-24 10:19:08Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -32,8 +32,9 @@ class TEmailAddressValidator extends TRegularExpressionValidator { /** * Regular expression used to validate the email address + * @see http://www.regular-expressions.info/email.html */ - const EMAIL_REGEXP="\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"; + const EMAIL_REGEXP='[a-zA-Z0-9!#$%&\'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&\'*+/=?^_`{|}~-]+)*@(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\.)+[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?'; /** * Gets the name of the javascript class responsible for performing validation for this control. @@ -60,10 +61,12 @@ class TEmailAddressValidator extends TRegularExpressionValidator */ public function evaluateIsValid() { - $valid=parent::evaluateIsValid(); + $value=$this->getValidationValue($this->getValidationTarget()); + $valid=$valid=is_string($value) && strlen($value)<=254 && parent::evaluateIsValid(); + if($valid && $this->getCheckMXRecord() && function_exists('checkdnsrr')) { - if(($value=$this->getValidationValue($this->getValidationTarget()))!=='') + if($value!=='') { if(($pos=strpos($value,'@'))!==false) { @@ -82,7 +85,7 @@ class TEmailAddressValidator extends TRegularExpressionValidator */ public function getCheckMXRecord() { - return $this->getViewState('CheckMXRecord',true); + return $this->getViewState('CheckMXRecord',false); } /** @@ -91,7 +94,7 @@ class TEmailAddressValidator extends TRegularExpressionValidator */ public function setCheckMXRecord($value) { - $this->setViewState('CheckMXRecord',TPropertyValue::ensureBoolean($value),true); + $this->setViewState('CheckMXRecord',TPropertyValue::ensureBoolean($value),false); } } diff --git a/framework/Web/UI/WebControls/THyperLink.php b/framework/Web/UI/WebControls/THyperLink.php index bc6c3642..56aa5391 100644 --- a/framework/Web/UI/WebControls/THyperLink.php +++ b/framework/Web/UI/WebControls/THyperLink.php @@ -6,7 +6,7 @@ * @link http://www.xisc.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.opensource.org/licenses/bsd-license.php BSD License - * @version $Id: THyperLink.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: THyperLink.php 3286 2013-04-18 06:09:19Z ctrlaltca $ * @package System.Web.UI.WebControls */ @@ -17,13 +17,16 @@ * via the {@link setNavigateUrl NavigateUrl} property, and link text is via * the {@link setText Text} property. It is also possible to display an image * by setting the {@link setImageUrl ImageUrl} property. In this case, - * {@link getText Text} is displayed as the alternate text of the image. + * the alignment of the image displayed is set by the + * {@link setImageAlign ImageAlign} property and {@link getText Text} is + * displayed as the alternate text of the image. + * * The link target is specified via the {@link setTarget Target} property. * If both {@link getImageUrl ImageUrl} and {@link getText Text} are empty, * the content enclosed within the control tag will be rendered. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: THyperLink.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: THyperLink.php 3286 2013-04-18 06:09:19Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -92,6 +95,8 @@ class THyperLink extends TWebControl implements IDataRenderer $image->setToolTip($toolTip); if(($text=$this->getText())!=='') $image->setAlternateText($text); + if(($align=$this->getImageAlign())!=='') + $image->setImageAlign($align); $image->setBorderWidth('0'); return $image; } @@ -114,6 +119,26 @@ class THyperLink extends TWebControl implements IDataRenderer } /** + * @return string the alignment of the image with respective to other elements on the page, defaults to empty. + */ + public function getImageAlign() + { + return $this->getViewState('ImageAlign',''); + } + + /** + * Sets the alignment of the image with respective to other elements on the page. + * Possible values include: absbottom, absmiddle, baseline, bottom, left, + * middle, right, texttop, and top. If an empty string is passed in, + * imagealign attribute will not be rendered. + * @param string the alignment of the image + */ + public function setImageAlign($value) + { + $this->setViewState('ImageAlign',$value,''); + } + + /** * @return string height of the image in the THyperLink */ public function getImageHeight() diff --git a/framework/Web/UI/WebControls/TListControl.php b/framework/Web/UI/WebControls/TListControl.php index 2cd430d6..f9fdd77f 100644 --- a/framework/Web/UI/WebControls/TListControl.php +++ b/framework/Web/UI/WebControls/TListControl.php @@ -8,7 +8,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: TListControl.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TListControl.php 3288 2013-04-30 10:36:50Z ctrlaltca $ * @package System.Web.UI.WebControls */ @@ -75,8 +75,11 @@ Prado::using('System.Util.TDataFieldAccessor'); * used to format how the item should be displayed. See {@link formatDataValue()} * for an explanation of the format string. * + * The {@link setPromptText PromptText} and {@link setPromptValue PromptValue} properties can + * be used to add a dummy list item that will be rendered first. + * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TListControl.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TListControl.php 3288 2013-04-30 10:36:50Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ diff --git a/framework/Web/UI/WebControls/TRequiredFieldValidator.php b/framework/Web/UI/WebControls/TRequiredFieldValidator.php index 8d370502..7a0bad8c 100644 --- a/framework/Web/UI/WebControls/TRequiredFieldValidator.php +++ b/framework/Web/UI/WebControls/TRequiredFieldValidator.php @@ -6,7 +6,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: TRequiredFieldValidator.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TRequiredFieldValidator.php 3288 2013-04-30 10:36:50Z ctrlaltca $ * @package System.Web.UI.WebControls */ @@ -25,8 +25,11 @@ Prado::using('System.Web.UI.WebControls.TBaseValidator'); * Validation will also succeed if input is of TListControl type and the number * of selected values different from the initial value is greater than zero. * + * If the input is of TListControl type and has a {@link TListControl::setPromptValue PromptValue} + * set, it will be automatically considered as the validator's {@link setInitialValue InitialValue}. + * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TRequiredFieldValidator.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TRequiredFieldValidator.php 3288 2013-04-30 10:36:50Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -43,16 +46,29 @@ class TRequiredFieldValidator extends TBaseValidator } /** - * @return string the initial value of the associated input control. Defaults to empty string. + * @return string the initial value of the associated input control. Defaults to empty string + * unless the control has a prompt value set. * If the associated input control does not change from this initial value * upon postback, the validation fails. */ public function getInitialValue() { - return $this->getViewState('InitialValue',''); + return $this->getViewState('InitialValue',$this->getControlPromptValue()); } /** + * @return string the initial value of the associated input control. Defaults to empty string. + * If the associated input control does not change from this initial value + * upon postback, the validation fails. + */ + protected function getControlPromptValue() + { + $control = $this->getValidationTarget(); + if($control instanceof TListControl) + return $control->getPromptValue(); + return ''; + } + /** * @param string the initial value of the associated input control. * If the associated input control does not change from this initial value * upon postback, the validation fails. diff --git a/framework/Web/UI/WebControls/TWizard.php b/framework/Web/UI/WebControls/TWizard.php index c29cb90c..67cbc4e4 100644 --- a/framework/Web/UI/WebControls/TWizard.php +++ b/framework/Web/UI/WebControls/TWizard.php @@ -6,7 +6,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005-2013 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls */ @@ -77,7 +77,7 @@ Prado::using('System.Web.UI.WebControls.TWizardNavigationButtonStyle'); * - side bar: {@link getSideBarStyle SideBarStyle} and {@link getSideBarButtonStyle SideBarButtonStyle}. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -284,7 +284,6 @@ class TWizard extends TWebControl implements INamingContainer public function setShowSideBar($value) { $this->setViewState('ShowSideBar',TPropertyValue::ensureBoolean($value),true); - $this->requiresControlsRecreation(); } /** @@ -772,6 +771,7 @@ class TWizard extends TWebControl implements INamingContainer { parent::onInit($param); $this->ensureChildControls(); + $this->setEnsureId(true); if($this->getActiveStepIndex()<0 && $this->getWizardSteps()->getCount()>0) $this->setActiveStepIndex(0); } @@ -1449,7 +1449,7 @@ class TWizard extends TWebControl implements INamingContainer * set {@link setAllowReturn AllowReturn} to true. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -1539,7 +1539,7 @@ class TWizardStep extends TView * TCompleteWizardStep represents a wizard step of type TWizardStepType::Complete. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -1574,7 +1574,7 @@ class TCompleteWizardStep extends TWizardStep * if the navigation template is not specified, default navigation will be used. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -1676,7 +1676,7 @@ class TTemplatedWizardStep extends TWizardStep implements INamingContainer * by a {@link TWizard}. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -1740,7 +1740,7 @@ class TWizardStepCollection extends TList * {@link getCancelButton CancelButton}, {@link getCompleteButton CompleteButton}. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -1832,7 +1832,7 @@ class TWizardNavigationContainer extends TControl implements INamingContainer * to true. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -1897,7 +1897,7 @@ class TWizardNavigationEventParameter extends TEventParameter * TWizardSideBarTemplate class. * TWizardSideBarTemplate is the default template for wizard sidebar. * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -1922,7 +1922,7 @@ class TWizardSideBarTemplate extends TComponent implements ITemplate * TWizardSideBarListItemTemplate class. * TWizardSideBarListItemTemplate is the default template for each item in the sidebar datalist. * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -1945,7 +1945,7 @@ class TWizardSideBarListItemTemplate extends TComponent implements ITemplate * TWizardNavigationTemplate class. * TWizardNavigationTemplate is the base class for various navigation templates. * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -2017,7 +2017,7 @@ class TWizardNavigationTemplate extends TComponent implements ITemplate * TWizardStartNavigationTemplate is the template used as default wizard start navigation panel. * It consists of two buttons, Next and Cancel. * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -2047,7 +2047,7 @@ class TWizardStartNavigationTemplate extends TWizardNavigationTemplate * TWizardFinishNavigationTemplate is the template used as default wizard finish navigation panel. * It consists of three buttons, Previous, Complete and Cancel. * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -2081,7 +2081,7 @@ class TWizardFinishNavigationTemplate extends TWizardNavigationTemplate * TWizardStepNavigationTemplate is the template used as default wizard step navigation panel. * It consists of three buttons, Previous, Next and Cancel. * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0 */ @@ -2122,7 +2122,7 @@ class TWizardStepNavigationTemplate extends TWizardNavigationTemplate * - Link: a hyperlink button * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0.4 */ @@ -2146,7 +2146,7 @@ class TWizardNavigationButtonType extends TEnumerable * - Finish: the last step before the Complete step. * * @author Qiang Xue <qiang.xue@gmail.com> - * @version $Id: TWizard.php 3245 2013-01-07 20:23:32Z ctrlaltca $ + * @version $Id: TWizard.php 3274 2013-02-15 08:32:25Z ctrlaltca $ * @package System.Web.UI.WebControls * @since 3.0.4 */ diff --git a/framework/pradolite.php b/framework/pradolite.php index ff7a89f7..6fb4c9d6 100644 --- a/framework/pradolite.php +++ b/framework/pradolite.php @@ -1,7 +1,7 @@ <?php /** * File Name: pradolite.php - * Last Update: 2013/04/24 09:57:50 + * Last Update: 2013/07/24 12:18:57 * Generated By: buildscripts/phpbuilder/build.php * * This file is used in lieu of prado.php to boost PRADO application performance. @@ -2225,13 +2225,13 @@ class TJavaScript ($g=Prado::getApplication()->getGlobalization(false))!==null && strtoupper($enc=$g->getCharset())!='UTF-8') $value=iconv($enc, 'UTF-8', $value); - $s = json_encode($value,$options); + $s = @json_encode($value,$options); self::checkJsonError(); return $s; } public static function jsonDecode($value, $assoc = false, $depth = 512) { - $s= json_decode($value, $assoc, $depth); + $s= @json_decode($value, $assoc, $depth); self::checkJsonError(); return $s; } @@ -2368,6 +2368,7 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar private $_requestResolved=false; private $_enableCookieValidation=false; private $_cgiFix=0; + private $_enableCache=false; private $_url=null; private $_id; private $_items=array(); @@ -2381,19 +2382,6 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar } public function init($config) { - if(empty($this->_urlManagerID)) - { - $this->_urlManager=new TUrlManager; - $this->_urlManager->init(null); - } - else - { - $this->_urlManager=$this->getApplication()->getModule($this->_urlManagerID); - if($this->_urlManager===null) - throw new TConfigurationException('httprequest_urlmanager_inexist',$this->_urlManagerID); - if(!($this->_urlManager instanceof TUrlManager)) - throw new TConfigurationException('httprequest_urlmanager_invalid',$this->_urlManagerID); - } if(php_sapi_name()==='cli') { $_SERVER['REMOTE_ADDR']='127.0.0.1'; @@ -2450,6 +2438,51 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar } return $this->_url; } + public function setEnableCache($value) + { + $this->_enableCache = TPropertyValue::ensureBoolean($value); + } + public function getEnableCache() + { + return $this->_enableCache; + } + protected function getCacheKey() + { + return $this->getID(); + } + protected function cacheUrlManager($manager) + { + if($this->getEnableCache()) + { + $cache = $this->getApplication()->getCache(); + if($cache !== null) + { + $dependencies = null; + if($this->getApplication()->getMode() !== TApplicationMode::Performance) + if ($manager instanceof TUrlMapping && $fn = $manager->getConfigFile()) + { + $fn = Prado::getPathOfNamespace($fn,$this->getApplication()->getConfigurationFileExt()); + $dependencies = new TFileCacheDependency($fn); + } + return $cache->set($this->getCacheKey(), $manager, 0, $dependencies); + } + } + return false; + } + protected function loadCachedUrlManager() + { + if($this->getEnableCache()) + { + $cache = $this->getApplication()->getCache(); + if($cache !== null) + { + $manager = $cache->get($this->getCacheKey()); + if($manager instanceof TUrlManager) + return $manager; + } + } + return null; + } public function getUrlManager() { return $this->_urlManagerID; @@ -2460,6 +2493,26 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar } public function getUrlManagerModule() { + if($this->_urlManager===null) + { + if(($this->_urlManager = $this->loadCachedUrlManager())===null) + { + if(empty($this->_urlManagerID)) + { + $this->_urlManager=new TUrlManager; + $this->_urlManager->init(null); + } + else + { + $this->_urlManager=$this->getApplication()->getModule($this->_urlManagerID); + if($this->_urlManager===null) + throw new TConfigurationException('httprequest_urlmanager_inexist',$this->_urlManagerID); + if(!($this->_urlManager instanceof TUrlManager)) + throw new TConfigurationException('httprequest_urlmanager_invalid',$this->_urlManagerID); + } + $this->cacheUrlManager($this->_urlManager); + } + } return $this->_urlManager; } public function getUrlFormat() @@ -2650,7 +2703,7 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar { if ($this->_cookieOnly===null) $this->_cookieOnly=(int)ini_get('session.use_cookies') && (int)ini_get('session.use_only_cookies'); - $url=$this->_urlManager->constructUrl($serviceID,$serviceParam,$getItems,$encodeAmpersand,$encodeGetItems); + $url=$this->getUrlManagerModule()->constructUrl($serviceID,$serviceParam,$getItems,$encodeAmpersand,$encodeGetItems); if(defined('SID') && SID != '' && !$this->_cookieOnly) return $url . (strpos($url,'?')===false? '?' : ($encodeAmpersand?'&':'&')) . SID; else @@ -2658,7 +2711,7 @@ class THttpRequest extends TApplicationComponent implements IteratorAggregate,Ar } protected function parseUrl() { - return $this->_urlManager->parseUrl(); + return $this->getUrlManagerModule()->parseUrl(); } public function resolveRequest($serviceIDs) { @@ -6383,7 +6436,14 @@ class TClientScriptManager extends TApplicationComponent } public function getStyleSheetUrls() { - $stylesheets = array_values(array_merge($this->_styleSheetFiles, $this->_styleSheets)); + $stylesheets = array_values( + array_merge( + array_map( + create_function('$e', 'return is_array($e) ? $e[0] : $e;'), + $this->_styleSheetFiles), + $this->_styleSheets + ) + ); foreach(Prado::getApplication()->getAssetManager()->getPublished() as $path=>$url) if (substr($url,strlen($url)-4)=='.css') $stylesheets[] = $url; @@ -6584,10 +6644,6 @@ class TClientScriptManager extends TApplicationComponent abstract class TClientSideOptions extends TComponent { private $_options; - public function __construct() - { - $this->_options = Prado::createComponent('System.Collections.TMap'); - } protected function setFunction($name, $code) { if(!TJavaScript::isJsLiteral($code)) @@ -6596,14 +6652,19 @@ abstract class TClientSideOptions extends TComponent } protected function getOption($name) { - return $this->_options->itemAt($name); + if ($this->_options) + return $this->_options->itemAt($name); + else + return null; } protected function setOption($name, $value) { - $this->_options->add($name, $value); + $this->getOptions()->add($name, $value); } public function getOptions() { + if (!$this->_options) + $this->_options = Prado::createComponent('System.Collections.TMap'); return $this->_options; } protected function ensureFunction($javascript) @@ -9467,6 +9528,7 @@ class TApplication extends TComponent private $_services; private $_service; private $_modules=array(); + private $_lazyModules=array(); private $_parameters; private $_configFile; private $_configFileExt; @@ -9699,7 +9761,7 @@ class TApplication extends TComponent { $this->_service=$value; } - public function setModule($id,IModule $module) + public function setModule($id,IModule $module=null) { if(isset($this->_modules[$id])) throw new TConfigurationException('application_moduleid_duplicated',$id); @@ -9708,7 +9770,14 @@ class TApplication extends TComponent } public function getModule($id) { - return isset($this->_modules[$id])?$this->_modules[$id]:null; + if(!array_key_exists($id, $this->_modules)) + return null; + if($this->_modules[$id]===null) + { + $module = $this->internalLoadModule($id, true); + $module[0]->init($module[1]); + } + return $this->_modules[$id]; } public function getModules() { @@ -9848,6 +9917,24 @@ class TApplication extends TComponent { return 'TApplicationConfiguration'; } + protected function internalLoadModule($id, $force=false) + { + list($moduleClass, $initProperties, $configElement)=$this->_lazyModules[$id]; + if(isset($initProperties['lazy']) && $initProperties['lazy'] && !$force) + { + $this->setModule($id, null); + return null; + } + $module=Prado::createComponent($moduleClass); + foreach($initProperties as $name=>$value) + { + if($name==='lazy') continue; + $module->setSubProperty($name,$value); + } + $this->setModule($id,$module); + unset($this->_lazyModules[$id]); + return array($module,$configElement); + } public function applyConfiguration($config,$withinService=false) { if($config->getIsEmpty()) @@ -9878,17 +9965,11 @@ class TApplication extends TComponent $modules=array(); foreach($config->getModules() as $id=>$moduleConfig) { - list($moduleClass, $initProperties, $configElement)=$moduleConfig; - $module=Prado::createComponent($moduleClass); if(!is_string($id)) - { - $id='_module'.count($this->_modules); - $initProperties['id']=$id; - } - $this->setModule($id,$module); - foreach($initProperties as $name=>$value) - $module->setSubProperty($name,$value); - $modules[]=array($module,$configElement); + $id='_module'.count($this->_lazyModules); + $this->_lazyModules[$id]=$moduleConfig; + if($module = $this->internalLoadModule($id)) + $modules[]=$module; } foreach($modules as $module) $module[0]->init($module[1]); diff --git a/requirements/index.php b/requirements/index.php index 110b0ba1..b5b6dc82 100644 --- a/requirements/index.php +++ b/requirements/index.php @@ -6,7 +6,7 @@ * @link http://www.pradosoft.com/ * @copyright Copyright © 2005 PradoSoft * @license http://www.pradosoft.com/license/ - * @version $Id: index.php 3187 2012-07-12 11:21:01Z ctrlaltca $ + * @version $Id: index.php 3281 2013-03-13 21:01:40Z ctrlaltca $ * @package prado */ @@ -115,6 +115,16 @@ $requirements = array( 'APC extension optional'), array( false, + function_exists('eaccelerator_get'), + 'eAccelerator extension check', + 'eAccelerator extension optional'), + array( + false, + function_exists('xcache_isset'), + 'XCache extension check', + 'XCache extension optional'), + array( + false, extension_loaded("mcrypt"), 'Mcrypt extension check', 'Mcrypt extension optional'), |