From 439b0b12dc8f6cbeb769fe4f2c0061ff9d3c9d31 Mon Sep 17 00:00:00 2001 From: carlgmathisen <> Date: Tue, 2 Dec 2008 00:02:51 +0000 Subject: php configuration type --- framework/Data/TDataSourceConfig.php | 28 ++-- framework/PradoBase.php | 6 +- framework/Security/TUserManager.php | 63 +++++++-- framework/TApplication.php | 231 ++++++++++++++++++++++++++++++-- framework/Web/Services/TPageService.php | 156 +++++++++++++++++++-- framework/Web/Services/TSoapService.php | 38 ++++-- 6 files changed, 467 insertions(+), 55 deletions(-) (limited to 'framework') diff --git a/framework/Data/TDataSourceConfig.php b/framework/Data/TDataSourceConfig.php index a02c68a1..804ea848 100644 --- a/framework/Data/TDataSourceConfig.php +++ b/framework/Data/TDataSourceConfig.php @@ -1,10 +1,10 @@ - * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Data @@ -58,11 +58,23 @@ class TDataSourceConfig extends TModule */ public function init($xml) { - if($prop=$xml->getElementByTagName('database')) + if($this->getApplication()->getConfigurationType()==TApplication::CONFIG_TYPE_PHP) { - $db=$this->getDbConnection(); - foreach($prop->getAttributes() as $name=>$value) - $db->setSubproperty($name,$value); + if(isset($xml['database']) && is_array($xml['database'])) + { + $db=$this->getDbConnection(); + foreach($xml['database'] as $name=>$value) + $db->setSubProperty($name,$value); + } + } + else + { + if($prop=$xml->getElementByTagName('database')) + { + $db=$this->getDbConnection(); + foreach($prop->getAttributes() as $name=>$value) + $db->setSubproperty($name,$value); + } } } @@ -153,5 +165,5 @@ class TDataSourceConfig extends TModule throw new TConfigurationException('datasource_dbconnection_invalid',$id); } } - -?> + +?> diff --git a/framework/PradoBase.php b/framework/PradoBase.php index e6a77136..15932cad 100644 --- a/framework/PradoBase.php +++ b/framework/PradoBase.php @@ -7,7 +7,7 @@ * * @author Qiang Xue * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System @@ -66,7 +66,7 @@ class PradoBase */ public static function getVersion() { - return '3.1.3a'; + return '3.2a'; } /** @@ -611,4 +611,4 @@ PradoBase::using('System.TComponent'); PradoBase::using('System.Exceptions.TException'); PradoBase::using('System.Util.TLogger'); -?> +?> diff --git a/framework/Security/TUserManager.php b/framework/Security/TUserManager.php index 20b2cbb1..6326803d 100644 --- a/framework/Security/TUserManager.php +++ b/framework/Security/TUserManager.php @@ -4,7 +4,7 @@ * * @author Qiang Xue * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Security @@ -83,25 +83,72 @@ class TUserManager extends TModule implements IUserManager * Initializes the module. * This method is required by IModule and is invoked by application. * It loads user/role information from the module configuration. - * @param TXmlElement module configuration + * @param mixed module configuration */ public function init($config) { - $this->loadUserData($config); + $isPhp = $this->getApplication()->getConfigurationType()==TApplication::CONFIG_TYPE_PHP; + if($isPhp) + $this->loadUserDataFromPhp($config); + else + $this->loadUserDataFromXml($config); + if($this->_userFile!==null) { - $dom=new TXmlDocument; - $dom->loadFromFile($this->_userFile); - $this->loadUserData($dom); + if($isPhp) + { + $this->loadUserDataFromPhp($config); + } + else + { + $dom=new TXmlDocument; + $dom->loadFromFile($this->_userFile); + $this->loadUserDataFromXml($dom); + } } $this->_initialized=true; } + private function loadUserDataFromPhp($config) + { + if(isset($config['users']) && is_array($config['users'])) + { + foreach($config['users'] as $user) + { + $name = trim(strtolower(isset($user['name'])?$user['name']:'')); + $password = isset($user['password'])?$user['password']:''; + $this->_users[$name] = $password; + $roles = isset($user['roles'])?$user['roles']:''; + if($roles!=='') + { + foreach(explode(',',$roles) as $role) + { + if(($role=trim($role))!=='') + $this->_roles[$name][]=$role; + } + } + } + } + if(isset($config['roles']) && is_array($config['roles'])) + { + foreach($config['roles'] as $role) + { + $name = isset($role['name'])?$role['name']:''; + $users = isset($role['users'])?$role['users']:''; + foreach(explode(',',$users) as $user) + { + if(($user=trim($user))!=='') + $this->_roles[strtolower($user)][]=$name; + } + } + } + } + /** * Loads user/role information from an XML node. * @param TXmlElement the XML node containing the user information */ - private function loadUserData($xmlNode) + private function loadUserDataFromXml($xmlNode) { foreach($xmlNode->getElementsByTagName('user') as $node) { @@ -320,4 +367,4 @@ class TUserManagerPasswordMode extends TEnumerable const SHA1='SHA1'; } -?> +?> diff --git a/framework/TApplication.php b/framework/TApplication.php index 9677d192..d9626179 100644 --- a/framework/TApplication.php +++ b/framework/TApplication.php @@ -127,11 +127,28 @@ class TApplication extends TComponent /** * Application configuration file name */ - const CONFIG_FILE='application.xml'; + const CONFIG_FILE_XML='application.xml'; /** * File extension for external config files */ - const CONFIG_FILE_EXT='.xml'; + const CONFIG_FILE_EXT_XML='.xml'; + /** + * Configuration file type, application.xml and config.xml + */ + const CONFIG_TYPE_XML = 'xml'; + /** + * Application configuration file name + */ + const CONFIG_FILE_PHP='application.php'; + /** + * File extension for external config files + */ + const CONFIG_FILE_EXT_PHP='.php'; + /** + * Configuration file type, application.php and config.php + */ + const CONFIG_TYPE_PHP = 'php'; + /** * Runtime directory name */ @@ -200,6 +217,14 @@ class TApplication extends TComponent * @var string configuration file */ private $_configFile; + /** + * @var string configuration file extension + */ + private $_configFileExt; + /** + * @var string configuration type + */ + private $_configType; /** * @var string application base path */ @@ -287,11 +312,11 @@ class TApplication extends TComponent * @param boolean whether to cache application configuration. Defaults to true. * @throws TConfigurationException if configuration file cannot be read or the runtime path is invalid. */ - public function __construct($basePath='protected',$cacheConfig=true) + public function __construct($basePath='protected',$cacheConfig=true, $configType=self::CONFIG_TYPE_XML) { // register application as a singleton Prado::setApplication($this); - + $this->setConfigurationType($configType); $this->resolvePaths($basePath); if($cacheConfig) @@ -319,8 +344,8 @@ class TApplication extends TComponent // determine configuration path and file if(empty($basePath) || ($basePath=realpath($basePath))===false) throw new TConfigurationException('application_basepath_invalid',$basePath); - if(is_file($basePath.DIRECTORY_SEPARATOR.self::CONFIG_FILE)) - $configFile=$basePath.DIRECTORY_SEPARATOR.self::CONFIG_FILE; + if(is_file($basePath.DIRECTORY_SEPARATOR.$this->getConfigurationFileName())) + $configFile=$basePath.DIRECTORY_SEPARATOR.$this->getConfigurationFileName(); else if(is_file($basePath)) { $configFile=$basePath; @@ -541,6 +566,49 @@ class TApplication extends TComponent $this->_configFile=$value; } + public function getConfigurationType() + { + return $this->_configType; + } + + public function setConfigurationType($value) + { + $this->_configType = $value; + } + + public function getConfigurationFileExt() + { + if($this->_configFileExt===null) + { + switch($this->_configType) + { + case TApplication::CONFIG_TYPE_PHP: + $this->_configFileExt = TApplication::CONFIG_FILE_EXT_PHP; + break; + default: + $this->_configFileExt = TApplication::CONFIG_FILE_EXT_XML; + } + } + return $this->_configFileExt; + } + + public function getConfigurationFileName() + { + static $fileName; + if($fileName == null) + { + switch($this->_configType) + { + case TApplication::CONFIG_TYPE_PHP: + $fileName = TApplication::CONFIG_FILE_PHP; + break; + default: + $fileName = TApplication::CONFIG_FILE_XML; + } + } + return $fileName; + } + /** * @return string the directory storing cache data and application-level persistent data. (absolute path) */ @@ -890,7 +958,7 @@ class TApplication extends TComponent $condition=$this->evaluateExpression($condition); if($condition) { - if(($path=Prado::getPathOfNamespace($filePath,self::CONFIG_FILE_EXT))===null || !is_file($path)) + if(($path=Prado::getPathOfNamespace($filePath,$this->getConfigurationFileExt()))===null || !is_file($path)) throw new TConfigurationException('application_includefile_invalid',$filePath); $c=new TApplicationConfiguration; $c->loadFromFile($path); @@ -958,7 +1026,10 @@ class TApplication extends TComponent if($configElement!==null) { $config=new TApplicationConfiguration; - $config->loadFromXml($configElement,$this->getBasePath()); + if($this->getConfigurationType()==self::CONFIG_TYPE_PHP) + $config->loadFromPhp($configElement,$this->getBasePath()); + else + $config->loadFromXml($configElement,$this->getBasePath()); $this->applyConfiguration($config,true); } @@ -1188,9 +1259,17 @@ class TApplicationConfiguration extends TComponent */ public function loadFromFile($fname) { - $dom=new TXmlDocument; - $dom->loadFromFile($fname); - $this->loadFromXml($dom,dirname($fname)); + if(Prado::getApplication()->getConfigurationType()==TApplication::CONFIG_TYPE_PHP) + { + $fcontent = include $fname; + $this->loadFromPhp($fcontent,dirname($fname)); + } + else + { + $dom=new TXmlDocument; + $dom->loadFromFile($fname); + $this->loadFromXml($dom,dirname($fname)); + } } /** @@ -1201,6 +1280,34 @@ class TApplicationConfiguration extends TComponent return $this->_empty; } + public function loadFromPhp($config, $configPath) + { + // application properties + if(isset($config['application'])) + { + foreach($config['application'] as $name=>$value) + { + $this->_properties[$name]=$value; + } + $this->_empty = false; + } + + if(isset($config['paths']) && is_array($config['paths'])) + $this->loadPathsPhp($config['paths'],$configPath); + + if(isset($config['modules']) && is_array($config['modules'])) + $this->loadModulesPhp($config['modules'],$configPath); + + if(isset($config['services']) && is_array($config['services'])) + $this->loadServicesPhp($config['services'],$configPath); + + if(isset($config['parameters']) && is_array($config['parameters'])) + $this->loadParametersPhp($config['parameters'], $configPath); + + if(isset($config['includes']) && is_array($config['includes'])) + $this->loadExternalXml($config['includes'],$configPath); + } + /** * Parses the application configuration given in terms of a TXmlElement. * @param TXmlElement the XML element @@ -1241,6 +1348,34 @@ class TApplicationConfiguration extends TComponent } } + protected function loadPathsPhp($pathsNode, $configPath) + { + if(isset($pathsNode['aliases']) && is_array($pathsNode['aliases'])) + { + foreach($pathsNode['aliases'] as $id=>$path) + { + $path=str_replace('\\','/',$path); + if(preg_match('/^\\/|.:\\/|.:\\\\/',$path)) // if absolute path + $p=realpath($path); + else + $p=realpath($configPath.DIRECTORY_SEPARATOR.$path); + if($p===false || !is_dir($p)) + throw new TConfigurationException('appconfig_aliaspath_invalid',$id,$path); + if(isset($this->_aliases[$id])) + throw new TConfigurationException('appconfig_alias_redefined',$id); + $this->_aliases[$id]=$p; + } + } + + if(isset($pathsNode['using']) && is_array($pathsNode['using'])) + { + foreach($pathsNode['using'] as $namespace) + { + $this->_usings[] = $namespace; + } + } + } + /** * Loads the paths XML node. * @param TXmlElement the paths XML node @@ -1287,6 +1422,26 @@ class TApplicationConfiguration extends TComponent } } + protected function loadModulesPhp($modulesNode, $configPath) + { + foreach($modulesNode as $id=>$module) + { + if(!isset($module['class'])) + throw new TConfigurationException('appconfig_moduletype_required',$id); + $type = $module['class']; + unset($module['class']); + $properties = array(); + if(isset($module['properties'])) + { + $properties = $module['properties']; + unset($module['properties']); + } + $properties['id'] = $id; + $this->_modules[$id]=array($type,$properties,$module); + $this->_empty=false; + } + } + /** * Loads the modules XML node. * @param TXmlElement the modules XML node @@ -1315,6 +1470,22 @@ class TApplicationConfiguration extends TComponent } } + protected function loadServicesPhp($servicesNode,$configPath) + { + foreach($servicesNode as $id => $service) + { + if(!isset($service['class'])) + throw new TConfigurationException('appconfig_servicetype_required'); + $type = $service['class']; + unset($service['class']); + $properties = isset($service['properties']) ? $service['properties'] : array(); + unset($service['properties']); + $properties['id'] = $id; + $this->_services[$id] = array($type,$properties,$service); + $this->_empty = false; + } + } + /** * Loads the services XML node. * @param TXmlElement the services XML node @@ -1340,6 +1511,28 @@ class TApplicationConfiguration extends TComponent } } + protected function loadParametersPhp($parametersNode,$configPath) + { + foreach($parametersNode as $id => $parameter) + { + if(is_array($parameter)) + { + if(isset($parameter['class'])) + { + $type = $parameter['class']; + unset($parameter['class']); + $properties = isset($service['properties']) ? $service['properties'] : array(); + $properties['id'] = $id; + $this->_parameters[$id] = array($type,$properties); + } + } + else + { + $this->_parameters[$id] = $parameter; + } + } + } + /** * Loads the parameters XML node. * @param TXmlElement the parameters XML node @@ -1370,6 +1563,22 @@ class TApplicationConfiguration extends TComponent } } + protected function loadExternalPhp($includeNode,$configPath) + { + foreach($includeNode as $include) + { + $when = isset($include['when'])?true:false; + if(!isset($include['file'])) + throw new TConfigurationException('appconfig_includefile_required'); + $filePath = $include['file']; + if(isset($this->_includes[$filePath])) + $this->_includes[$filePath]='('.$this->_includes[$filePath].') || ('.$when.')'; + else + $$this->_includes[$filePath]=$when; + $this->_empty=false; + } + } + /** * Loads the external XML configurations. * @param TXmlElement the application DOM element diff --git a/framework/Web/Services/TPageService.php b/framework/Web/Services/TPageService.php index 1901e7b9..10c7da6e 100644 --- a/framework/Web/Services/TPageService.php +++ b/framework/Web/Services/TPageService.php @@ -4,7 +4,7 @@ * * @author Qiang Xue * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Web.Services @@ -78,7 +78,11 @@ class TPageService extends TService /** * Configuration file name */ - const CONFIG_FILE='config.xml'; + const CONFIG_FILE_XML='config.xml'; + /** + * Configuration file name + */ + const CONFIG_FILE_PHP='config.php'; /** * Default base path */ @@ -178,7 +182,7 @@ class TPageService extends TService $condition=$this->evaluateExpression($condition); if($condition) { - if(($path=Prado::getPathOfNamespace($filePath,TApplication::CONFIG_FILE_EXT))===null || !is_file($path)) + if(($path=Prado::getPathOfNamespace($filePath,Prado::getApplication()->getConfigurationFileExt()))===null || !is_file($path)) throw new TConfigurationException('pageservice_includefile_invalid',$filePath); $c=new TPageConfiguration($pagePath); $c->loadFromFile($path,$configPagePath); @@ -213,7 +217,12 @@ class TPageService extends TService { $pageConfig=new TPageConfiguration($pagePath); if($config!==null) - $pageConfig->loadPageConfigurationFromXml($config,$application->getBasePath(),''); + { + if($application->getConfigurationType()==TApplication::CONFIG_TYPE_PHP) + $pageConfig->loadPageConfigurationFromPhp($config,$application->getBasePath(),''); + else + $pageConfig->loadPageConfigurationFromXml($config,$application->getBasePath(),''); + } $pageConfig->loadFromFiles($this->getBasePath()); } else @@ -249,9 +258,12 @@ class TPageService extends TService $configCached=false; $paths=explode('.',$pagePath); $configPath=$this->getBasePath(); + $fileName = $this->getApplication()->getConfigurationType()==TApplication::CONFIG_TYPE_PHP + ? self::CONFIG_FILE_PHP + : self::CONFIG_FILE_XML; foreach($paths as $path) { - $configFile=$configPath.DIRECTORY_SEPARATOR.self::CONFIG_FILE; + $configFile=$configPath.DIRECTORY_SEPARATOR.$fileName; $currentTimestamp[$configFile]=@filemtime($configFile); $configPath.=DIRECTORY_SEPARATOR.$path; } @@ -581,16 +593,19 @@ class TPageConfiguration extends TComponent $page=array_pop($paths); $path=$basePath; $configPagePath=''; + $fileName = Prado::getApplication()->getConfigurationType()==TApplication::CONFIG_TYPE_PHP + ? TPageService::CONFIG_FILE_PHP + : TPageService::CONFIG_FILE_XML; foreach($paths as $p) { - $this->loadFromFile($path.DIRECTORY_SEPARATOR.TPageService::CONFIG_FILE,$configPagePath); + $this->loadFromFile($path.DIRECTORY_SEPARATOR.$fileName,$configPagePath); $path.=DIRECTORY_SEPARATOR.$p; if($configPagePath==='') $configPagePath=$p; else $configPagePath.='.'.$p; } - $this->loadFromFile($path.DIRECTORY_SEPARATOR.TPageService::CONFIG_FILE,$configPagePath); + $this->loadFromFile($path.DIRECTORY_SEPARATOR.$fileName,$configPagePath); $this->_rules=new TAuthorizationRuleCollection($this->_rules); } @@ -604,11 +619,26 @@ class TPageConfiguration extends TComponent Prado::trace("Loading page configuration file $fname",'System.Web.Services.TPageService'); if(empty($fname) || !is_file($fname)) return; - $dom=new TXmlDocument; - if($dom->loadFromFile($fname)) - $this->loadFromXml($dom,dirname($fname),$configPagePath); + + if(Prado::getApplication()->getConfigurationType()==TApplication::CONFIG_TYPE_PHP) + { + $fcontent = include $fname; + $this->loadFromPhp($fcontent,dirname($fname),$configPagePath); + } else - throw new TConfigurationException('pageserviceconf_file_invalid',$fname); + { + $dom=new TXmlDocument; + if($dom->loadFromFile($fname)) + $this->loadFromXml($dom,dirname($fname),$configPagePath); + else + throw new TConfigurationException('pageserviceconf_file_invalid',$fname); + } + } + + public function loadFromPhp($config,$configPath,$configPagePath) + { + $this->loadApplicationConfigurationFromPhp($config,$configPath); + $this->loadPageConfigurationFromPhp($config,$configPath,$configPagePath); } /** @@ -624,6 +654,13 @@ class TPageConfiguration extends TComponent $this->loadApplicationConfigurationFromXml($dom,$configPath); $this->loadPageConfigurationFromXml($dom,$configPath,$configPagePath); } + + public function loadApplicationConfigurationFromPhp($config,$configPath) + { + $appConfig=new TApplicationConfiguration; + $appConfig->loadFromPhp($config,$configPath); + $this->_appConfigs[]=$appConfig; + } /** * Loads the configuration specific for application part @@ -637,6 +674,99 @@ class TPageConfiguration extends TComponent $this->_appConfigs[]=$appConfig; } + public function loadPageConfigurationFromPhp($config, $configPath, $configPagePath) + { + // authorization + if(isset($config['authorization']) && is_array($config['authorization'])) + { + $rules = array(); + foreach($config['authorization'] as $authorization) + { + $patterns=isset($authorization['pages'])?$authorization['pages']:''; + $ruleApplies=false; + if(empty($patterns) || trim($patterns)==='*') // null or empty string + $ruleApplies=true; + else + { + foreach(explode(',',$patterns) as $pattern) + { + if(($pattern=trim($pattern))!=='') + { + // we know $configPagePath and $this->_pagePath + if($configPagePath!=='') // prepend the pattern with ConfigPagePath + $pattern=$configPagePath.'.'.$pattern; + if(strcasecmp($pattern,$this->_pagePath)===0) + { + $ruleApplies=true; + break; + } + if($pattern[strlen($pattern)-1]==='*') // try wildcard matching + { + if(strncasecmp($this->_pagePath,$pattern,strlen($pattern)-1)===0) + { + $ruleApplies=true; + break; + } + } + } + } + } + if($ruleApplies) + { + $action = isset($authorization['action'])?$authorization['action']:''; + $users = isset($authorization['users'])?$authorization['users']:''; + $roles = isset($authorization['roles'])?$authorization['roles']:''; + $verb = isset($authorization['verb'])?$authorization['verb']:''; + $ips = isset($authorization['ips'])?$authorization['ips']:''; + $rules[]=new TAuthorizationRule($action,$users,$roles,$verb,$ips); + } + } + } + // pages + if(isset($config['pages']) && is_array($config['pages'])) + { + if(isset($config['pages']['properties'])) + { + $this->_properties = array_merge($this->_properties, $config['pages']['properties']); + unset($config['pages']['properties']); + } + foreach($config['pages'] as $id => $page) + { + $properties = array(); + if(isset($page['properties'])) + { + $properties=$page['properties']; + unset($page['properties']); + } + $matching=false; + $id=($configPagePath==='')?$id:$configPagePath.'.'.$id; + if(strcasecmp($id,$this->_pagePath)===0) + $matching=true; + else if($id[strlen($id)-1]==='*') // try wildcard matching + $matching=strncasecmp($this->_pagePath,$id,strlen($id)-1)===0; + if($matching) + $this->_properties=array_merge($this->_properties,$properties); + } + $this->_rules=array_merge($rules,$this->_rules); + } + + // external configurations + if(isset($config['includes']) && is_array($config['includes'])) + { + foreach($config['includes'] as $include) + { + $when = isset($include['when'])?true:false; + if(!isset($include['file'])) + throw new TConfigurationException('pageserviceconf_includefile_required'); + $filePath = $include['file']; + if(isset($this->_includes[$filePath])) + $this->_includes[$filePath]=array($configPagePath,'('.$this->_includes[$filePath][1].') || ('.$when.')'); + else + $this->_includes[$filePath]=array($configPagePath,$when); + } + } + } + /** * Loads the configuration specific for page service. * @param TXmlElement config xml element @@ -721,6 +851,4 @@ class TPageConfiguration extends TComponent $this->_includes[$filePath]=array($configPagePath,$when); } } -} - -?> +} \ No newline at end of file diff --git a/framework/Web/Services/TSoapService.php b/framework/Web/Services/TSoapService.php index 24f95a35..259fa5f8 100644 --- a/framework/Web/Services/TSoapService.php +++ b/framework/Web/Services/TSoapService.php @@ -148,19 +148,35 @@ class TSoapService extends TService /** * Loads configuration from an XML element - * @param TXmlElement configuration node + * @param mixed configuration node * @throws TConfigurationException if soap server id is not specified or duplicated */ - private function loadConfig($xml) - { - foreach($xml->getElementsByTagName('soap') as $serverXML) + private function loadConfig($config) + { + if($this->getApplication()->getConfigurationType()==TApplication::CONFIG_TYPE_PHP) + { + if(is_array($config)) + { + foreach($config as $id => $server) + { + $properties = isset($server['properties'])?$server['properties']:array(); + if(isset($this->_servers[$id])) + throw new TConfigurationException('soapservice_serverid_duplicated',$id); + $this->_servers[$id]=$properties; + } + } + } + else { - $properties=$serverXML->getAttributes(); - if(($id=$properties->remove('id'))===null) - throw new TConfigurationException('soapservice_serverid_required'); - if(isset($this->_servers[$id])) - throw new TConfigurationException('soapservice_serverid_duplicated',$id); - $this->_servers[$id]=$properties; + foreach($config->getElementsByTagName('soap') as $serverXML) + { + $properties=$serverXML->getAttributes(); + if(($id=$properties->remove('id'))===null) + throw new TConfigurationException('soapservice_serverid_required'); + if(isset($this->_servers[$id])) + throw new TConfigurationException('soapservice_serverid_duplicated',$id); + $this->_servers[$id]=$properties; + } } } @@ -221,7 +237,7 @@ class TSoapService extends TService protected function createServer() { $properties=$this->_servers[$this->_serverID]; - if(($serverClass=$properties->remove('class'))===null) + if($this->getApplication()->getConfigurationType()==TApplication::CONFIG_TYPE_PHP || ($serverClass=$properties->remove('class'))===null) $serverClass=self::DEFAULT_SOAP_SERVER; Prado::using($serverClass); $className=($pos=strrpos($serverClass,'.'))!==false?substr($serverClass,$pos+1):$serverClass; -- cgit v1.2.3 From 6228873cf9d6471463d2413e7dfd7447f759baf2 Mon Sep 17 00:00:00 2001 From: "christophe.boulain" <> Date: Wed, 3 Dec 2008 14:22:03 +0000 Subject: Merge from trunk --- .gitattributes | 41 +- .gitignore | 2 + HISTORY | 56 +- UPGRADE | 353 ++++----- demos/personal/protected/Pages/Settings.page | 2 +- demos/personal/protected/Pages/config.php | 6 +- demos/personal/protected/application.php | 2 +- .../protected/pages/ActiveControls/DragDrop.page | 26 + .../protected/pages/ActiveControls/Home.page | 22 +- .../ActiveControls/Samples/DragDrop/Home.page | 90 +++ .../pages/ActiveControls/Samples/DragDrop/Home.php | 112 +++ .../Samples/DragDrop/assets/product1.png | Bin 0 -> 10711 bytes .../Samples/DragDrop/assets/product2.png | Bin 0 -> 9550 bytes .../Samples/DragDrop/assets/trash.png | Bin 0 -> 783 bytes .../protected/pages/Configurations/Templates2.page | 14 + .../protected/pages/Configurations/UrlMapping.page | 5 +- .../protected/pages/Database/ActiveRecord.page | 15 +- .../pages/GettingStarted/NewFeatures.page | 8 +- framework/3rdParty/TinyMCE/tiny_mce.md5 | 2 +- framework/3rdParty/TinyMCE/tiny_mce.tar | Bin 3645440 -> 3880960 bytes framework/Caching/TAPCCache.php | 1 - framework/Caching/TCache.php | 20 +- framework/Caching/TMemCache.php | 1 - framework/Caching/TSqliteCache.php | 1 - framework/Collections/TAttributeCollection.php | 1 - framework/Collections/TDummyDataSource.php | 1 - framework/Collections/TList.php | 1 - framework/Collections/TMap.php | 1 - framework/Collections/TPagedDataSource.php | 1 - framework/Collections/TPagedList.php | 1 - framework/Collections/TQueue.php | 1 - framework/Collections/TStack.php | 1 - .../Exceptions/TActiveRecordException.php | 1 - .../Data/ActiveRecord/Exceptions/messages.txt | 3 +- .../Relations/TActiveRecordBelongsTo.php | 1 - .../Relations/TActiveRecordHasMany.php | 1 - .../Relations/TActiveRecordHasManyAssociation.php | 1 - .../ActiveRecord/Relations/TActiveRecordHasOne.php | 1 - .../Relations/TActiveRecordRelation.php | 1 - .../Relations/TActiveRecordRelationContext.php | 1 - .../Scaffold/InputBuilder/TIbmScaffoldInput.php | 1 - .../Scaffold/InputBuilder/TMssqlScaffoldInput.php | 1 - .../Scaffold/InputBuilder/TMysqlScaffoldInput.php | 1 - .../Scaffold/InputBuilder/TPgsqlScaffoldInput.php | 1 - .../Scaffold/InputBuilder/TScaffoldInputBase.php | 1 - .../Scaffold/InputBuilder/TScaffoldInputCommon.php | 1 - .../Scaffold/InputBuilder/TSqliteScaffoldInput.php | 1 - .../Data/ActiveRecord/Scaffold/TScaffoldBase.php | 1 - .../ActiveRecord/Scaffold/TScaffoldEditView.php | 1 - .../ActiveRecord/Scaffold/TScaffoldListView.php | 1 - .../Data/ActiveRecord/Scaffold/TScaffoldSearch.php | 1 - .../Data/ActiveRecord/Scaffold/TScaffoldView.php | 1 - framework/Data/ActiveRecord/TActiveRecord.php | 29 +- .../Data/ActiveRecord/TActiveRecordConfig.php | 1 - .../Data/ActiveRecord/TActiveRecordCriteria.php | 1 - .../Data/ActiveRecord/TActiveRecordGateway.php | 839 +++++++++++---------- .../Data/ActiveRecord/TActiveRecordManager.php | 1 - .../Data/Common/IbmDb2/TIbmColumnMetaData.php | 1 - framework/Data/Common/IbmDb2/TIbmMetaData.php | 1 - .../Data/Common/IbmDb2/TIbmMetaDataInspector.php | 1 - .../Data/Common/Mssql/TMssqlCommandBuilder.php | 1 - framework/Data/Common/Mssql/TMssqlMetaData.php | 1 - framework/Data/Common/Mssql/TMssqlTableColumn.php | 1 - framework/Data/Common/Mssql/TMssqlTableInfo.php | 1 - .../Data/Common/Mysql/TMysqlCommandBuilder.php | 1 - framework/Data/Common/Mysql/TMysqlMetaData.php | 5 +- framework/Data/Common/Mysql/TMysqlTableColumn.php | 1 - .../Data/Common/Pgsql/TPgsqlCommandBuilder.php | 1 - framework/Data/Common/Pgsql/TPgsqlMetaData.php | 1 - framework/Data/Common/Pgsql/TPgsqlTableColumn.php | 1 - framework/Data/Common/Pgsql/TPgsqlTableInfo.php | 1 - .../Data/Common/Sqlite/TSqliteCommandBuilder.php | 1 - framework/Data/Common/Sqlite/TSqliteMetaData.php | 1 - .../Data/Common/Sqlite/TSqliteTableColumn.php | 1 - framework/Data/Common/Sqlite/TSqliteTableInfo.php | 1 - framework/Data/Common/TDbMetaData.php | 1 - framework/Data/Common/TDbTableColumn.php | 1 - framework/Data/Common/TDbTableInfo.php | 1 - framework/Data/DataGateway/TTableGateway.php | 1 - .../Data/SqlMap/Configuration/TDiscriminator.php | 1 - .../Configuration/TInlineParameterMapParser.php | 3 +- .../Data/SqlMap/Configuration/TParameterMap.php | 1 - .../SqlMap/Configuration/TParameterProperty.php | 1 - framework/Data/SqlMap/Configuration/TResultMap.php | 1 - .../Data/SqlMap/Configuration/TResultProperty.php | 1 - .../SqlMap/Configuration/TSimpleDynamicParser.php | 1 - .../SqlMap/Configuration/TSqlMapCacheModel.php | 1 - .../Data/SqlMap/Configuration/TSqlMapStatement.php | 1 - .../Configuration/TSqlMapXmlConfiguration.php | 15 +- framework/Data/SqlMap/DataMapper/TLazyLoadList.php | 1 - .../Data/SqlMap/DataMapper/TPropertyAccess.php | 3 +- framework/Data/SqlMap/DataMapper/TSqlMapCache.php | 1 - .../Data/SqlMap/DataMapper/TSqlMapException.php | 1 - .../Data/SqlMap/DataMapper/TSqlMapPagedList.php | 1 - .../DataMapper/TSqlMapTypeHandlerRegistry.php | 1 - .../Data/SqlMap/Statements/IMappedStatement.php | 1 - .../Data/SqlMap/Statements/TCachingStatement.php | 1 - .../SqlMap/Statements/TDeleteMappedStatement.php | 1 - .../SqlMap/Statements/TInsertMappedStatement.php | 1 - .../Data/SqlMap/Statements/TMappedStatement.php | 7 +- .../Data/SqlMap/Statements/TPreparedCommand.php | 1 - .../Data/SqlMap/Statements/TPreparedStatement.php | 1 - .../Statements/TPreparedStatementFactory.php | 1 - .../SqlMap/Statements/TSelectMappedStatement.php | 1 - .../Data/SqlMap/Statements/TSimpleDynamicSql.php | 1 - framework/Data/SqlMap/Statements/TStaticSql.php | 1 - .../SqlMap/Statements/TUpdateMappedStatement.php | 1 - framework/Data/SqlMap/TSqlMapConfig.php | 1 - framework/Data/SqlMap/TSqlMapGateway.php | 1 - framework/Data/SqlMap/TSqlMapManager.php | 1 - framework/Data/TDataSourceConfig.php | 2 - framework/Data/TDbCommand.php | 1 - framework/Data/TDbConnection.php | 6 +- framework/Data/TDbDataReader.php | 1 - framework/Data/TDbTransaction.php | 1 - framework/Exceptions/TErrorHandler.php | 1 - framework/Exceptions/TException.php | 1 - framework/Exceptions/messages/messages.txt | 7 + framework/I18N/TDateFormat.php | 41 +- framework/I18N/TGlobalizationAutoDetect.php | 1 - framework/I18N/TI18NControl.php | 1 - framework/I18N/TNumberFormat.php | 29 +- framework/I18N/TTranslate.php | 1 - framework/I18N/TTranslateParameter.php | 1 - framework/I18N/Translation.php | 1 - framework/I18N/core/CultureInfo.php | 1 - framework/I18N/core/DateTimeFormatInfo.php | 1 - framework/I18N/core/Gettext/MO.php | 1 - framework/I18N/core/Gettext/PO.php | 1 - framework/I18N/core/Gettext/TGettext.php | 1 - framework/I18N/core/HTTPNegotiator.php | 1 - framework/I18N/core/IMessageSource.php | 1 - framework/I18N/core/MessageFormat.php | 1 - framework/I18N/core/MessageSource_XLIFF.php | 2 +- framework/I18N/core/NumberFormat.php | 1 - framework/I18N/core/NumberFormatInfo.php | 1 - framework/IO/TTextWriter.php | 1 - framework/PradoBase.php | 5 + framework/Security/IUserManager.php | 1 - framework/Security/TAuthManager.php | 61 +- framework/Security/TAuthorizationRule.php | 1 - framework/Security/TDbUserManager.php | 1 - framework/Security/TSecurityManager.php | 1 - framework/Security/TUser.php | 1 - framework/Security/TUserManager.php | 2 +- framework/TApplication.php | 36 +- framework/TApplicationComponent.php | 1 - framework/TComponent.php | 1 - framework/TModule.php | 1 - framework/TService.php | 1 - framework/TShellApplication.php | 1 - framework/Util/TDataFieldAccessor.php | 1 - framework/Util/TLogRouter.php | 21 +- framework/Util/TLogger.php | 1 - framework/Util/TParameterModule.php | 1 - framework/Util/TVarDumper.php | 1 - framework/Web/Javascripts/TJavaScript.php | 1 - framework/Web/Javascripts/source/packages.php | 36 +- .../source/prado/activecontrols/activecontrols3.js | 749 +++++++++--------- .../prado/activecontrols/activedatepicker.js | 79 ++ .../source/prado/activecontrols/dragdrop.js | 24 + .../source/prado/activecontrols/inlineeditor.js | 2 +- .../activefileupload/ActiveFileUploadBlank.html | 1 + .../activefileupload/ActiveFileUploadComplete.png | Bin 0 -> 663 bytes .../activefileupload/ActiveFileUploadError.png | Bin 0 -> 589 bytes .../activefileupload/ActiveFileUploadIndicator.gif | Bin 0 -> 1553 bytes .../prado/activefileupload/activefileupload.js | 63 ++ .../source/prado/activeratings/blocks.css | 42 -- .../source/prado/activeratings/default.css | 43 -- .../source/prado/activeratings/ratings.js | 178 ----- .../Javascripts/source/prado/controls/controls.js | 19 +- .../source/prado/datepicker/datepicker.js | 21 +- .../Javascripts/source/prado/ratings/ratings.js | 207 ++++- .../source/prado/validator/validation3.js | 13 +- .../source/scriptaculous-1.8.1/dragdrop.js | 2 +- framework/Web/Services/TFeedService.php | 1 - framework/Web/Services/TJsonService.php | 2 +- framework/Web/Services/TSoapService.php | 1 - framework/Web/TAssetManager.php | 9 +- framework/Web/TCacheHttpSession.php | 1 - framework/Web/THttpRequest.php | 1 - framework/Web/THttpResponse.php | 1 - framework/Web/THttpSession.php | 1 - framework/Web/THttpUtility.php | 1 - framework/Web/TUrlManager.php | 1 - framework/Web/TUrlMapping.php | 50 +- framework/Web/UI/ActiveControls/TActiveButton.php | 1 - .../UI/ActiveControls/TActiveControlAdapter.php | 9 +- .../UI/ActiveControls/TActiveCustomValidator.php | 1 - .../Web/UI/ActiveControls/TActiveDatePicker.php | 129 ++++ .../Web/UI/ActiveControls/TActiveFileUpload.php | 315 ++++++++ .../Web/UI/ActiveControls/TActiveHiddenField.php | 1 - framework/Web/UI/ActiveControls/TActiveLabel.php | 10 +- .../Web/UI/ActiveControls/TActiveLinkButton.php | 5 + .../Web/UI/ActiveControls/TActivePageAdapter.php | 9 +- framework/Web/UI/ActiveControls/TActivePager.php | 9 +- framework/Web/UI/ActiveControls/TActivePanel.php | 1 - .../UI/ActiveControls/TActiveRadioButtonList.php | 6 + .../Web/UI/ActiveControls/TActiveRatingList.php | 344 ++------- framework/Web/UI/ActiveControls/TActiveTextBox.php | 1 - framework/Web/UI/ActiveControls/TAutoComplete.php | 9 +- .../Web/UI/ActiveControls/TBaseActiveControl.php | 5 +- framework/Web/UI/ActiveControls/TCallback.php | 1 - .../UI/ActiveControls/TCallbackClientScript.php | 1 - .../Web/UI/ActiveControls/TCallbackClientSide.php | 1 - .../UI/ActiveControls/TCallbackEventParameter.php | 1 - .../Web/UI/ActiveControls/TCallbackOptions.php | 1 - framework/Web/UI/ActiveControls/TDraggable.php | 152 ++++ framework/Web/UI/ActiveControls/TDropContainer.php | 275 +++++++ .../UI/ActiveControls/TEventTriggeredCallback.php | 1 - .../Web/UI/ActiveControls/TInPlaceTextBox.php | 1 - .../UI/ActiveControls/TTimeTriggeredCallback.php | 24 +- .../Web/UI/ActiveControls/TTriggeredCallback.php | 1 - .../UI/ActiveControls/TValueTriggeredCallback.php | 1 - framework/Web/UI/TCachePageStatePersister.php | 1 - framework/Web/UI/TClientScriptManager.php | 10 +- framework/Web/UI/TCompositeControl.php | 1 - framework/Web/UI/TControl.php | 8 + framework/Web/UI/TControlAdapter.php | 1 - framework/Web/UI/TForm.php | 1 - framework/Web/UI/THtmlWriter.php | 1 - framework/Web/UI/TPage.php | 8 +- framework/Web/UI/TPageStatePersister.php | 1 - framework/Web/UI/TSessionPageStatePersister.php | 1 - framework/Web/UI/TTemplateControl.php | 1 - framework/Web/UI/TTemplateManager.php | 9 +- framework/Web/UI/WebControls/TBaseDataList.php | 1 - framework/Web/UI/WebControls/TBaseValidator.php | 15 +- framework/Web/UI/WebControls/TBoundColumn.php | 1 - framework/Web/UI/WebControls/TBulletedList.php | 1 - framework/Web/UI/WebControls/TButton.php | 1 - framework/Web/UI/WebControls/TButtonColumn.php | 1 - framework/Web/UI/WebControls/TCaptcha.php | 1 - framework/Web/UI/WebControls/TCaptchaValidator.php | 1 - framework/Web/UI/WebControls/TCheckBox.php | 18 + framework/Web/UI/WebControls/TCheckBoxColumn.php | 1 - framework/Web/UI/WebControls/TCheckBoxList.php | 19 +- framework/Web/UI/WebControls/TClientScript.php | 1 - .../Web/UI/WebControls/TClientScriptLoader.php | 1 - framework/Web/UI/WebControls/TColorPicker.php | 4 +- framework/Web/UI/WebControls/TCompareValidator.php | 1 - framework/Web/UI/WebControls/TConditional.php | 1 - framework/Web/UI/WebControls/TContent.php | 1 - .../Web/UI/WebControls/TContentPlaceHolder.php | 1 - framework/Web/UI/WebControls/TCustomValidator.php | 26 +- framework/Web/UI/WebControls/TDataGrid.php | 1 - framework/Web/UI/WebControls/TDataGridColumn.php | 1 - .../Web/UI/WebControls/TDataGridItemRenderer.php | 1 - .../Web/UI/WebControls/TDataGridPagerStyle.php | 1 - framework/Web/UI/WebControls/TDataList.php | 1 - .../Web/UI/WebControls/TDataListItemRenderer.php | 1 - framework/Web/UI/WebControls/TDataRenderer.php | 1 - .../Web/UI/WebControls/TDataSourceControl.php | 1 - framework/Web/UI/WebControls/TDataSourceView.php | 1 - .../Web/UI/WebControls/TDataTypeValidator.php | 1 - framework/Web/UI/WebControls/TDatePicker.php | 46 +- framework/Web/UI/WebControls/TDropDownList.php | 19 +- .../Web/UI/WebControls/TDropDownListColumn.php | 1 - .../Web/UI/WebControls/TEditCommandColumn.php | 1 - .../Web/UI/WebControls/TEmailAddressValidator.php | 1 - framework/Web/UI/WebControls/TExpression.php | 1 - framework/Web/UI/WebControls/TFileUpload.php | 20 +- framework/Web/UI/WebControls/TFont.php | 1 - framework/Web/UI/WebControls/THead.php | 21 +- framework/Web/UI/WebControls/THiddenField.php | 19 +- framework/Web/UI/WebControls/THtmlArea.php | 1 - framework/Web/UI/WebControls/THyperLink.php | 1 - framework/Web/UI/WebControls/THyperLinkColumn.php | 1 - framework/Web/UI/WebControls/TImage.php | 1 - framework/Web/UI/WebControls/TImageMap.php | 1 - framework/Web/UI/WebControls/TInlineFrame.php | 1 - framework/Web/UI/WebControls/TItemDataRenderer.php | 1 - framework/Web/UI/WebControls/TJavascriptLogger.php | 1 - framework/Web/UI/WebControls/TKeyboard.php | 1 - framework/Web/UI/WebControls/TLabel.php | 1 - framework/Web/UI/WebControls/TLinkButton.php | 1 - framework/Web/UI/WebControls/TListBox.php | 19 +- .../Web/UI/WebControls/TListControlValidator.php | 1 - framework/Web/UI/WebControls/TListItem.php | 1 - framework/Web/UI/WebControls/TLiteral.php | 1 - framework/Web/UI/WebControls/TLiteralColumn.php | 1 - framework/Web/UI/WebControls/TMarkdown.php | 1 - framework/Web/UI/WebControls/TMultiView.php | 1 - framework/Web/UI/WebControls/TOutputCache.php | 1 - framework/Web/UI/WebControls/TPager.php | 1 - framework/Web/UI/WebControls/TPanel.php | 1 - framework/Web/UI/WebControls/TPanelStyle.php | 1 - framework/Web/UI/WebControls/TPlaceHolder.php | 1 - framework/Web/UI/WebControls/TRadioButton.php | 1 - framework/Web/UI/WebControls/TRadioButtonList.php | 1 - framework/Web/UI/WebControls/TRangeValidator.php | 1 - framework/Web/UI/WebControls/TRatingList.php | 348 ++++++--- .../UI/WebControls/TRegularExpressionValidator.php | 21 +- framework/Web/UI/WebControls/TRepeatInfo.php | 1 - framework/Web/UI/WebControls/TRepeater.php | 1 - .../Web/UI/WebControls/TRepeaterItemRenderer.php | 1 - .../Web/UI/WebControls/TRequiredFieldValidator.php | 1 - framework/Web/UI/WebControls/TSafeHtml.php | 1 - framework/Web/UI/WebControls/TSlider.php | 7 +- framework/Web/UI/WebControls/TStatements.php | 1 - framework/Web/UI/WebControls/TStyle.php | 1 - framework/Web/UI/WebControls/TTable.php | 1 - framework/Web/UI/WebControls/TTableCell.php | 1 - framework/Web/UI/WebControls/TTableFooterRow.php | 1 - framework/Web/UI/WebControls/TTableHeaderCell.php | 1 - framework/Web/UI/WebControls/TTableHeaderRow.php | 1 - framework/Web/UI/WebControls/TTableRow.php | 1 - framework/Web/UI/WebControls/TTemplateColumn.php | 1 - framework/Web/UI/WebControls/TTextBox.php | 19 +- framework/Web/UI/WebControls/TTextHighlighter.php | 1 - framework/Web/UI/WebControls/TTextProcessor.php | 1 - .../Web/UI/WebControls/TValidationSummary.php | 1 - framework/Web/UI/WebControls/TWebControl.php | 1 - .../Web/UI/WebControls/TWebControlAdapter.php | 1 - framework/Web/UI/WebControls/TWizard.php | 1 - .../WebControls/TWizardNavigationButtonStyle.php | 1 - framework/Web/UI/WebControls/TXmlTransform.php | 1 - framework/Web/UI/WebControls/assets/captcha.php | 1 - framework/Xml/TXmlDocument.php | 1 - framework/interfaces.php | 1 - framework/prado.php | 1 - index.html | 344 ++++----- .../protected/pages/ActiveDatePicker.page | 17 + .../protected/pages/ActiveDatePicker.php | 42 ++ .../pages/ActiveRatingListAllowInputTest.page | 14 + .../pages/ActiveRatingListAllowInputTest.php | 27 + .../pages/ActiveRatingListAutoPostBackTest.page | 16 + .../pages/ActiveRatingListAutoPostBackTest.php | 27 + .../pages/ActiveRatingListCheckBoxesTest.page | 12 + .../pages/ActiveRatingListCheckBoxesTest.php | 23 + .../pages/ActiveRatingListEnabledTest.page | 17 + .../pages/ActiveRatingListEnabledTest.php | 37 + .../pages/ActiveRatingListHoverCaptionTest.page | 14 + .../pages/ActiveRatingListHoverCaptionTest.php | 27 + .../pages/ActiveRatingListRatingTest.page | 17 + .../protected/pages/ActiveRatingListRatingTest.php | 32 + .../pages/ActiveRatingListReadOnlyTest.page | 17 + .../pages/ActiveRatingListReadOnlyTest.php | 38 + .../pages/ActiveRatingListSelectedIndexTest.page | 17 + .../pages/ActiveRatingListSelectedIndexTest.php | 32 + .../protected/pages/RatingList.page | 13 +- .../tests/ActiveDatePickerTestCase.php | 97 +++ .../ActiveRatingListTestCase.php | 253 +++++++ .../tickets/protected/application.xml | 3 +- .../tickets/protected/pages/Ticket284Component.php | 11 +- .../tickets/protected/pages/Ticket900.page | 45 ++ .../tickets/protected/pages/Ticket900.php | 58 ++ .../tickets/protected/pages/Ticket922.page | 12 + .../tickets/protected/pages/Ticket922.php | 13 + .../tickets/protected/pages/Ticket925.page | 11 + .../tickets/protected/pages/Ticket925.php | 76 ++ .../tickets/tests/Ticket595TestCase.php | 4 +- .../tickets/tests/Ticket900TestCase.php | 19 + .../tickets/tests/Ticket922TestCase.php | 18 + 354 files changed, 4774 insertions(+), 2245 deletions(-) create mode 100755 demos/quickstart/protected/pages/ActiveControls/DragDrop.page create mode 100755 demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/Home.page create mode 100755 demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/Home.php create mode 100755 demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/product1.png create mode 100755 demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/product2.png create mode 100755 demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/trash.png create mode 100755 framework/Web/Javascripts/source/prado/activecontrols/activedatepicker.js create mode 100755 framework/Web/Javascripts/source/prado/activecontrols/dragdrop.js create mode 100755 framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadBlank.html create mode 100755 framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadComplete.png create mode 100755 framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadError.png create mode 100755 framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadIndicator.gif create mode 100755 framework/Web/Javascripts/source/prado/activefileupload/activefileupload.js delete mode 100644 framework/Web/Javascripts/source/prado/activeratings/blocks.css delete mode 100644 framework/Web/Javascripts/source/prado/activeratings/default.css delete mode 100644 framework/Web/Javascripts/source/prado/activeratings/ratings.js create mode 100755 framework/Web/UI/ActiveControls/TActiveDatePicker.php create mode 100755 framework/Web/UI/ActiveControls/TActiveFileUpload.php create mode 100755 framework/Web/UI/ActiveControls/TDraggable.php create mode 100755 framework/Web/UI/ActiveControls/TDropContainer.php create mode 100755 tests/FunctionalTests/active-controls/protected/pages/ActiveDatePicker.page create mode 100755 tests/FunctionalTests/active-controls/protected/pages/ActiveDatePicker.php create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAllowInputTest.page create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAllowInputTest.php create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAutoPostBackTest.page create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAutoPostBackTest.php create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListCheckBoxesTest.page create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListCheckBoxesTest.php create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListEnabledTest.page create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListEnabledTest.php create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListHoverCaptionTest.page create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListHoverCaptionTest.php create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListRatingTest.page create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListRatingTest.php create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListReadOnlyTest.page create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListReadOnlyTest.php create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListSelectedIndexTest.page create mode 100644 tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListSelectedIndexTest.php create mode 100755 tests/FunctionalTests/active-controls/tests/ActiveDatePickerTestCase.php create mode 100644 tests/FunctionalTests/active-controlstests/ActiveRatingListTestCase.php create mode 100644 tests/FunctionalTests/tickets/protected/pages/Ticket900.page create mode 100644 tests/FunctionalTests/tickets/protected/pages/Ticket900.php create mode 100644 tests/FunctionalTests/tickets/protected/pages/Ticket922.page create mode 100644 tests/FunctionalTests/tickets/protected/pages/Ticket922.php create mode 100755 tests/FunctionalTests/tickets/protected/pages/Ticket925.page create mode 100755 tests/FunctionalTests/tickets/protected/pages/Ticket925.php create mode 100644 tests/FunctionalTests/tickets/tests/Ticket900TestCase.php create mode 100644 tests/FunctionalTests/tickets/tests/Ticket922TestCase.php (limited to 'framework') diff --git a/.gitattributes b/.gitattributes index 3b7e0920..eeda95c0 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1282,8 +1282,13 @@ demos/quickstart/protected/pages/ActiveControls/ActiveCustomValidator.page -text demos/quickstart/protected/pages/ActiveControls/ActiveHyperLink.page -text demos/quickstart/protected/pages/ActiveControls/ActivePager.page -text demos/quickstart/protected/pages/ActiveControls/AutoComplete.page -text +demos/quickstart/protected/pages/ActiveControls/DragDrop.page -text demos/quickstart/protected/pages/ActiveControls/Home.page -text demos/quickstart/protected/pages/ActiveControls/Introduction.page -text +demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/Home.page -text +demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/product1.png -text svneol=unset#image/png +demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/product2.png -text svneol=unset#image/png +demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/trash.png -text svneol=unset#image/png demos/quickstart/protected/pages/ActiveControls/Samples/TActiveButton/Home.page -text demos/quickstart/protected/pages/ActiveControls/Samples/TActiveButton/Home.php -text demos/quickstart/protected/pages/ActiveControls/Samples/TActiveCheckBox/Home.page -text @@ -2522,22 +2527,26 @@ framework/Web/Javascripts/TJavaScript.php -text framework/Web/Javascripts/clientscripts.php -text framework/Web/Javascripts/source/packages.php -text framework/Web/Javascripts/source/prado/activecontrols/activecontrols3.js -text +framework/Web/Javascripts/source/prado/activecontrols/activedatepicker.js -text framework/Web/Javascripts/source/prado/activecontrols/ajax3.js -text +framework/Web/Javascripts/source/prado/activecontrols/dragdrop.js -text framework/Web/Javascripts/source/prado/activecontrols/inlineeditor.js -text framework/Web/Javascripts/source/prado/activecontrols/json.js -text -framework/Web/Javascripts/source/prado/activeratings/blocks.css -text +framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadBlank.html -text +framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadComplete.png -text svneol=unset#image/png +framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadError.png -text svneol=unset#image/png +framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadIndicator.gif -text +framework/Web/Javascripts/source/prado/activefileupload/activefileupload.js -text framework/Web/Javascripts/source/prado/activeratings/blocks.png -text framework/Web/Javascripts/source/prado/activeratings/blocks_blank.gif -text framework/Web/Javascripts/source/prado/activeratings/blocks_combined.gif -text framework/Web/Javascripts/source/prado/activeratings/blocks_half.gif -text framework/Web/Javascripts/source/prado/activeratings/blocks_selected.gif -text -framework/Web/Javascripts/source/prado/activeratings/default.css -text framework/Web/Javascripts/source/prado/activeratings/default.png -text framework/Web/Javascripts/source/prado/activeratings/default_blank.gif -text framework/Web/Javascripts/source/prado/activeratings/default_combined.gif -text framework/Web/Javascripts/source/prado/activeratings/default_half.gif -text framework/Web/Javascripts/source/prado/activeratings/default_selected.gif -text -framework/Web/Javascripts/source/prado/activeratings/ratings.js -text framework/Web/Javascripts/source/prado/colorpicker/background.png -text framework/Web/Javascripts/source/prado/colorpicker/button.gif -text framework/Web/Javascripts/source/prado/colorpicker/colorpicker.js -text @@ -2757,6 +2766,8 @@ tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag tests/FunctionalTests/active-controls/protected/pages/ActiveControlExpressionTag.php -text tests/FunctionalTests/active-controls/protected/pages/ActiveControlWithTinyMce.page -text tests/FunctionalTests/active-controls/protected/pages/ActiveControlWithTinyMce.php -text +tests/FunctionalTests/active-controls/protected/pages/ActiveDatePicker.page -text +tests/FunctionalTests/active-controls/protected/pages/ActiveDatePicker.php -text tests/FunctionalTests/active-controls/protected/pages/ActiveHiddenFieldTest.page -text tests/FunctionalTests/active-controls/protected/pages/ActiveHiddenFieldTest.php -text tests/FunctionalTests/active-controls/protected/pages/ActiveImageButtonTest.page -text @@ -2773,6 +2784,22 @@ tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonListTest. tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonListTest.php -text tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonTest.page -text tests/FunctionalTests/active-controls/protected/pages/ActiveRadioButtonTest.php -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAllowInputTest.page -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAllowInputTest.php -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAutoPostBackTest.page -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListAutoPostBackTest.php -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListCheckBoxesTest.page -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListCheckBoxesTest.php -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListEnabledTest.page -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListEnabledTest.php -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListHoverCaptionTest.page -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListHoverCaptionTest.php -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListRatingTest.page -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListRatingTest.php -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListReadOnlyTest.page -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListReadOnlyTest.php -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListSelectedIndexTest.page -text +tests/FunctionalTests/active-controls/protected/pages/ActiveRatingListSelectedIndexTest.php -text tests/FunctionalTests/active-controls/protected/pages/ActiveRedirectionTest.page -text tests/FunctionalTests/active-controls/protected/pages/ActiveRedirectionTest.php -text tests/FunctionalTests/active-controls/protected/pages/Callback.page -text @@ -2862,6 +2889,7 @@ tests/FunctionalTests/active-controls/tests/PostLoadingTestCase.php -text tests/FunctionalTests/active-controls/tests/ReplaceContentTestCase.php -text tests/FunctionalTests/active-controls/tests/TextBoxGroupValidationTestCase.php -text tests/FunctionalTests/active-controls/tests/ValueTriggerCallbackTestCase.php -text +tests/FunctionalTests/active-controlstests/ActiveRatingListTestCase.php -text tests/FunctionalTests/features.php -text tests/FunctionalTests/features/index.php -text tests/FunctionalTests/features/protected/application.xml -text @@ -3097,6 +3125,11 @@ tests/FunctionalTests/tickets/protected/pages/Ticket886.page -text tests/FunctionalTests/tickets/protected/pages/Ticket886.php -text tests/FunctionalTests/tickets/protected/pages/Ticket897.page -text tests/FunctionalTests/tickets/protected/pages/Ticket897.php -text +tests/FunctionalTests/tickets/protected/pages/Ticket900.page -text +tests/FunctionalTests/tickets/protected/pages/Ticket900.php -text +tests/FunctionalTests/tickets/protected/pages/Ticket922.page -text +tests/FunctionalTests/tickets/protected/pages/Ticket922.php -text +tests/FunctionalTests/tickets/protected/pages/Ticket925.page -text tests/FunctionalTests/tickets/protected/pages/Ticket93.page -text tests/FunctionalTests/tickets/protected/pages/Ticket93.php -text tests/FunctionalTests/tickets/protected/pages/ToggleTest.page -text @@ -3164,6 +3197,8 @@ tests/FunctionalTests/tickets/tests/Ticket823TestCase.php -text tests/FunctionalTests/tickets/tests/Ticket876TestCase.php -text tests/FunctionalTests/tickets/tests/Ticket886TestCase.php -text tests/FunctionalTests/tickets/tests/Ticket897TestCase.php -text +tests/FunctionalTests/tickets/tests/Ticket900TestCase.php -text +tests/FunctionalTests/tickets/tests/Ticket922TestCase.php -text tests/FunctionalTests/tickets/tests/Ticket93TestCase.php -text tests/FunctionalTests/validators.php -text tests/FunctionalTests/validators/index.php -text diff --git a/.gitignore b/.gitignore index de444e61..8f33048c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ +/.cache /.project +/.settings /assets buildscripts/chmbuilder/assets/* buildscripts/chmbuilder/classes/runtime/* diff --git a/HISTORY b/HISTORY index 7c515716..136366a7 100644 --- a/HISTORY +++ b/HISTORY @@ -1,33 +1,79 @@ -Version 3.1.3 To Be Released -============================ +Version 3.1.4 To be released +============================== +BUG: Issue#59 - TPropertyAccess::has() returns false even if the property of an object was found (Carl) +BUG: Issue#61 - TLogRouter throws exception when using external config file (Michael) +BUG: Issue#62 - Some mistyping: TJavascript or TJavaScript? (Carl) +BUG: Issue#79 - Missing new operator for Exception in TSqlMapObjectCollectionTree::onChildNodesVisited() (Christophe) +BUG: TActiveLinkButton and TActiveRadioButtonList crashes if it's the only active control imported. Added TActiveControlAdapter (Carl) +BUG: TUrlMapping encoded extra parameters twice (Michael) +ENH: Issue#36 - Refactored TRatingList/TActiveRatingList, and added some docs (Bradley) +ENH: Issue#52 - Upgraded to TinyMCE 3.2.1 +ENH: Issue#72 - Add wildcard support to TUrlMapping (friendly-urls) (Michael) +ENH: Issue#77 - TJsonService missing exception messages (Carl) +ENH: Issue#29 - Ability to specify position of popup TDatePicker/TActiveDatePicker (Carl) +ENH: Issue#75 - TApplication::setRuntimePath() to update uniqueID and cacheFile (Carl) +NEW: Issue#51 - Additional template tag (Carl) + +Version 3.1.3 November 1, 2008 +============================== +BUG: Ticket#595 - ControlCssClass not applied correctly if using multiple validators on same control (Michael) BUG: Ticket#834 - TDbCommandBuilder::applyOrdering(): Add support for function calls in ORDER BY clause (Knut) BUG: Ticket#836 - TRatingList downgrade (Christophe) BUG: Ticket#841 - Strange output from THttpResponse (Christophe) BUG: Ticket#847 - getBaseUrl sometimes fails (Christophe) BUG: Ticket#843 - TDataList alternatinItem issue after changes in rev 2227 (Christophe) +BUG: Ticket#845 - TCaptchaValidator with TCaptcha.CaseSensitive=false JS Error (Christophe) BUG: Ticket#849 - TDatePicker selecting current date problem (Christophe) BUG: Ticket#851 - TPropertyAccess doesn't get properties right if an object has a __call() method (Simon Lehmann, Knut) BUG: Ticket#855 - TActiveRecord: Make db-connection serializable in __sleep() function (Knut) +BUG: Ticket#856 - Assets PRADO_CHMOD constant missing in several places (Carl) BUG: Ticket#859 - errorhandler error (stever) BUG: Ticket#860 - Prado::localize() bug (japplegame) +BUG: Ticket#865 - TActiveLabels always get an id attribute (Michael) BUG: Ticket#870 - Callback with redirect breaks lifecycle of page (stever) BUG: Ticket#872 - use PATH_SEPARATOR in phpunit.php (fragmaster b) BUG: Ticket#886 - TSimpleDateFormatter: One month offset in time stamp with date pattern "yyyy" (Knut) BUG: Ticket#897 - TSimpleDateFormatter: If no YearPattern is set it should default to current year (Knut) BUG: Ticket#899 - TSqlCriteria: SQL-statements with limit and offset doesn't work (Knut) +BUG: Ticket#900 - TDataGrid with TRequireFieldValidator and TEditCommandColumn interaction error (Michael) BUG: Ticket#904 - TDbConnection: Add emulate prepares workaround for boolean compares (Knut) BUG: Ticket#908 - TDbCache::init / Exception (Knut) -ENH: Added Prado.Validation.validateControl(id) on client side to validate a specific control (Michael) -ENH: Added MessageSource_Database to I18N (uses TDbConnection) (Michael) +BUG: Ticket#922 - Problem with TUrlMapping and urlencoding (Michael) +BUG: Ticket#938 - TPageStateFormatter EnableStateEncryption causes massive page state (Michael) +BUG: Ticket#942 - MultiLine TInplaceTextBox (Christophe) +BUG: Issue#38 - TValidationSummary, works different when it's showing Javascript Validation than Server Validation (Carl) +CHG: Ticket#844 - Upgraded TinyMCE to 3.1.0.1 (Christophe) +CHG: Ticket#917 - TUrlMapping - change members to protected (Michael) +CHG: Ticket#919 - TUserManager loadUserData function (Michael) +CHG: Issue#39 - Implement validator not requiring ControlToValidate (Carl) +ENH: Workaround for slow meta data retrieval in MySQL<5.1.21 (Michael) +ENH: Ticket#756 - TDateFormat & TNumberFormat - allow settings default text when Value isn't set. (Carl) ENH: Ticket#823 - PromptText/PromptValue only populated if there is data (Knut) ENH: Ticket#876 - Assign empty string to CssUrl on TTabPanel to avoid loading extra css (GoDZilla, Knut) +ENH: Ticket#882 - Allow to escape # and $ in sqlmap (Michael) ENH: Ticket#890 - Minor optimization: Use $var===null over is_null($var) (Knut) ENH: Ticket#893 - Added page parameter to queryForPagedList() to specify the initial page to load (Michael) ENH: Ticket#896 - TTheme - enhance for subclassing (Knut) ENH: Ticket#898 - Minor optimization: Use (int) over intval() (Knut) +ENH: Ticket#813 - (Issue #13) TRegularExpressionValidator has new ClientSidePatternModifier property (Michael) +ENH: Ticket#809 - "LIMIT 1" for ActiveRecord find() and findBy() (Carl) +ENH: Ticket#848 - TCache "set" and "add" with empty values (Carl) +ENH: Ticket#822 - Not receiving emails from TEmailLogRoute (Carl) ENH: Ticket#901 - Using TDbDataReader directly as a DataSource of TDataBoundControl's like TDataGrid (Knut) ENH: Ticket#911 - prado-cli: Better error message if database connection fails when generating Active Record skeletons (Knut) -CHG: Ticket#844 - Upgraded TinyMCE to 3.1.0.1 (Christophe) +ENH: Ticket#913 - PRADO Copyright notice in HTML source (Carl) +ENH: Ticket#925 - TTimeTriggeredCallback update interval during callback (Brad, Christophe) +ENH: Ticket#941 - Add addRoute() method to TLogRouter (Michael) +ENH: Ticket#46 - TColorPicker - Output is missing alt tag (Carl) +ENH: Issue#32 - Implement ability to specify default service ID (Carl) +ENH: Issue#31 - Consider UTF MessageSource_XLIFF class file (Carl) +NEW: Added Prado.Validation.validateControl(id) on client side to validate a specific control (Michael) +NEW: Added MessageSource_Database to I18N (uses TDbConnection) (Michael) +NEW: Ticket#790 - Added TActiveFileUpload (Bradley, Christophe) +NEW: Ticket#935 - Added TActiveDatePicker (Bradley, Christophe) +NEW: Ticket#857 - Added Authentication expiration support to TAuthManager (Michael) +NEW: Ticket#853 - Added Drag and drop components (Christophe) +NEW: Ticket#891 - Added method that returns table name to TActiveRecord (Michael) Version 3.1.2 April 21, 2008 ============================ diff --git a/UPGRADE b/UPGRADE index 4fa19f8c..05fe6547 100644 --- a/UPGRADE +++ b/UPGRADE @@ -1,172 +1,181 @@ - - Upgrading Instructions for PRADO Framework v3.1.3 - ================================================= - -!!!IMPORTANT!!! - -The following upgrading instructions are cumulative. That is, -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.1.2 ---------------------- -- The Translation configuration now also accepts type 'Database' to - ease the setup of DB base translation. A valid ConnectionID has to - be supplied in the source parameter: - - Type 'MySQL' can still be used but is deprecated and might be removed - in a later release. -- TinyMCE (used by THtmlArea component) has been upgraded to version 3.1.0.1. - Since the 3.X branch of TinyMCE has a different API than 2.X, you should - upgrade your Customs Plugins if you use any. - See http://wiki.moxiecode.com/index.php/TinyMCE:Migration_guide for more information. - - -Upgrading from v3.1.1 ---------------------- -- The RELATIONS type declaration in Active Record classes for Many-to-Many using - an association table was change from "self::HAS_MANY" to "self::MANY_TO_MANY". - E.g. change - 'albums' => array(self::HAS_MANY, 'Artist', 'album_artists') - to - 'albums' => array(self::MANY_TO_MANY, 'Artist', 'album_artists') -- Active Record no longer automatically adds/removes/updates related objects. -- 'Raw' mode for TCheckboxList and TRadioButtonList (and their active counter parts) now render - a surrounding tag to allow client scripts to identify them with the ClientId. You may - have to check your CSS. - - -Upgrading from v3.1.0 ---------------------- -- The RELATIONS declaration in Acive Record classes is changed from - "protected static $RELATIONS" to "public static $RELATIONS". -- IFeedContentProvider adds a new method: getContentType(). This affects any - class implementing this interface. -- TUrlMapping now only uses the PATH_INFO part of URL for matching, and the matching - is for the whole PATH_INFO. -- IUserManager adds two new methods: getUserFromCookie() and saveUserToCookie(). - This affects classes that implements this interface and does not extend from - TUserManager. -- The order of application lifecycles is changed. The loadState and loadStateComplete - are moved to right after onBeginRequest. -- TDropDownList will be in an unselected state if no initial selection is specified. - That is, its SelectedIndex will be -1. Previously, the first item will be considered as selected. - -Upgrading from v3.1b --------------------- -- Comment tag (introduced in v3.1a) is changed to -- When TDataList.RepeatLayout is Raw, the items will render
instead of -- TActiveRecord finder methods will always return a new object instance (identity mapping was removed). -- TActiveRecord::findBySql() will return an object rather than an array -- TActiveRecord::findAllBySql() will return an array of objects. - -Upgrading from v3.1a ---------------------- -- The signature of TActiveRecord::finder() is changed. This affects - all TActiveRecord-descendant classes that override this method. - Please use the following code to override the method: - public static function finder($className=__CLASS__) - { - return parent::finder($className); - } - -- The way to specify the table name for an active record class is changed. - Previously, it used the static class member '_tablename'. - Now it uses class constant as follows: - class UserRecord extends TActiveRecord - { - const TABLE='users_table'; - } - -- Changed TActiveRatingList's javascript control class - name from "Prado.WebUI.TRatingList" to "Prado.WebUI.TActiveRatingList". - -- PRADO's javascript library locations moved from Web/Javascripts/xxx to Web/Javascripts/source/xxx - -- IPostBackDataHandler added a new method getDataChanged(). Any control - implementing this interface will be required to implement this new method. - -Upgrading from v3.0.x ---------------------- -- Validators ClientSide.OnSuccess becomes ClientSide.OnValidationSuccess, -- Validators ClientSide.OnError becomes ClientSide.OnValidationError, -- Validator OnSuccess event becomes OnValidationSuccess. -- Validator OnError event becomes OnValidationError. -- Content enclosed in is now parsed as normal template content. - Previously, it was not parsed and was rendered as is. - -Upgrading from v3.0.7 ---------------------- - -Upgrading from v3.0.6 ---------------------- - -Upgrading from v3.0.5 ---------------------- -- TRepeater does not render anymore for empty item template. -- constructUrl() now encodes ampersand by default. This should have minimal - impact on any existing PRADO applications, though. -- TDataGrid does not generate default table styles. This may affect - the appearance of existing PRADO applications that use TDataGrid. -- If TUrlMapping is used, you need to set the UrlManager property of - THttpRequest to the module ID of TUrlMapping. -- TJavascriptLogger toggle key is changed from ALT-D to ALT-J. - Use the ToggleKey property chanage to a different key. -- Javascript Library rico was REMOVED. - -Upgrading from v3.0.4 ---------------------- -- TFileUpload::saveAs() will return false instead of raising an exception - if it encounters any error. -- TDropDownListColumn.DataField is renamed to DataTextField and - DataFormatString is renamed to DataTextFormatString. - A new property named DataValueField is added. - -Upgrading from v3.0.3 ---------------------- -- The 'Static' value is changed to 'Fixed' for the Display property of - all validators as well as TValidationSummary, due to conflict with PHP keywords. -- The 'List' value is changed to 'SimpleList' for TValidationSummary.DisplayMode. -- The 'List' value is changed to 'DropDownList' for TPager.Mode -- This change affects existing client-side javascript handlers such as - - All ClientSide javascript event handlers (such as ClientSide.OnSuccess) - are by default wrapped within the function block. - function(sender, parameter){ // handler code } - You may override this behaviour by providing your own javascript statement block - as "javascript:MyHandlerFunction", e.g. ClientSide.OnSuccess="javascript:MyHandlerFunction" - or ClientSide.OnSuccess="javascript:function(validator,sender){ ... }" - - -Upgrading from v3.0.2 ---------------------- -- The minimum PHP version required is raised to 5.1.0 and above. - If your server is installed with a lower version of PHP, you will - have to upgrade it in order to run PRADO applications. -- The signature of TControl::broadcastEvent() is changed from - broadcastEvent($sender,TBroadCastEventParameter $param) to - broadcastEvent($name,$sender,$param). - This makes the call to broadcastEvent() to be consistent with raiseEvent(). - -Upgrading from v3.0.1 ---------------------- -- Postback enabled control will always disable default client-side browser action. - This is due to google toolbar's interference of event stopping scheme. - This modification should only affect user-derived postback javascripts. - -Upgrading from v3.0.0 ---------------------- -- URL format is modified when THttpRequest.UrlFormat=='Path'. - This modification affects both the URLs generated by calling constructUrl() - and the URLs understood by PRADO. In particular, PRADO now understands - the following URL format: - /index.php/ServiceID,ServiceParam/Name1,Value1/Name2,Value2/... - In v3.0.0, the above URL is written as: - /index.php/ServiceID/ServiceParam/Name1/Value1/Name2/Value2/... -- TControl::onBubbleEvent() has been changed to TControl::bubbleEvent(). - This change only affects user controls that override this method. - -Upgrading from v2.x and v1.x ----------------------------- -PRADO v3.x is not backward compatible with v2.x and v1.x. + + Upgrading Instructions for PRADO Framework v3.1.4 + ================================================= + +!!!IMPORTANT!!! + +The following upgrading instructions are cumulative. That is, +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.1.3 +--------------------- + + +Upgrading from v3.1.2 +--------------------- +- The Translation configuration now also accepts type 'Database' to + ease the setup of DB base translation. A valid ConnectionID has to + be supplied in the source parameter: + + Type 'MySQL' can still be used but is deprecated and might be removed + in a later release. +- TinyMCE (used by THtmlArea component) has been upgraded to version 3.1.0.1. + Since the 3.X branch of TinyMCE has a different API than 2.X, you should + upgrade your Customs Plugins if you use any. + See http://wiki.moxiecode.com/index.php/TinyMCE:Migration_guide for more information. +- If you use EnableStateEncryption, the PageState of your current user sessions + will no longer be valid, since we optimized the encryption/compression logic. +- You can now use # and $ characters in your SQL statements with SQLMap by + escaping them as ## and $$. That induces that you can't have consecutive + parameters like #param1##param2# or $param1$$param2$ in your statements anymore. + + +Upgrading from v3.1.1 +--------------------- +- The RELATIONS type declaration in Active Record classes for Many-to-Many using + an association table was change from "self::HAS_MANY" to "self::MANY_TO_MANY". + E.g. change + 'albums' => array(self::HAS_MANY, 'Artist', 'album_artists') + to + 'albums' => array(self::MANY_TO_MANY, 'Artist', 'album_artists') +- Active Record no longer automatically adds/removes/updates related objects. +- 'Raw' mode for TCheckboxList and TRadioButtonList (and their active counter parts) now render + a surrounding tag to allow client scripts to identify them with the ClientId. You may + have to check your CSS. + + +Upgrading from v3.1.0 +--------------------- +- The RELATIONS declaration in Acive Record classes is changed from + "protected static $RELATIONS" to "public static $RELATIONS". +- IFeedContentProvider adds a new method: getContentType(). This affects any + class implementing this interface. +- TUrlMapping now only uses the PATH_INFO part of URL for matching, and the matching + is for the whole PATH_INFO. +- IUserManager adds two new methods: getUserFromCookie() and saveUserToCookie(). + This affects classes that implements this interface and does not extend from + TUserManager. +- The order of application lifecycles is changed. The loadState and loadStateComplete + are moved to right after onBeginRequest. +- TDropDownList will be in an unselected state if no initial selection is specified. + That is, its SelectedIndex will be -1. Previously, the first item will be considered as selected. + +Upgrading from v3.1b +-------------------- +- Comment tag (introduced in v3.1a) is changed to +- When TDataList.RepeatLayout is Raw, the items will render
instead of +- TActiveRecord finder methods will always return a new object instance (identity mapping was removed). +- TActiveRecord::findBySql() will return an object rather than an array +- TActiveRecord::findAllBySql() will return an array of objects. + +Upgrading from v3.1a +--------------------- +- The signature of TActiveRecord::finder() is changed. This affects + all TActiveRecord-descendant classes that override this method. + Please use the following code to override the method: + public static function finder($className=__CLASS__) + { + return parent::finder($className); + } + +- The way to specify the table name for an active record class is changed. + Previously, it used the static class member '_tablename'. + Now it uses class constant as follows: + class UserRecord extends TActiveRecord + { + const TABLE='users_table'; + } + +- Changed TActiveRatingList's javascript control class + name from "Prado.WebUI.TRatingList" to "Prado.WebUI.TActiveRatingList". + +- PRADO's javascript library locations moved from Web/Javascripts/xxx to Web/Javascripts/source/xxx + +- IPostBackDataHandler added a new method getDataChanged(). Any control + implementing this interface will be required to implement this new method. + +Upgrading from v3.0.x +--------------------- +- Validators ClientSide.OnSuccess becomes ClientSide.OnValidationSuccess, +- Validators ClientSide.OnError becomes ClientSide.OnValidationError, +- Validator OnSuccess event becomes OnValidationSuccess. +- Validator OnError event becomes OnValidationError. +- Content enclosed in is now parsed as normal template content. + Previously, it was not parsed and was rendered as is. + +Upgrading from v3.0.7 +--------------------- + +Upgrading from v3.0.6 +--------------------- + +Upgrading from v3.0.5 +--------------------- +- TRepeater does not render anymore for empty item template. +- constructUrl() now encodes ampersand by default. This should have minimal + impact on any existing PRADO applications, though. +- TDataGrid does not generate default table styles. This may affect + the appearance of existing PRADO applications that use TDataGrid. +- If TUrlMapping is used, you need to set the UrlManager property of + THttpRequest to the module ID of TUrlMapping. +- TJavascriptLogger toggle key is changed from ALT-D to ALT-J. + Use the ToggleKey property chanage to a different key. +- Javascript Library rico was REMOVED. + +Upgrading from v3.0.4 +--------------------- +- TFileUpload::saveAs() will return false instead of raising an exception + if it encounters any error. +- TDropDownListColumn.DataField is renamed to DataTextField and + DataFormatString is renamed to DataTextFormatString. + A new property named DataValueField is added. + +Upgrading from v3.0.3 +--------------------- +- The 'Static' value is changed to 'Fixed' for the Display property of + all validators as well as TValidationSummary, due to conflict with PHP keywords. +- The 'List' value is changed to 'SimpleList' for TValidationSummary.DisplayMode. +- The 'List' value is changed to 'DropDownList' for TPager.Mode +- This change affects existing client-side javascript handlers such as + + All ClientSide javascript event handlers (such as ClientSide.OnSuccess) + are by default wrapped within the function block. + function(sender, parameter){ // handler code } + You may override this behaviour by providing your own javascript statement block + as "javascript:MyHandlerFunction", e.g. ClientSide.OnSuccess="javascript:MyHandlerFunction" + or ClientSide.OnSuccess="javascript:function(validator,sender){ ... }" + + +Upgrading from v3.0.2 +--------------------- +- The minimum PHP version required is raised to 5.1.0 and above. + If your server is installed with a lower version of PHP, you will + have to upgrade it in order to run PRADO applications. +- The signature of TControl::broadcastEvent() is changed from + broadcastEvent($sender,TBroadCastEventParameter $param) to + broadcastEvent($name,$sender,$param). + This makes the call to broadcastEvent() to be consistent with raiseEvent(). + +Upgrading from v3.0.1 +--------------------- +- Postback enabled control will always disable default client-side browser action. + This is due to google toolbar's interference of event stopping scheme. + This modification should only affect user-derived postback javascripts. + +Upgrading from v3.0.0 +--------------------- +- URL format is modified when THttpRequest.UrlFormat=='Path'. + This modification affects both the URLs generated by calling constructUrl() + and the URLs understood by PRADO. In particular, PRADO now understands + the following URL format: + /index.php/ServiceID,ServiceParam/Name1,Value1/Name2,Value2/... + In v3.0.0, the above URL is written as: + /index.php/ServiceID/ServiceParam/Name1/Value1/Name2/Value2/... +- TControl::onBubbleEvent() has been changed to TControl::bubbleEvent(). + This change only affects user controls that override this method. + +Upgrading from v2.x and v1.x +---------------------------- +PRADO v3.x is not backward compatible with v2.x and v1.x. diff --git a/demos/personal/protected/Pages/Settings.page b/demos/personal/protected/Pages/Settings.page index 48dfde96..f461fa13 100644 --- a/demos/personal/protected/Pages/Settings.page +++ b/demos/personal/protected/Pages/Settings.page @@ -1,4 +1,4 @@ - + Welcome, User->Name %> />! This page contains site settings accessible only to site admin. \ No newline at end of file diff --git a/demos/personal/protected/Pages/config.php b/demos/personal/protected/Pages/config.php index 7a6c9a6c..23cb184e 100644 --- a/demos/personal/protected/Pages/config.php +++ b/demos/personal/protected/Pages/config.php @@ -3,10 +3,8 @@ return array( 'authorization' => array( array( 'action' => 'deny', - 'properties' => array( - 'pages' => 'Settings', - 'users' => '?', - ), + 'pages' => 'Settings', + 'users' => '?', ), ), 'pages' => array( diff --git a/demos/personal/protected/application.php b/demos/personal/protected/application.php index 0d9cadd4..26100576 100644 --- a/demos/personal/protected/application.php +++ b/demos/personal/protected/application.php @@ -5,7 +5,7 @@ return array( 'mode' => 'Debug', ), 'paths' => array( - 'using'=>array('Application.common.*'), + 'using'=>array('Application.Common.*'), ), 'modules' => array( ), diff --git a/demos/quickstart/protected/pages/ActiveControls/DragDrop.page b/demos/quickstart/protected/pages/ActiveControls/DragDrop.page new file mode 100755 index 00000000..0969ddd0 --- /dev/null +++ b/demos/quickstart/protected/pages/ActiveControls/DragDrop.page @@ -0,0 +1,26 @@ + + +

TDropContainer

+ + +

TDropContainer represent an area where +TDraggable controls can be dropped. +When a TDraggable is dropped, a +callback request is initiated. The OnCallback event is raised +during a callback request and it is raised after +the OnDropk event. +

+ + +

TDraggable

+ + +

TDraggable will make its child controls 'draggable'. +When a TDraggable is dropped, a +callback request is initiated. The OnCallback event is raised +during a callback request and it is raised after +the OnDropk event. +

+ + +
$Id$
\ No newline at end of file diff --git a/demos/quickstart/protected/pages/ActiveControls/Home.page b/demos/quickstart/protected/pages/ActiveControls/Home.page index 5cf4ab17..49855980 100644 --- a/demos/quickstart/protected/pages/ActiveControls/Home.page +++ b/demos/quickstart/protected/pages/ActiveControls/Home.page @@ -160,6 +160,12 @@ TActiveButton control. See also the later part of the TValueTriggeredCallback monitors (using a timer) an attribute of an HTML element and triggers a callback request when the attribute value changes. + + +
  • + TDropContainer & TDraggable represents drag and drop containers. + The former will make its child controls "draggable" while the latter will raise a callback when a draggable + control is dropped on it.
  • @@ -310,7 +316,21 @@ if Javascript was disabled on the client's browser.

    TValueTriggeredCallback YesNo - + + + + TDropContainer + + YesNo + + + + TDraggable + + NoNo + + +

    Active Control Infrastructure Classes

    diff --git a/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/Home.page b/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/Home.page new file mode 100755 index 00000000..89d64110 --- /dev/null +++ b/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/Home.page @@ -0,0 +1,90 @@ + + +

    Drag & Drop demo !

    + +

    Product List :

    + +
    + + + + + Data['ProductImageUrl']%> /> + + + +
    +

    Your shopping cart :

    + + + + Your shopping cart is empty, please add some items ! + + + Data['ProductCount'] > 1)%> + > + Data['ProductImageUrl']%>/> + Data['ProductTitle']%>/> + + + + + +

    Remove Items from cart by dropping them here

    + +
    diff --git a/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/Home.php b/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/Home.php new file mode 100755 index 00000000..276ee6a4 --- /dev/null +++ b/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/Home.php @@ -0,0 +1,112 @@ +getIsPostBack() && !$this->getIsCallBack()) + { + + $this->populateProductList(); + $this->populateShoppingList(); + } + } + + private function getProductData () + { + return array ( + array ( + 'ProductId' => 'Product1', + 'ProductImageUrl' => $this->publishAsset('assets/product1.png'), + 'ProductTitle' => 'Cup' + ), + array ( + 'ProductId' => 'Product2', + 'ProductImageUrl' => $this->publishAsset('assets/product2.png'), + 'ProductTitle' => 'T-Shirt' + ) + ); + } + + private function getProduct ($key) + { + foreach ($this->getProductData() as $product) + if ($product['ProductId']==$key) return $product; + return null; + } + + protected function populateProductList () + { + $this->ProductList->DataSource=$this->getProductData(); + $this->ProductList->Databind(); + } + + protected function populateShoppingList () + { + $this->ShoppingList->DataSource=$this->getShoppingListData(); + $this->ShoppingList->Databind(); + + } + + + public function getShoppingListData () + { + return $this->getViewState('ShoppingList', array ()); + } + + public function setShoppingListData ($value) + { + $this->setViewState('ShoppingList', TPropertyValue::ensureArray($value), array ()); + } + + public function addItemToCart ($sender, $param) + { + $control=$param->getDroppedControl(); + // Get the Key from the repeater item + $item=$control->getNamingContainer(); + $key=$this->ProductList->getDataKeys()->itemAt($item->getItemIndex()); + $product=$this->getProduct($key); + $shoppingList=$this->getShoppingListData(); + if (isset ($shoppingList[$key])) + { + // Already an item of this type, increment counter + $shoppingList[$key]['ProductCount']++; + } + else + { + // Add an item to the shopping list + $shoppingList[$key]=$product; + $shoppingList[$key]['ProductCount']=1; + } + $this->setShoppingListData($shoppingList); + + } + + public function removeItemFromCart ($sender, $param) + { + $control=$param->getDroppedControl(); + $item=$control->getNamingContainer(); + $key=$this->ShoppingList->getDataKeys()->itemAt($item->getItemIndex()); + $shoppingList=$this->getShoppingListData(); + if (isset($shoppingList[$key])) + { + if ($shoppingList[$key]['ProductCount'] > 1) + $shoppingList[$key]['ProductCount'] --; + else + unset($shoppingList[$key]); + } + $this->setShoppingListData($shoppingList); + + } + + public function redrawCart ($sender, $param) + { + $this->populateShoppingList(); + $this->cart->render($param->NewWriter); + + } +} +?> \ No newline at end of file diff --git a/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/product1.png b/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/product1.png new file mode 100755 index 00000000..ae03d551 Binary files /dev/null and b/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/product1.png differ diff --git a/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/product2.png b/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/product2.png new file mode 100755 index 00000000..25e81ad7 Binary files /dev/null and b/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/product2.png differ diff --git a/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/trash.png b/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/trash.png new file mode 100755 index 00000000..184f7628 Binary files /dev/null and b/demos/quickstart/protected/pages/ActiveControls/Samples/DragDrop/assets/trash.png differ diff --git a/demos/quickstart/protected/pages/Configurations/Templates2.page b/demos/quickstart/protected/pages/Configurations/Templates2.page index e8442f1f..8a17c72c 100644 --- a/demos/quickstart/protected/pages/Configurations/Templates2.page +++ b/demos/quickstart/protected/pages/Configurations/Templates2.page @@ -96,4 +96,18 @@ Localization tags represent localized texts. They are in the following format, where string will be translated to different languages according to the end-user's language preference. Localization tags are in fact shortcuts to the function call Prado::localize(string).

    + + +

    URL Tags

    +

    +URL tags are used to insert the relative web url path to the Prado application in the template. You can use it in the following format: +

    + +<%/ image.jpg %> + +

    +

    +If your Prado application is deployed on http://localhost/pradoapp/, the tag above will produce "/pradoapp/image.jpg". This tag will help you to use the correct file path even with UrlFormat set to Path, or if you are using url mappings. +

    +
    $Id$
    \ No newline at end of file diff --git a/demos/quickstart/protected/pages/Configurations/UrlMapping.page b/demos/quickstart/protected/pages/Configurations/UrlMapping.page index 0837d50d..ec393012 100644 --- a/demos/quickstart/protected/pages/Configurations/UrlMapping.page +++ b/demos/quickstart/protected/pages/Configurations/UrlMapping.page @@ -124,4 +124,7 @@ A matching pattern is one whose ServiceID and ServiceParameter By default, TUrlMapping will construct URLs prefixed with the currently requesting PHP script path, such as /path/to/index.php/article/3. Users may change this behavior by explicitly specifying the URL prefix through its UrlPrefix property. For example, if the Web server configuration treats index.php as the default script, we can set UrlPrefix as /path/to and the constructed URL will look like /path/to/article/3.

    -
    $Id$
    \ No newline at end of file +
    Note: If you use constructUrl() with string parameters that contain slashes ("/") they will get encoded to %2F. By default most Apache installations give a "404 Not found" if a URL contains a %2F. You can add AllowEncodedSlashes On to your VirtualHost configuration to resolve this. (Available since Apache 2.0.46). +
    + +
    $Id$
    diff --git a/demos/quickstart/protected/pages/Database/ActiveRecord.page b/demos/quickstart/protected/pages/Database/ActiveRecord.page index 70998587..bc0df529 100644 --- a/demos/quickstart/protected/pages/Database/ActiveRecord.page +++ b/demos/quickstart/protected/pages/Database/ActiveRecord.page @@ -129,6 +129,19 @@ class UserRecord extends TActiveRecord You may specify qualified table names. E.g. for MySQL, TABLE = "`database1`.`table1`".
    +
    Note: +Since version 3.1.3 you can also use a method table() to define the table name. +This allows you to dynamically specify which table should be used by the ActiveRecord. + +class TeamRecord extends TActiveRecord +{ + public function table() { + return 'Teams'; + } +} + +
    +

    Since TActiveRecord extends TComponent, setter and getter methods can be defined to allow control over how variables @@ -1183,4 +1196,4 @@ instead of $userRecord->first_name. This helps separation of logic and -

    $Id$
    \ No newline at end of file +
    $Id$
    diff --git a/demos/quickstart/protected/pages/GettingStarted/NewFeatures.page b/demos/quickstart/protected/pages/GettingStarted/NewFeatures.page index 66e3111d..51dbb981 100644 --- a/demos/quickstart/protected/pages/GettingStarted/NewFeatures.page +++ b/demos/quickstart/protected/pages/GettingStarted/NewFeatures.page @@ -4,7 +4,13 @@

    This page summarizes the main new features that are introduced in each PRADO release. -

    +

    + +

    Version 3.1.3

    +

    Version 3.1.2

      diff --git a/framework/3rdParty/TinyMCE/tiny_mce.md5 b/framework/3rdParty/TinyMCE/tiny_mce.md5 index a5b8fc8e..bf138c10 100644 --- a/framework/3rdParty/TinyMCE/tiny_mce.md5 +++ b/framework/3rdParty/TinyMCE/tiny_mce.md5 @@ -1 +1 @@ -6f0b8991531854895cb4461d218023bd tiny_mce.tar +cf8b1ec3fc54577b1d834772ddecfc2e tiny_mce.tar diff --git a/framework/3rdParty/TinyMCE/tiny_mce.tar b/framework/3rdParty/TinyMCE/tiny_mce.tar index b4e9060d..beb06fb9 100644 Binary files a/framework/3rdParty/TinyMCE/tiny_mce.tar and b/framework/3rdParty/TinyMCE/tiny_mce.tar differ diff --git a/framework/Caching/TAPCCache.php b/framework/Caching/TAPCCache.php index 057d7585..5935e732 100644 --- a/framework/Caching/TAPCCache.php +++ b/framework/Caching/TAPCCache.php @@ -131,4 +131,3 @@ class TAPCCache extends TCache } } -?> diff --git a/framework/Caching/TCache.php b/framework/Caching/TCache.php index 27618e84..02a4ae3b 100644 --- a/framework/Caching/TCache.php +++ b/framework/Caching/TCache.php @@ -4,7 +4,7 @@ * * @author Qiang Xue * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Caching @@ -136,7 +136,8 @@ abstract class TCache extends TModule implements ICache, ArrayAccess /** * Stores a value identified by a key into cache. * If the cache already contains such a key, the existing value and - * expiration time will be replaced with the new ones. + * expiration time will be replaced with the new ones. If the value is + * empty, the cache key will be deleted. * * @param string the key identifying the value to be cached * @param mixed the value to be cached @@ -146,13 +147,18 @@ abstract class TCache extends TModule implements ICache, ArrayAccess */ public function set($id,$value,$expire=0,$dependency=null) { - $data=array($value,$dependency); - return $this->setValue($this->generateUniqueKey($id),serialize($data),$expire); + if(empty($value) && $expire === 0) + $this->delete($id); + else + { + $data=array($value,$dependency); + return $this->setValue($this->generateUniqueKey($id),serialize($data),$expire); + } } /** * Stores a value identified by a key into cache if the cache does not contain this key. - * Nothing will be done if the cache already contains the key. + * Nothing will be done if the cache already contains the key or if value is empty. * @param string the key identifying the value to be cached * @param mixed the value to be cached * @param integer the number of seconds in which the cached value will expire. 0 means never expire. @@ -161,6 +167,8 @@ abstract class TCache extends TModule implements ICache, ArrayAccess */ public function add($id,$value,$expire=0,$dependency=null) { + if(empty($value) && $expire === 0) + return false; $data=array($value,$dependency); return $this->addValue($this->generateUniqueKey($id),serialize($data),$expire); } @@ -710,4 +718,4 @@ class TCacheDependencyList extends TList } } -?> +?> diff --git a/framework/Caching/TMemCache.php b/framework/Caching/TMemCache.php index b6e9c7d8..0f0ac26d 100644 --- a/framework/Caching/TMemCache.php +++ b/framework/Caching/TMemCache.php @@ -307,4 +307,3 @@ class TMemCache extends TCache } } -?> diff --git a/framework/Caching/TSqliteCache.php b/framework/Caching/TSqliteCache.php index 4d41542c..ca8d2261 100644 --- a/framework/Caching/TSqliteCache.php +++ b/framework/Caching/TSqliteCache.php @@ -221,4 +221,3 @@ class TSqliteCache extends TCache } } -?> diff --git a/framework/Collections/TAttributeCollection.php b/framework/Collections/TAttributeCollection.php index 6b35d70e..93a48e1c 100644 --- a/framework/Collections/TAttributeCollection.php +++ b/framework/Collections/TAttributeCollection.php @@ -170,4 +170,3 @@ class TAttributeCollection extends TMap } } -?> diff --git a/framework/Collections/TDummyDataSource.php b/framework/Collections/TDummyDataSource.php index ef11b286..491c36c0 100644 --- a/framework/Collections/TDummyDataSource.php +++ b/framework/Collections/TDummyDataSource.php @@ -144,4 +144,3 @@ class TDummyDataSourceIterator implements Iterator } } -?> diff --git a/framework/Collections/TList.php b/framework/Collections/TList.php index 329e162f..50cbaf01 100644 --- a/framework/Collections/TList.php +++ b/framework/Collections/TList.php @@ -427,4 +427,3 @@ class TListIterator implements Iterator } } -?> diff --git a/framework/Collections/TMap.php b/framework/Collections/TMap.php index 42f57890..56748ea2 100644 --- a/framework/Collections/TMap.php +++ b/framework/Collections/TMap.php @@ -350,4 +350,3 @@ class TMapIterator implements Iterator return $this->_key!==false; } } -?> diff --git a/framework/Collections/TPagedDataSource.php b/framework/Collections/TPagedDataSource.php index 3db4882a..fcb17f53 100644 --- a/framework/Collections/TPagedDataSource.php +++ b/framework/Collections/TPagedDataSource.php @@ -444,4 +444,3 @@ class TPagedMapIterator implements Iterator } } -?> diff --git a/framework/Collections/TPagedList.php b/framework/Collections/TPagedList.php index a2a2aa14..50286aec 100644 --- a/framework/Collections/TPagedList.php +++ b/framework/Collections/TPagedList.php @@ -475,4 +475,3 @@ class TPagedListFetchDataEventParameter extends TEventParameter } } -?> diff --git a/framework/Collections/TQueue.php b/framework/Collections/TQueue.php index 856b12ff..d8b692d1 100644 --- a/framework/Collections/TQueue.php +++ b/framework/Collections/TQueue.php @@ -261,4 +261,3 @@ class TQueueIterator implements Iterator } } -?> diff --git a/framework/Collections/TStack.php b/framework/Collections/TStack.php index 58394a8a..0d3890b4 100644 --- a/framework/Collections/TStack.php +++ b/framework/Collections/TStack.php @@ -260,4 +260,3 @@ class TStackIterator implements Iterator } } -?> diff --git a/framework/Data/ActiveRecord/Exceptions/TActiveRecordException.php b/framework/Data/ActiveRecord/Exceptions/TActiveRecordException.php index be88f015..eaab5735 100644 --- a/framework/Data/ActiveRecord/Exceptions/TActiveRecordException.php +++ b/framework/Data/ActiveRecord/Exceptions/TActiveRecordException.php @@ -39,4 +39,3 @@ class TActiveRecordConfigurationException extends TActiveRecordException } -?> diff --git a/framework/Data/ActiveRecord/Exceptions/messages.txt b/framework/Data/ActiveRecord/Exceptions/messages.txt index fabfc1a4..0702c840 100644 --- a/framework/Data/ActiveRecord/Exceptions/messages.txt +++ b/framework/Data/ActiveRecord/Exceptions/messages.txt @@ -10,6 +10,7 @@ ar_primary_key_is_scalar = Primary key '{1}' in table '{0}' is NOT a composi ar_invalid_db_connection = Missing or invalid default database connection for ActiveRecord class '{0}', default connection is set by the DbConnection property of TActiveRecordManager. ar_mismatch_args_exception = ActiveRecord finder method '{0}' expects {1} parameters but found only {2} parameters instead. ar_invalid_tablename_property = Constant {0}::{1} must be a valid database table name. +ar_invalid_tablename_method = Method {0}::{1} must return a valid database table name. ar_value_must_not_be_null = Property '{0}::${2}' must not be null as defined by column '{2}' in table '{1}'. ar_missing_pk_values = Missing primary key values in forming IN(key1, key2, ...) for table '{0}'. ar_pk_value_count_mismatch = Composite key value count mismatch in forming IN( (key1, key2, ..), (key3, key4, ..)) for table '{0}'. @@ -21,4 +22,4 @@ ar_invalid_criteria = Invalid criteria object, must be a string or instanc ar_relations_undefined = Unable to determine Active Record relationships because static array property {0}::${1} is not defined. ar_undefined_relation_prop = Unable to find {1}::${2}['{0}'], Active Record relationship definition for property "{0}" not found in entries of {1}::${2}. ar_invalid_relationship = Invalid active record relationship. -ar_relations_missing_fk = Unable to find foreign key relationships in table '{0}' that corresponds to table '{1}'. \ No newline at end of file +ar_relations_missing_fk = Unable to find foreign key relationships in table '{0}' that corresponds to table '{1}'. diff --git a/framework/Data/ActiveRecord/Relations/TActiveRecordBelongsTo.php b/framework/Data/ActiveRecord/Relations/TActiveRecordBelongsTo.php index 9f8777e2..40936011 100644 --- a/framework/Data/ActiveRecord/Relations/TActiveRecordBelongsTo.php +++ b/framework/Data/ActiveRecord/Relations/TActiveRecordBelongsTo.php @@ -136,4 +136,3 @@ class TActiveRecordBelongsTo extends TActiveRecordRelation } } -?> diff --git a/framework/Data/ActiveRecord/Relations/TActiveRecordHasMany.php b/framework/Data/ActiveRecord/Relations/TActiveRecordHasMany.php index c66afa14..6f191b9f 100644 --- a/framework/Data/ActiveRecord/Relations/TActiveRecordHasMany.php +++ b/framework/Data/ActiveRecord/Relations/TActiveRecordHasMany.php @@ -119,4 +119,3 @@ class TActiveRecordHasMany extends TActiveRecordRelation } } -?> diff --git a/framework/Data/ActiveRecord/Relations/TActiveRecordHasManyAssociation.php b/framework/Data/ActiveRecord/Relations/TActiveRecordHasManyAssociation.php index 9b01d323..4c71f91c 100644 --- a/framework/Data/ActiveRecord/Relations/TActiveRecordHasManyAssociation.php +++ b/framework/Data/ActiveRecord/Relations/TActiveRecordHasManyAssociation.php @@ -374,4 +374,3 @@ class TActiveRecordHasManyAssociation extends TActiveRecordRelation return $data; } } -?> diff --git a/framework/Data/ActiveRecord/Relations/TActiveRecordHasOne.php b/framework/Data/ActiveRecord/Relations/TActiveRecordHasOne.php index 6e8d30de..b1aa7b91 100644 --- a/framework/Data/ActiveRecord/Relations/TActiveRecordHasOne.php +++ b/framework/Data/ActiveRecord/Relations/TActiveRecordHasOne.php @@ -143,4 +143,3 @@ class TActiveRecordHasOne extends TActiveRecordRelation } } -?> diff --git a/framework/Data/ActiveRecord/Relations/TActiveRecordRelation.php b/framework/Data/ActiveRecord/Relations/TActiveRecordRelation.php index 4044a5ce..a352cb07 100644 --- a/framework/Data/ActiveRecord/Relations/TActiveRecordRelation.php +++ b/framework/Data/ActiveRecord/Relations/TActiveRecordRelation.php @@ -247,4 +247,3 @@ abstract class TActiveRecordRelation } } -?> diff --git a/framework/Data/ActiveRecord/Relations/TActiveRecordRelationContext.php b/framework/Data/ActiveRecord/Relations/TActiveRecordRelationContext.php index 329007af..696bb5b1 100644 --- a/framework/Data/ActiveRecord/Relations/TActiveRecordRelationContext.php +++ b/framework/Data/ActiveRecord/Relations/TActiveRecordRelationContext.php @@ -228,4 +228,3 @@ class TActiveRecordRelationContext } } -?> diff --git a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TIbmScaffoldInput.php b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TIbmScaffoldInput.php index 05de2019..c8177d5e 100644 --- a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TIbmScaffoldInput.php +++ b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TIbmScaffoldInput.php @@ -49,4 +49,3 @@ class TIbmScaffoldInput extends TScaffoldInputCommon } } -?> diff --git a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TMssqlScaffoldInput.php b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TMssqlScaffoldInput.php index bca1bcb2..be495e98 100644 --- a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TMssqlScaffoldInput.php +++ b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TMssqlScaffoldInput.php @@ -51,4 +51,3 @@ class TMssqlScaffoldInput extends TScaffoldInputCommon } } -?> diff --git a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TMysqlScaffoldInput.php b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TMysqlScaffoldInput.php index a8ecdd13..c06e4113 100644 --- a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TMysqlScaffoldInput.php +++ b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TMysqlScaffoldInput.php @@ -81,4 +81,3 @@ class TMysqlScaffoldInput extends TScaffoldInputCommon } } -?> diff --git a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TPgsqlScaffoldInput.php b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TPgsqlScaffoldInput.php index 69b67e7f..cd244b27 100644 --- a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TPgsqlScaffoldInput.php +++ b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TPgsqlScaffoldInput.php @@ -52,4 +52,3 @@ class TPgsqlScaffoldInput extends TScaffoldInputCommon } } -?> diff --git a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TScaffoldInputBase.php b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TScaffoldInputBase.php index ad563f2f..d8db9c59 100644 --- a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TScaffoldInputBase.php +++ b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TScaffoldInputBase.php @@ -101,4 +101,3 @@ class TScaffoldInputBase } } -?> diff --git a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TScaffoldInputCommon.php b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TScaffoldInputCommon.php index 12f9bc25..d02bc9a0 100644 --- a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TScaffoldInputCommon.php +++ b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TScaffoldInputCommon.php @@ -307,4 +307,3 @@ class TScaffoldInputCommon extends TScaffoldInputBase } } -?> diff --git a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TSqliteScaffoldInput.php b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TSqliteScaffoldInput.php index c187e825..5f431067 100644 --- a/framework/Data/ActiveRecord/Scaffold/InputBuilder/TSqliteScaffoldInput.php +++ b/framework/Data/ActiveRecord/Scaffold/InputBuilder/TSqliteScaffoldInput.php @@ -97,4 +97,3 @@ class TSqliteScaffoldInput extends TScaffoldInputCommon } } -?> diff --git a/framework/Data/ActiveRecord/Scaffold/TScaffoldBase.php b/framework/Data/ActiveRecord/Scaffold/TScaffoldBase.php index 1e9b87e7..9c548308 100644 --- a/framework/Data/ActiveRecord/Scaffold/TScaffoldBase.php +++ b/framework/Data/ActiveRecord/Scaffold/TScaffoldBase.php @@ -204,4 +204,3 @@ abstract class TScaffoldBase extends TTemplateControl } } -?> diff --git a/framework/Data/ActiveRecord/Scaffold/TScaffoldEditView.php b/framework/Data/ActiveRecord/Scaffold/TScaffoldEditView.php index 1760b27d..b38b739f 100644 --- a/framework/Data/ActiveRecord/Scaffold/TScaffoldEditView.php +++ b/framework/Data/ActiveRecord/Scaffold/TScaffoldEditView.php @@ -307,4 +307,3 @@ interface IScaffoldEditRenderer extends IDataRenderer public function updateRecord($record); } -?> diff --git a/framework/Data/ActiveRecord/Scaffold/TScaffoldListView.php b/framework/Data/ActiveRecord/Scaffold/TScaffoldListView.php index 79ab40ab..6c28651a 100644 --- a/framework/Data/ActiveRecord/Scaffold/TScaffoldListView.php +++ b/framework/Data/ActiveRecord/Scaffold/TScaffoldListView.php @@ -304,4 +304,3 @@ class TScaffoldListView extends TScaffoldBase } } -?> diff --git a/framework/Data/ActiveRecord/Scaffold/TScaffoldSearch.php b/framework/Data/ActiveRecord/Scaffold/TScaffoldSearch.php index a7f58735..b1cd6cbc 100644 --- a/framework/Data/ActiveRecord/Scaffold/TScaffoldSearch.php +++ b/framework/Data/ActiveRecord/Scaffold/TScaffoldSearch.php @@ -148,4 +148,3 @@ class TScaffoldSearch extends TScaffoldBase } } -?> diff --git a/framework/Data/ActiveRecord/Scaffold/TScaffoldView.php b/framework/Data/ActiveRecord/Scaffold/TScaffoldView.php index 1ddba335..04420e9a 100644 --- a/framework/Data/ActiveRecord/Scaffold/TScaffoldView.php +++ b/framework/Data/ActiveRecord/Scaffold/TScaffoldView.php @@ -141,4 +141,3 @@ class TScaffoldView extends TScaffoldBase } } -?> diff --git a/framework/Data/ActiveRecord/TActiveRecord.php b/framework/Data/ActiveRecord/TActiveRecord.php index 370dd69a..fa134a9f 100644 --- a/framework/Data/ActiveRecord/TActiveRecord.php +++ b/framework/Data/ActiveRecord/TActiveRecord.php @@ -79,7 +79,7 @@ Prado::using('System.Data.ActiveRecord.Relations.TActiveRecordRelationContext'); * 'email_address'=>'email', * ); * public $username; - * pulbic $email; + * public $email; * } * * In the above, the 'users' table consists of 'user_id' and 'email_address' columns, @@ -129,6 +129,18 @@ Prado::using('System.Data.ActiveRecord.Relations.TActiveRecordRelationContext'); * } * * + * Since v3.1.3 you can also define a method that returns the table name. + * + * class UserRecord extends TActiveRecord + * { + * public function table() + * { + * return 'users'; + * } + * + * } + * + * * @author Wei Zhuo * @version $Id$ * @package System.Data.ActiveRecord @@ -317,6 +329,14 @@ abstract class TActiveRecord extends TComponent $this->_connection=$connection; } + /** + * @return TDbTableInfo the meta information of the table associated with this AR class. + */ + public function getRecordTableInfo() + { + return $this->getRecordGateway()->getRecordTableInfo($this); + } + /** * Compare two records using their primary key values (all column values if * table does not defined primary keys). The default uses simple == for @@ -329,7 +349,7 @@ abstract class TActiveRecord extends TComponent { if($record===null || get_class($this)!==get_class($record)) return false; - $tableInfo = $this->getRecordGateway()->getRecordTableInfo($this); + $tableInfo = $this->getRecordTableInfo(); $pks = $tableInfo->getPrimaryKeys(); $properties = count($pks) > 0 ? $pks : $tableInfo->getColumns()->getKeys(); $equals=true; @@ -378,7 +398,7 @@ abstract class TActiveRecord extends TComponent /** * @return TActiveRecordGateway record table gateway. */ - public static function getRecordGateway() + public function getRecordGateway() { return TActiveRecordManager::getInstance()->getRecordGateway(); } @@ -552,6 +572,7 @@ abstract class TActiveRecord extends TComponent { $args = func_num_args() > 1 ? array_slice(func_get_args(),1) : null; $criteria = $this->getRecordCriteria($criteria,$parameters, $args); + $criteria->setLimit(1); $data = $this->getRecordGateway()->findRecordsByCriteria($this,$criteria); return $this->populateObject($data); } @@ -629,6 +650,7 @@ abstract class TActiveRecord extends TComponent { $args = func_num_args() > 1 ? array_slice(func_get_args(),1) : null; $criteria = $this->getRecordCriteria($sql,$parameters, $args); + $criteria->setLimit(1); $data = $this->getRecordGateway()->findRecordBySql($this,$criteria); return $this->populateObject($data); } @@ -1000,4 +1022,3 @@ class TActiveRecordChangeEventParameter extends TEventParameter } } -?> diff --git a/framework/Data/ActiveRecord/TActiveRecordConfig.php b/framework/Data/ActiveRecord/TActiveRecordConfig.php index 4e21635e..63f05aef 100644 --- a/framework/Data/ActiveRecord/TActiveRecordConfig.php +++ b/framework/Data/ActiveRecord/TActiveRecordConfig.php @@ -105,4 +105,3 @@ class TActiveRecordConfig extends TDataSourceConfig } } -?> diff --git a/framework/Data/ActiveRecord/TActiveRecordCriteria.php b/framework/Data/ActiveRecord/TActiveRecordCriteria.php index eec6df04..41e8ad02 100644 --- a/framework/Data/ActiveRecord/TActiveRecordCriteria.php +++ b/framework/Data/ActiveRecord/TActiveRecordCriteria.php @@ -37,4 +37,3 @@ class TActiveRecordCriteria extends TSqlCriteria } -?> diff --git a/framework/Data/ActiveRecord/TActiveRecordGateway.php b/framework/Data/ActiveRecord/TActiveRecordGateway.php index 23104c00..6cce9eb9 100644 --- a/framework/Data/ActiveRecord/TActiveRecordGateway.php +++ b/framework/Data/ActiveRecord/TActiveRecordGateway.php @@ -1,414 +1,425 @@ - - * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft - * @license http://www.pradosoft.com/license/ - * @version $Id$ - * @package System.Data.ActiveRecord - */ - -/** - * TActiveRecordGateway excutes the SQL command queries and returns the data - * record as arrays (for most finder methods). - * - * @author Wei Zhuo - * @version $Id$ - * @package System.Data.ActiveRecord - * @since 3.1 - */ -class TActiveRecordGateway extends TComponent -{ - private $_manager; - private $_tables=array(); //table cache - private $_meta=array(); //meta data cache. - private $_commandBuilders=array(); - private $_currentRecord; - - /** - * Constant name for specifying optional table name in TActiveRecord. - */ - const TABLE_CONST='TABLE'; - - /** - * Record gateway constructor. - * @param TActiveRecordManager $manager - */ - public function __construct(TActiveRecordManager $manager) - { - $this->_manager=$manager; - } - - /** - * @return TActiveRecordManager record manager. - */ - protected function getManager() - { - return $this->_manager; - } - - /** - * Gets the table name from the 'TABLE' constant of the active record - * class if defined, otherwise use the class name as table name. - * @param TActiveRecord active record instance - * @return string table name for the given record class. - */ - protected function getRecordTableName(TActiveRecord $record) - { - $class = new ReflectionClass($record); - if($class->hasConstant(self::TABLE_CONST)) - { - $value = $class->getConstant(self::TABLE_CONST); - if(empty($value)) - throw new TActiveRecordException('ar_invalid_tablename_property', - get_class($record),self::TABLE_CONST); - return $value; - } - else - return strtolower(get_class($record)); - } - - /** - * Returns table information, trys the application cache first. - * @param TActiveRecord $record - * @return TDbTableInfo table information. - */ - public function getRecordTableInfo(TActiveRecord $record) - { - $tableName = $this->getRecordTableName($record); - return $this->getTableInfo($record->getDbConnection(), $tableName); - } - - /** - * Returns table information for table in the database connection. - * @param TDbConnection database connection - * @param string table name - * @return TDbTableInfo table details. - */ - public function getTableInfo(TDbConnection $connection, $tableName) - { - $connStr = $connection->getConnectionString(); - $key = $connStr.$tableName; - if(!isset($this->_tables[$key])) - { - //call this first to ensure that unserializing the cache - //will find the correct driver dependent classes. - if(!isset($this->_meta[$connStr])) - { - Prado::using('System.Data.Common.TDbMetaData'); - $this->_meta[$connStr] = TDbMetaData::getInstance($connection); - } - - $tableInfo = null; - if(($cache=$this->getManager()->getCache())!==null) - $tableInfo = $cache->get($key); - if(empty($tableInfo)) - { - $tableInfo = $this->_meta[$connStr]->getTableInfo($tableName); - if($cache!==null) - $cache->set($key, $tableInfo); - } - $this->_tables[$key] = $tableInfo; - } - return $this->_tables[$key]; - } - - /** - * @param TActiveRecord $record - * @return TDataGatewayCommand - */ - public function getCommand(TActiveRecord $record) - { - $conn = $record->getDbConnection(); - $connStr = $conn->getConnectionString(); - $tableInfo = $this->getRecordTableInfo($record); - if(!isset($this->_commandBuilders[$connStr])) - { - $builder = $tableInfo->createCommandBuilder($record->getDbConnection()); - Prado::using('System.Data.DataGateway.TDataGatewayCommand'); - $command = new TDataGatewayCommand($builder); - $command->OnCreateCommand[] = array($this, 'onCreateCommand'); - $command->OnExecuteCommand[] = array($this, 'onExecuteCommand'); - $this->_commandBuilders[$connStr] = $command; - - } - $this->_commandBuilders[$connStr]->getBuilder()->setTableInfo($tableInfo); - $this->_currentRecord=$record; - return $this->_commandBuilders[$connStr]; - } - - /** - * Raised when a command is prepared and parameter binding is completed. - * The parameter object is TDataGatewayEventParameter of which the - * {@link TDataGatewayEventParameter::getCommand Command} property can be - * inspected to obtain the sql query to be executed. - * This method also raises the OnCreateCommand event on the ActiveRecord - * object calling this gateway. - * @param TDataGatewayCommand originator $sender - * @param TDataGatewayEventParameter - */ - public function onCreateCommand($sender, $param) - { - $this->raiseEvent('OnCreateCommand', $this, $param); - if($this->_currentRecord!==null) - $this->_currentRecord->onCreateCommand($param); - } - - /** - * Raised when a command is executed and the result from the database was returned. - * The parameter object is TDataGatewayResultEventParameter of which the - * {@link TDataGatewayEventParameter::getResult Result} property contains - * the data return from the database. The data returned can be changed - * by setting the {@link TDataGatewayEventParameter::setResult Result} property. - * This method also raises the OnCreateCommand event on the ActiveRecord - * object calling this gateway. - * @param TDataGatewayCommand originator $sender - * @param TDataGatewayResultEventParameter - */ - public function onExecuteCommand($sender, $param) - { - $this->raiseEvent('OnExecuteCommand', $this, $param); - if($this->_currentRecord!==null) - $this->_currentRecord->onExecuteCommand($param); - } - - /** - * Returns record data matching the given primary key(s). If the table uses - * composite key, specify the name value pairs as an array. - * @param TActiveRecord active record instance. - * @param array primary name value pairs - * @return array record data - */ - public function findRecordByPK(TActiveRecord $record,$keys) - { - $command = $this->getCommand($record); - return $command->findByPk($keys); - } - - /** - * Returns records matching the list of given primary keys. - * @param TActiveRecord active record instance. - * @param array list of primary name value pairs - * @return array matching data. - */ - public function findRecordsByPks(TActiveRecord $record, $keys) - { - return $this->getCommand($record)->findAllByPk($keys); - } - - - /** - * Returns record data matching the given critera. If $iterator is true, it will - * return multiple rows as TDbDataReader otherwise it returns the first row data. - * @param TActiveRecord active record finder instance. - * @param TActiveRecordCriteria search criteria. - * @param boolean true to return multiple rows as iterator, false returns first row. - * @return mixed matching data. - */ - public function findRecordsByCriteria(TActiveRecord $record, $criteria, $iterator=false) - { - $command = $this->getCommand($record); - return $iterator ? $command->findAll($criteria) : $command->find($criteria); - } - - /** - * Return record data from sql query. - * @param TActiveRecord active record finder instance. - * @param TActiveRecordCriteria sql query - * @return array result. - */ - public function findRecordBySql(TActiveRecord $record, $criteria) - { - return $this->getCommand($record)->findBySql($criteria); - } - - /** - * Return record data from sql query. - * @param TActiveRecord active record finder instance. - * @param TActiveRecordCriteria sql query - * @return TDbDataReader result iterator. - */ - public function findRecordsBySql(TActiveRecord $record, $criteria) - { - return $this->getCommand($record)->findAllBySql($criteria); - } - - public function findRecordsByIndex(TActiveRecord $record, $criteria, $fields, $values) - { - return $this->getCommand($record)->findAllByIndex($criteria,$fields,$values); - } - - /** - * Returns the number of records that match the given criteria. - * @param TActiveRecord active record finder instance. - * @param TActiveRecordCriteria search criteria - * @return int number of records. - */ - public function countRecords(TActiveRecord $record, $criteria) - { - return $this->getCommand($record)->count($criteria); - } - - /** - * Insert a new record. - * @param TActiveRecord new record. - * @return int number of rows affected. - */ - public function insert(TActiveRecord $record) - { - //$this->updateAssociatedRecords($record,true); - $result = $this->getCommand($record)->insert($this->getInsertValues($record)); - if($result) - $this->updatePostInsert($record); - //$this->updateAssociatedRecords($record); - return $result; - } - - /** - * Sets the last insert ID to the corresponding property of the record if available. - * @param TActiveRecord record for insertion - */ - protected function updatePostInsert($record) - { - $command = $this->getCommand($record); - $tableInfo = $command->getTableInfo(); - foreach($tableInfo->getColumns() as $name => $column) - { - if($column->hasSequence()) - $record->setColumnValue($name,$command->getLastInsertID($column->getSequenceName())); - } - } - - /** - * @param TActiveRecord record - * @return array insert values. - */ - protected function getInsertValues(TActiveRecord $record) - { - $values=array(); - $tableInfo = $this->getCommand($record)->getTableInfo(); - foreach($tableInfo->getColumns() as $name=>$column) - { - if($column->getIsExcluded()) - continue; - $value = $record->getColumnValue($name); - if(!$column->getAllowNull() && $value===null && !$column->hasSequence()) - { - throw new TActiveRecordException( - 'ar_value_must_not_be_null', get_class($record), - $tableInfo->getTableFullName(), $name); - } - if($value!==null) - $values[$name] = $value; - } - return $values; - } - - /** - * Update the record. - * @param TActiveRecord dirty record. - * @return int number of rows affected. - */ - public function update(TActiveRecord $record) - { - //$this->updateAssociatedRecords($record,true); - list($data, $keys) = $this->getUpdateValues($record); - $result = $this->getCommand($record)->updateByPk($data, $keys); - //$this->updateAssociatedRecords($record); - return $result; - } - - protected function getUpdateValues(TActiveRecord $record) - { - $values=array(); - $tableInfo = $this->getCommand($record)->getTableInfo(); - $primary=array(); - foreach($tableInfo->getColumns() as $name=>$column) - { - if($column->getIsExcluded()) - continue; - $value = $record->getColumnValue($name); - if(!$column->getAllowNull() && $value===null) - { - throw new TActiveRecordException( - 'ar_value_must_not_be_null', get_class($record), - $tableInfo->getTableFullName(), $name); - } - if($column->getIsPrimaryKey()) - $primary[] = $value; - else - $values[$name] = $value; - } - return array($values,$primary); - } - - protected function updateAssociatedRecords(TActiveRecord $record,$updateBelongsTo=false) - { - $context = new TActiveRecordRelationContext($record); - return $context->updateAssociatedRecords($updateBelongsTo); - } - - /** - * Delete the record. - * @param TActiveRecord record to be deleted. - * @return int number of rows affected. - */ - public function delete(TActiveRecord $record) - { - return $this->getCommand($record)->deleteByPk($this->getPrimaryKeyValues($record)); - } - - protected function getPrimaryKeyValues(TActiveRecord $record) - { - $tableInfo = $this->getCommand($record)->getTableInfo(); - $primary=array(); - foreach($tableInfo->getColumns() as $name=>$column) - { - if($column->getIsPrimaryKey()) - $primary[$name] = $record->getColumnValue($name); - } - return $primary; - } - - /** - * Delete multiple records using primary keys. - * @param TActiveRecord finder instance. - * @return int number of rows deleted. - */ - public function deleteRecordsByPk(TActiveRecord $record, $keys) - { - return $this->getCommand($record)->deleteByPk($keys); - } - - /** - * Delete multiple records by criteria. - * @param TActiveRecord active record finder instance. - * @param TActiveRecordCriteria search criteria - * @return int number of records. - */ - public function deleteRecordsByCriteria(TActiveRecord $record, $criteria) - { - return $this->getCommand($record)->delete($criteria); - } - - /** - * Raise the corresponding command event, insert, update, delete or select. - * @param string command type - * @param TDbCommand sql command to be executed. - * @param TActiveRecord active record - * @param TActiveRecordCriteria data for the command. - */ - protected function raiseCommandEvent($event,$command,$record,$criteria) - { - if(!($criteria instanceof TSqlCriteria)) - $criteria = new TActiveRecordCriteria(null,$criteria); - $param = new TActiveRecordEventParameter($command,$record,$criteria); - $manager = $record->getRecordManager(); - $manager->{$event}($param); - $record->{$event}($param); - } -} - -?> + + * @link http://www.pradosoft.com/ + * @copyright Copyright © 2005-2008 PradoSoft + * @license http://www.pradosoft.com/license/ + * @version $Id$ + * @package System.Data.ActiveRecord + */ + +/** + * TActiveRecordGateway excutes the SQL command queries and returns the data + * record as arrays (for most finder methods). + * + * @author Wei Zhuo + * @version $Id$ + * @package System.Data.ActiveRecord + * @since 3.1 + */ +class TActiveRecordGateway extends TComponent +{ + private $_manager; + private $_tables=array(); //table cache + private $_meta=array(); //meta data cache. + private $_commandBuilders=array(); + private $_currentRecord; + + /** + * Constant name for specifying optional table name in TActiveRecord. + */ + const TABLE_CONST='TABLE'; + /** + * Method name for returning optional table name in in TActiveRecord + */ + const TABLE_METHOD='table'; + + /** + * Record gateway constructor. + * @param TActiveRecordManager $manager + */ + public function __construct(TActiveRecordManager $manager) + { + $this->_manager=$manager; + } + + /** + * @return TActiveRecordManager record manager. + */ + protected function getManager() + { + return $this->_manager; + } + + /** + * Gets the table name from the 'TABLE' constant of the active record + * class if defined, otherwise use the class name as table name. + * @param TActiveRecord active record instance + * @return string table name for the given record class. + */ + protected function getRecordTableName(TActiveRecord $record) + { + $class = new ReflectionClass($record); + if($class->hasConstant(self::TABLE_CONST)) + { + $value = $class->getConstant(self::TABLE_CONST); + if(empty($value)) + throw new TActiveRecordException('ar_invalid_tablename_property', + get_class($record),self::TABLE_CONST); + return $value; + } + elseif ($class->hasMethod(self::TABLE_METHOD)) + { + $value = $record->{self::TABLE_METHOD}(); + if(empty($value)) + throw new TActiveRecordException('ar_invalid_tablename_method', + get_class($record),self::TABLE_METHOD); + return $value; + } + else + return strtolower(get_class($record)); + } + + /** + * Returns table information, trys the application cache first. + * @param TActiveRecord $record + * @return TDbTableInfo table information. + */ + public function getRecordTableInfo(TActiveRecord $record) + { + $tableName = $this->getRecordTableName($record); + return $this->getTableInfo($record->getDbConnection(), $tableName); + } + + /** + * Returns table information for table in the database connection. + * @param TDbConnection database connection + * @param string table name + * @return TDbTableInfo table details. + */ + public function getTableInfo(TDbConnection $connection, $tableName) + { + $connStr = $connection->getConnectionString(); + $key = $connStr.$tableName; + if(!isset($this->_tables[$key])) + { + //call this first to ensure that unserializing the cache + //will find the correct driver dependent classes. + if(!isset($this->_meta[$connStr])) + { + Prado::using('System.Data.Common.TDbMetaData'); + $this->_meta[$connStr] = TDbMetaData::getInstance($connection); + } + + $tableInfo = null; + if(($cache=$this->getManager()->getCache())!==null) + $tableInfo = $cache->get($key); + if(empty($tableInfo)) + { + $tableInfo = $this->_meta[$connStr]->getTableInfo($tableName); + if($cache!==null) + $cache->set($key, $tableInfo); + } + $this->_tables[$key] = $tableInfo; + } + return $this->_tables[$key]; + } + + /** + * @param TActiveRecord $record + * @return TDataGatewayCommand + */ + public function getCommand(TActiveRecord $record) + { + $conn = $record->getDbConnection(); + $connStr = $conn->getConnectionString(); + $tableInfo = $this->getRecordTableInfo($record); + if(!isset($this->_commandBuilders[$connStr])) + { + $builder = $tableInfo->createCommandBuilder($record->getDbConnection()); + Prado::using('System.Data.DataGateway.TDataGatewayCommand'); + $command = new TDataGatewayCommand($builder); + $command->OnCreateCommand[] = array($this, 'onCreateCommand'); + $command->OnExecuteCommand[] = array($this, 'onExecuteCommand'); + $this->_commandBuilders[$connStr] = $command; + + } + $this->_commandBuilders[$connStr]->getBuilder()->setTableInfo($tableInfo); + $this->_currentRecord=$record; + return $this->_commandBuilders[$connStr]; + } + + /** + * Raised when a command is prepared and parameter binding is completed. + * The parameter object is TDataGatewayEventParameter of which the + * {@link TDataGatewayEventParameter::getCommand Command} property can be + * inspected to obtain the sql query to be executed. + * This method also raises the OnCreateCommand event on the ActiveRecord + * object calling this gateway. + * @param TDataGatewayCommand originator $sender + * @param TDataGatewayEventParameter + */ + public function onCreateCommand($sender, $param) + { + $this->raiseEvent('OnCreateCommand', $this, $param); + if($this->_currentRecord!==null) + $this->_currentRecord->onCreateCommand($param); + } + + /** + * Raised when a command is executed and the result from the database was returned. + * The parameter object is TDataGatewayResultEventParameter of which the + * {@link TDataGatewayEventParameter::getResult Result} property contains + * the data return from the database. The data returned can be changed + * by setting the {@link TDataGatewayEventParameter::setResult Result} property. + * This method also raises the OnCreateCommand event on the ActiveRecord + * object calling this gateway. + * @param TDataGatewayCommand originator $sender + * @param TDataGatewayResultEventParameter + */ + public function onExecuteCommand($sender, $param) + { + $this->raiseEvent('OnExecuteCommand', $this, $param); + if($this->_currentRecord!==null) + $this->_currentRecord->onExecuteCommand($param); + } + + /** + * Returns record data matching the given primary key(s). If the table uses + * composite key, specify the name value pairs as an array. + * @param TActiveRecord active record instance. + * @param array primary name value pairs + * @return array record data + */ + public function findRecordByPK(TActiveRecord $record,$keys) + { + $command = $this->getCommand($record); + return $command->findByPk($keys); + } + + /** + * Returns records matching the list of given primary keys. + * @param TActiveRecord active record instance. + * @param array list of primary name value pairs + * @return array matching data. + */ + public function findRecordsByPks(TActiveRecord $record, $keys) + { + return $this->getCommand($record)->findAllByPk($keys); + } + + + /** + * Returns record data matching the given critera. If $iterator is true, it will + * return multiple rows as TDbDataReader otherwise it returns the first row data. + * @param TActiveRecord active record finder instance. + * @param TActiveRecordCriteria search criteria. + * @param boolean true to return multiple rows as iterator, false returns first row. + * @return mixed matching data. + */ + public function findRecordsByCriteria(TActiveRecord $record, $criteria, $iterator=false) + { + $command = $this->getCommand($record); + return $iterator ? $command->findAll($criteria) : $command->find($criteria); + } + + /** + * Return record data from sql query. + * @param TActiveRecord active record finder instance. + * @param TActiveRecordCriteria sql query + * @return array result. + */ + public function findRecordBySql(TActiveRecord $record, $criteria) + { + return $this->getCommand($record)->findBySql($criteria); + } + + /** + * Return record data from sql query. + * @param TActiveRecord active record finder instance. + * @param TActiveRecordCriteria sql query + * @return TDbDataReader result iterator. + */ + public function findRecordsBySql(TActiveRecord $record, $criteria) + { + return $this->getCommand($record)->findAllBySql($criteria); + } + + public function findRecordsByIndex(TActiveRecord $record, $criteria, $fields, $values) + { + return $this->getCommand($record)->findAllByIndex($criteria,$fields,$values); + } + + /** + * Returns the number of records that match the given criteria. + * @param TActiveRecord active record finder instance. + * @param TActiveRecordCriteria search criteria + * @return int number of records. + */ + public function countRecords(TActiveRecord $record, $criteria) + { + return $this->getCommand($record)->count($criteria); + } + + /** + * Insert a new record. + * @param TActiveRecord new record. + * @return int number of rows affected. + */ + public function insert(TActiveRecord $record) + { + //$this->updateAssociatedRecords($record,true); + $result = $this->getCommand($record)->insert($this->getInsertValues($record)); + if($result) + $this->updatePostInsert($record); + //$this->updateAssociatedRecords($record); + return $result; + } + + /** + * Sets the last insert ID to the corresponding property of the record if available. + * @param TActiveRecord record for insertion + */ + protected function updatePostInsert($record) + { + $command = $this->getCommand($record); + $tableInfo = $command->getTableInfo(); + foreach($tableInfo->getColumns() as $name => $column) + { + if($column->hasSequence()) + $record->setColumnValue($name,$command->getLastInsertID($column->getSequenceName())); + } + } + + /** + * @param TActiveRecord record + * @return array insert values. + */ + protected function getInsertValues(TActiveRecord $record) + { + $values=array(); + $tableInfo = $this->getCommand($record)->getTableInfo(); + foreach($tableInfo->getColumns() as $name=>$column) + { + if($column->getIsExcluded()) + continue; + $value = $record->getColumnValue($name); + if(!$column->getAllowNull() && $value===null && !$column->hasSequence() && !$column->getDefaultValue()) + { + throw new TActiveRecordException( + 'ar_value_must_not_be_null', get_class($record), + $tableInfo->getTableFullName(), $name); + } + if($value!==null) + $values[$name] = $value; + } + return $values; + } + + /** + * Update the record. + * @param TActiveRecord dirty record. + * @return int number of rows affected. + */ + public function update(TActiveRecord $record) + { + //$this->updateAssociatedRecords($record,true); + list($data, $keys) = $this->getUpdateValues($record); + $result = $this->getCommand($record)->updateByPk($data, $keys); + //$this->updateAssociatedRecords($record); + return $result; + } + + protected function getUpdateValues(TActiveRecord $record) + { + $values=array(); + $tableInfo = $this->getCommand($record)->getTableInfo(); + $primary=array(); + foreach($tableInfo->getColumns() as $name=>$column) + { + if($column->getIsExcluded()) + continue; + $value = $record->getColumnValue($name); + if(!$column->getAllowNull() && $value===null) + { + throw new TActiveRecordException( + 'ar_value_must_not_be_null', get_class($record), + $tableInfo->getTableFullName(), $name); + } + if($column->getIsPrimaryKey()) + $primary[] = $value; + else + $values[$name] = $value; + } + return array($values,$primary); + } + + protected function updateAssociatedRecords(TActiveRecord $record,$updateBelongsTo=false) + { + $context = new TActiveRecordRelationContext($record); + return $context->updateAssociatedRecords($updateBelongsTo); + } + + /** + * Delete the record. + * @param TActiveRecord record to be deleted. + * @return int number of rows affected. + */ + public function delete(TActiveRecord $record) + { + return $this->getCommand($record)->deleteByPk($this->getPrimaryKeyValues($record)); + } + + protected function getPrimaryKeyValues(TActiveRecord $record) + { + $tableInfo = $this->getCommand($record)->getTableInfo(); + $primary=array(); + foreach($tableInfo->getColumns() as $name=>$column) + { + if($column->getIsPrimaryKey()) + $primary[$name] = $record->getColumnValue($name); + } + return $primary; + } + + /** + * Delete multiple records using primary keys. + * @param TActiveRecord finder instance. + * @return int number of rows deleted. + */ + public function deleteRecordsByPk(TActiveRecord $record, $keys) + { + return $this->getCommand($record)->deleteByPk($keys); + } + + /** + * Delete multiple records by criteria. + * @param TActiveRecord active record finder instance. + * @param TActiveRecordCriteria search criteria + * @return int number of records. + */ + public function deleteRecordsByCriteria(TActiveRecord $record, $criteria) + { + return $this->getCommand($record)->delete($criteria); + } + + /** + * Raise the corresponding command event, insert, update, delete or select. + * @param string command type + * @param TDbCommand sql command to be executed. + * @param TActiveRecord active record + * @param TActiveRecordCriteria data for the command. + */ + protected function raiseCommandEvent($event,$command,$record,$criteria) + { + if(!($criteria instanceof TSqlCriteria)) + $criteria = new TActiveRecordCriteria(null,$criteria); + $param = new TActiveRecordEventParameter($command,$record,$criteria); + $manager = $record->getRecordManager(); + $manager->{$event}($param); + $record->{$event}($param); + } +} + diff --git a/framework/Data/ActiveRecord/TActiveRecordManager.php b/framework/Data/ActiveRecord/TActiveRecordManager.php index ce14ac4d..9912e7ff 100644 --- a/framework/Data/ActiveRecord/TActiveRecordManager.php +++ b/framework/Data/ActiveRecord/TActiveRecordManager.php @@ -109,4 +109,3 @@ class TActiveRecordManager extends TComponent } -?> diff --git a/framework/Data/Common/IbmDb2/TIbmColumnMetaData.php b/framework/Data/Common/IbmDb2/TIbmColumnMetaData.php index ee87a374..3b7001ab 100644 --- a/framework/Data/Common/IbmDb2/TIbmColumnMetaData.php +++ b/framework/Data/Common/IbmDb2/TIbmColumnMetaData.php @@ -154,4 +154,3 @@ class TIbmColumnMetaData extends TComponent } -?> diff --git a/framework/Data/Common/IbmDb2/TIbmMetaData.php b/framework/Data/Common/IbmDb2/TIbmMetaData.php index 059ef2d5..496bb12f 100644 --- a/framework/Data/Common/IbmDb2/TIbmMetaData.php +++ b/framework/Data/Common/IbmDb2/TIbmMetaData.php @@ -110,4 +110,3 @@ class TIbmMetaData extends TDbMetaDataCommon } -?> diff --git a/framework/Data/Common/IbmDb2/TIbmMetaDataInspector.php b/framework/Data/Common/IbmDb2/TIbmMetaDataInspector.php index cfb4803d..a37fad6e 100644 --- a/framework/Data/Common/IbmDb2/TIbmMetaDataInspector.php +++ b/framework/Data/Common/IbmDb2/TIbmMetaDataInspector.php @@ -110,4 +110,3 @@ class TIbmMetaDataInspector extends TDbMetaDataInspector return new TIbmMetaData($table,$columns,$pks); } } -?> diff --git a/framework/Data/Common/Mssql/TMssqlCommandBuilder.php b/framework/Data/Common/Mssql/TMssqlCommandBuilder.php index 75d98198..1a0ad4ce 100644 --- a/framework/Data/Common/Mssql/TMssqlCommandBuilder.php +++ b/framework/Data/Common/Mssql/TMssqlCommandBuilder.php @@ -170,4 +170,3 @@ class TMssqlCommandBuilder extends TDbCommandBuilder } } -?> diff --git a/framework/Data/Common/Mssql/TMssqlMetaData.php b/framework/Data/Common/Mssql/TMssqlMetaData.php index faa94e69..8309e4ec 100644 --- a/framework/Data/Common/Mssql/TMssqlMetaData.php +++ b/framework/Data/Common/Mssql/TMssqlMetaData.php @@ -232,4 +232,3 @@ EOD; } } -?> diff --git a/framework/Data/Common/Mssql/TMssqlTableColumn.php b/framework/Data/Common/Mssql/TMssqlTableColumn.php index 5f41f429..8a291b52 100644 --- a/framework/Data/Common/Mssql/TMssqlTableColumn.php +++ b/framework/Data/Common/Mssql/TMssqlTableColumn.php @@ -62,4 +62,3 @@ class TMssqlTableColumn extends TDbTableColumn } } -?> diff --git a/framework/Data/Common/Mssql/TMssqlTableInfo.php b/framework/Data/Common/Mssql/TMssqlTableInfo.php index 3a2ae033..356c6f26 100644 --- a/framework/Data/Common/Mssql/TMssqlTableInfo.php +++ b/framework/Data/Common/Mssql/TMssqlTableInfo.php @@ -62,4 +62,3 @@ class TMssqlTableInfo extends TDbTableInfo } } -?> diff --git a/framework/Data/Common/Mysql/TMysqlCommandBuilder.php b/framework/Data/Common/Mysql/TMysqlCommandBuilder.php index b296a82d..3326851f 100644 --- a/framework/Data/Common/Mysql/TMysqlCommandBuilder.php +++ b/framework/Data/Common/Mysql/TMysqlCommandBuilder.php @@ -24,4 +24,3 @@ class TMysqlCommandBuilder extends TDbCommandBuilder { } -?> diff --git a/framework/Data/Common/Mysql/TMysqlMetaData.php b/framework/Data/Common/Mysql/TMysqlMetaData.php index aaebd8dc..75f7a7cf 100644 --- a/framework/Data/Common/Mysql/TMysqlMetaData.php +++ b/framework/Data/Common/Mysql/TMysqlMetaData.php @@ -246,7 +246,9 @@ class TMysqlMetaData extends TDbMetaData if($row['Key_name']==='PRIMARY') $primary[] = $row['Column_name']; } - if($this->getServerVersion() > 5) + // MySQL version was increased to >=5.1.21 instead of 5.x + // due to a MySQL bug (http://bugs.mysql.com/bug.php?id=19588) + if($this->getServerVersion() >= 5.121) $foreign = $this->getForeignConstraints($schemaName,$tableName); else $foreign = $this->findForeignConstraints($schemaName,$tableName); @@ -352,4 +354,3 @@ EOD; } } -?> diff --git a/framework/Data/Common/Mysql/TMysqlTableColumn.php b/framework/Data/Common/Mysql/TMysqlTableColumn.php index 99b4333a..5f4351a7 100644 --- a/framework/Data/Common/Mysql/TMysqlTableColumn.php +++ b/framework/Data/Common/Mysql/TMysqlTableColumn.php @@ -70,4 +70,3 @@ class TMysqlTableColumn extends TDbTableColumn } } -?> diff --git a/framework/Data/Common/Pgsql/TPgsqlCommandBuilder.php b/framework/Data/Common/Pgsql/TPgsqlCommandBuilder.php index 460da46a..4cae8b89 100644 --- a/framework/Data/Common/Pgsql/TPgsqlCommandBuilder.php +++ b/framework/Data/Common/Pgsql/TPgsqlCommandBuilder.php @@ -67,4 +67,3 @@ class TPgsqlCommandBuilder extends TDbCommandBuilder } -?> diff --git a/framework/Data/Common/Pgsql/TPgsqlMetaData.php b/framework/Data/Common/Pgsql/TPgsqlMetaData.php index 45d55086..a2243531 100644 --- a/framework/Data/Common/Pgsql/TPgsqlMetaData.php +++ b/framework/Data/Common/Pgsql/TPgsqlMetaData.php @@ -390,4 +390,3 @@ EOD; } } -?> diff --git a/framework/Data/Common/Pgsql/TPgsqlTableColumn.php b/framework/Data/Common/Pgsql/TPgsqlTableColumn.php index 7ec2312a..562e2c56 100644 --- a/framework/Data/Common/Pgsql/TPgsqlTableColumn.php +++ b/framework/Data/Common/Pgsql/TPgsqlTableColumn.php @@ -47,4 +47,3 @@ class TPgsqlTableColumn extends TDbTableColumn } } -?> diff --git a/framework/Data/Common/Pgsql/TPgsqlTableInfo.php b/framework/Data/Common/Pgsql/TPgsqlTableInfo.php index 2a3a8461..2447c141 100644 --- a/framework/Data/Common/Pgsql/TPgsqlTableInfo.php +++ b/framework/Data/Common/Pgsql/TPgsqlTableInfo.php @@ -56,4 +56,3 @@ class TPgsqlTableInfo extends TDbTableInfo } } -?> diff --git a/framework/Data/Common/Sqlite/TSqliteCommandBuilder.php b/framework/Data/Common/Sqlite/TSqliteCommandBuilder.php index c02ed76d..c60e17a3 100644 --- a/framework/Data/Common/Sqlite/TSqliteCommandBuilder.php +++ b/framework/Data/Common/Sqlite/TSqliteCommandBuilder.php @@ -45,4 +45,3 @@ class TSqliteCommandBuilder extends TDbCommandBuilder } } -?> diff --git a/framework/Data/Common/Sqlite/TSqliteMetaData.php b/framework/Data/Common/Sqlite/TSqliteMetaData.php index c562c930..010a2148 100644 --- a/framework/Data/Common/Sqlite/TSqliteMetaData.php +++ b/framework/Data/Common/Sqlite/TSqliteMetaData.php @@ -178,4 +178,3 @@ CREATE TABLE bar ); */ -?> diff --git a/framework/Data/Common/Sqlite/TSqliteTableColumn.php b/framework/Data/Common/Sqlite/TSqliteTableColumn.php index 3c9100ab..4e79de6d 100644 --- a/framework/Data/Common/Sqlite/TSqliteTableColumn.php +++ b/framework/Data/Common/Sqlite/TSqliteTableColumn.php @@ -62,4 +62,3 @@ class TSqliteTableColumn extends TDbTableColumn } } -?> diff --git a/framework/Data/Common/Sqlite/TSqliteTableInfo.php b/framework/Data/Common/Sqlite/TSqliteTableInfo.php index 95c3fe02..b729a593 100644 --- a/framework/Data/Common/Sqlite/TSqliteTableInfo.php +++ b/framework/Data/Common/Sqlite/TSqliteTableInfo.php @@ -45,4 +45,3 @@ class TSqliteTableInfo extends TDbTableInfo } } -?> diff --git a/framework/Data/Common/TDbMetaData.php b/framework/Data/Common/TDbMetaData.php index c0f10d41..bcdf0e46 100644 --- a/framework/Data/Common/TDbMetaData.php +++ b/framework/Data/Common/TDbMetaData.php @@ -121,4 +121,3 @@ abstract class TDbMetaData extends TComponent } } -?> diff --git a/framework/Data/Common/TDbTableColumn.php b/framework/Data/Common/TDbTableColumn.php index b3d603ae..3bb9454b 100644 --- a/framework/Data/Common/TDbTableColumn.php +++ b/framework/Data/Common/TDbTableColumn.php @@ -197,4 +197,3 @@ class TDbTableColumn extends TComponent } } -?> diff --git a/framework/Data/Common/TDbTableInfo.php b/framework/Data/Common/TDbTableInfo.php index 87af2234..e2aae3d0 100644 --- a/framework/Data/Common/TDbTableInfo.php +++ b/framework/Data/Common/TDbTableInfo.php @@ -156,4 +156,3 @@ class TDbTableInfo extends TComponent } } -?> diff --git a/framework/Data/DataGateway/TTableGateway.php b/framework/Data/DataGateway/TTableGateway.php index 0f2644be..163efcf5 100644 --- a/framework/Data/DataGateway/TTableGateway.php +++ b/framework/Data/DataGateway/TTableGateway.php @@ -474,4 +474,3 @@ class TTableGateway extends TComponent } } -?> diff --git a/framework/Data/SqlMap/Configuration/TDiscriminator.php b/framework/Data/SqlMap/Configuration/TDiscriminator.php index 75ce2352..747c4158 100644 --- a/framework/Data/SqlMap/Configuration/TDiscriminator.php +++ b/framework/Data/SqlMap/Configuration/TDiscriminator.php @@ -230,4 +230,3 @@ class TSubMap extends TComponent } } -?> diff --git a/framework/Data/SqlMap/Configuration/TInlineParameterMapParser.php b/framework/Data/SqlMap/Configuration/TInlineParameterMapParser.php index d29d5f27..2e8f38d6 100644 --- a/framework/Data/SqlMap/Configuration/TInlineParameterMapParser.php +++ b/framework/Data/SqlMap/Configuration/TInlineParameterMapParser.php @@ -27,7 +27,7 @@ class TInlineParameterMapParser /** * Regular expression for parsing inline parameter maps. */ - const PARAMETER_TOKEN_REGEXP = '/#(#?[^#]+#?)#/'; + const PARAMETER_TOKEN_REGEXP = '/#([^#]+)#/'; /** * Parse the sql text for inline parameters. @@ -77,4 +77,3 @@ class TInlineParameterMapParser } } -?> diff --git a/framework/Data/SqlMap/Configuration/TParameterMap.php b/framework/Data/SqlMap/Configuration/TParameterMap.php index 117c6037..f4fbbe1c 100644 --- a/framework/Data/SqlMap/Configuration/TParameterMap.php +++ b/framework/Data/SqlMap/Configuration/TParameterMap.php @@ -205,4 +205,3 @@ class TParameterMap extends TComponent return $value; } } -?> diff --git a/framework/Data/SqlMap/Configuration/TParameterProperty.php b/framework/Data/SqlMap/Configuration/TParameterProperty.php index d0af3a75..dcea754c 100644 --- a/framework/Data/SqlMap/Configuration/TParameterProperty.php +++ b/framework/Data/SqlMap/Configuration/TParameterProperty.php @@ -136,4 +136,3 @@ class TParameterProperty extends TComponent } } -?> diff --git a/framework/Data/SqlMap/Configuration/TResultMap.php b/framework/Data/SqlMap/Configuration/TResultMap.php index 168041d2..d59d9522 100644 --- a/framework/Data/SqlMap/Configuration/TResultMap.php +++ b/framework/Data/SqlMap/Configuration/TResultMap.php @@ -198,4 +198,3 @@ class TResultMap extends TComponent } } -?> diff --git a/framework/Data/SqlMap/Configuration/TResultProperty.php b/framework/Data/SqlMap/Configuration/TResultProperty.php index 711fa7a0..8e20d5e4 100644 --- a/framework/Data/SqlMap/Configuration/TResultProperty.php +++ b/framework/Data/SqlMap/Configuration/TResultProperty.php @@ -326,4 +326,3 @@ class TResultProperty extends TComponent } } -?> diff --git a/framework/Data/SqlMap/Configuration/TSimpleDynamicParser.php b/framework/Data/SqlMap/Configuration/TSimpleDynamicParser.php index 6df8cefd..9a9b1277 100644 --- a/framework/Data/SqlMap/Configuration/TSimpleDynamicParser.php +++ b/framework/Data/SqlMap/Configuration/TSimpleDynamicParser.php @@ -43,4 +43,3 @@ class TSimpleDynamicParser } } -?> diff --git a/framework/Data/SqlMap/Configuration/TSqlMapCacheModel.php b/framework/Data/SqlMap/Configuration/TSqlMapCacheModel.php index edb78ea7..d7984dc4 100644 --- a/framework/Data/SqlMap/Configuration/TSqlMapCacheModel.php +++ b/framework/Data/SqlMap/Configuration/TSqlMapCacheModel.php @@ -214,4 +214,3 @@ class TSqlMapCacheKey } } -?> diff --git a/framework/Data/SqlMap/Configuration/TSqlMapStatement.php b/framework/Data/SqlMap/Configuration/TSqlMapStatement.php index 77b714fd..3afcc75f 100644 --- a/framework/Data/SqlMap/Configuration/TSqlMapStatement.php +++ b/framework/Data/SqlMap/Configuration/TSqlMapStatement.php @@ -428,4 +428,3 @@ class TSqlMapSelectKey extends TSqlMapStatement } } -?> diff --git a/framework/Data/SqlMap/Configuration/TSqlMapXmlConfiguration.php b/framework/Data/SqlMap/Configuration/TSqlMapXmlConfiguration.php index d0c57d57..f2d13966 100644 --- a/framework/Data/SqlMap/Configuration/TSqlMapXmlConfiguration.php +++ b/framework/Data/SqlMap/Configuration/TSqlMapXmlConfiguration.php @@ -309,6 +309,16 @@ class TSqlMapXmlMappingConfiguration extends TSqlMapXmlConfigBuilder private $_FlushOnExecuteStatements=array(); + /** + * Regular expressions for escaping simple/inline parameter symbols + */ + const SIMPLE_MARK='$'; + const INLINE_SYMBOL='#'; + const ESCAPED_SIMPLE_MARK_REGEXP='/\$\$/'; + const ESCAPED_INLINE_SYMBOL_REGEXP='/\#\#/'; + const SIMPLE_PLACEHOLDER='`!!`'; + const INLINE_PLACEHOLDER='`!!!`'; + /** * @param TSqlMapXmlConfiguration parent xml configuration. */ @@ -532,6 +542,7 @@ class TSqlMapXmlMappingConfiguration extends TSqlMapXmlConfigBuilder $scope['file'] = $this->_configFile; $scope['node'] = $node; + $sqlStatement=preg_replace(self::ESCAPED_INLINE_SYMBOL_REGEXP,self::INLINE_PLACEHOLDER,$sqlStatement); if($statement->parameterMap() === null) { // Build a Parametermap with the inline parameters. @@ -548,6 +559,7 @@ class TSqlMapXmlMappingConfiguration extends TSqlMapXmlConfigBuilder } $sqlStatement = $sqlText['sql']; } + $sqlStatement=preg_replace('/'.self::INLINE_PLACEHOLDER.'/',self::INLINE_SYMBOL,$sqlStatement); $this->prepareSql($statement, $sqlStatement, $node); } @@ -562,6 +574,7 @@ class TSqlMapXmlMappingConfiguration extends TSqlMapXmlConfigBuilder protected function prepareSql($statement,$sqlStatement, $node) { $simpleDynamic = new TSimpleDynamicParser; + $sqlStatement=preg_replace(self::ESCAPED_SIMPLE_MARK_REGEXP,self::SIMPLE_PLACEHOLDER,$sqlStatement); $dynamics = $simpleDynamic->parse($sqlStatement); if(count($dynamics['parameters']) > 0) { @@ -570,6 +583,7 @@ class TSqlMapXmlMappingConfiguration extends TSqlMapXmlConfigBuilder } else $sql = new TStaticSql(); + $sqlStatement=preg_replace('/'.self::SIMPLE_PLACEHOLDER.'/',self::SIMPLE_MARK,$sqlStatement); $sql->buildPreparedStatement($statement, $sqlStatement); $statement->setSqlText($sql); } @@ -724,4 +738,3 @@ class TSqlMapXmlMappingConfiguration extends TSqlMapXmlConfigBuilder } } -?> diff --git a/framework/Data/SqlMap/DataMapper/TLazyLoadList.php b/framework/Data/SqlMap/DataMapper/TLazyLoadList.php index 02b08e8e..69b20bf6 100644 --- a/framework/Data/SqlMap/DataMapper/TLazyLoadList.php +++ b/framework/Data/SqlMap/DataMapper/TLazyLoadList.php @@ -142,4 +142,3 @@ class TObjectProxy } } -?> diff --git a/framework/Data/SqlMap/DataMapper/TPropertyAccess.php b/framework/Data/SqlMap/DataMapper/TPropertyAccess.php index 23e854ac..a27cb50f 100644 --- a/framework/Data/SqlMap/DataMapper/TPropertyAccess.php +++ b/framework/Data/SqlMap/DataMapper/TPropertyAccess.php @@ -106,7 +106,8 @@ class TPropertyAccess $object = $object->{$getter}(); else if(in_array($prop, array_keys(get_object_vars($object)))) $object = $object->{$prop}; - return false; + else + return false; } else return false; diff --git a/framework/Data/SqlMap/DataMapper/TSqlMapCache.php b/framework/Data/SqlMap/DataMapper/TSqlMapCache.php index 61c5bb95..05b72e08 100644 --- a/framework/Data/SqlMap/DataMapper/TSqlMapCache.php +++ b/framework/Data/SqlMap/DataMapper/TSqlMapCache.php @@ -225,4 +225,3 @@ class TSqlMapApplicationCache implements ICache } } -?> diff --git a/framework/Data/SqlMap/DataMapper/TSqlMapException.php b/framework/Data/SqlMap/DataMapper/TSqlMapException.php index 69a0b0cd..0bf0ac32 100644 --- a/framework/Data/SqlMap/DataMapper/TSqlMapException.php +++ b/framework/Data/SqlMap/DataMapper/TSqlMapException.php @@ -113,4 +113,3 @@ class TSqlMapExecutionException extends TSqlMapException { } -?> diff --git a/framework/Data/SqlMap/DataMapper/TSqlMapPagedList.php b/framework/Data/SqlMap/DataMapper/TSqlMapPagedList.php index b3a88653..86171c1e 100644 --- a/framework/Data/SqlMap/DataMapper/TSqlMapPagedList.php +++ b/framework/Data/SqlMap/DataMapper/TSqlMapPagedList.php @@ -206,4 +206,3 @@ class TSqlMapPagedList extends TPagedList } } -?> diff --git a/framework/Data/SqlMap/DataMapper/TSqlMapTypeHandlerRegistry.php b/framework/Data/SqlMap/DataMapper/TSqlMapTypeHandlerRegistry.php index aa39dce1..05866395 100644 --- a/framework/Data/SqlMap/DataMapper/TSqlMapTypeHandlerRegistry.php +++ b/framework/Data/SqlMap/DataMapper/TSqlMapTypeHandlerRegistry.php @@ -190,4 +190,3 @@ abstract class TSqlMapTypeHandler extends TComponent public abstract function createNewInstance($row=null); } -?> diff --git a/framework/Data/SqlMap/Statements/IMappedStatement.php b/framework/Data/SqlMap/Statements/IMappedStatement.php index 94189420..dc628c9e 100644 --- a/framework/Data/SqlMap/Statements/IMappedStatement.php +++ b/framework/Data/SqlMap/Statements/IMappedStatement.php @@ -80,4 +80,3 @@ interface IMappedStatement public function executeQueryForObject($connection,$parameter, $result=null); } -?> diff --git a/framework/Data/SqlMap/Statements/TCachingStatement.php b/framework/Data/SqlMap/Statements/TCachingStatement.php index 7c9498d4..c8a748c1 100644 --- a/framework/Data/SqlMap/Statements/TCachingStatement.php +++ b/framework/Data/SqlMap/Statements/TCachingStatement.php @@ -106,4 +106,3 @@ class TCachingStatement implements IMappedStatement } } -?> diff --git a/framework/Data/SqlMap/Statements/TDeleteMappedStatement.php b/framework/Data/SqlMap/Statements/TDeleteMappedStatement.php index bb95cab9..1a3d738a 100644 --- a/framework/Data/SqlMap/Statements/TDeleteMappedStatement.php +++ b/framework/Data/SqlMap/Statements/TDeleteMappedStatement.php @@ -22,4 +22,3 @@ class TDeleteMappedStatement extends TUpdateMappedStatement { } -?> diff --git a/framework/Data/SqlMap/Statements/TInsertMappedStatement.php b/framework/Data/SqlMap/Statements/TInsertMappedStatement.php index 28ade045..1efb5b6b 100644 --- a/framework/Data/SqlMap/Statements/TInsertMappedStatement.php +++ b/framework/Data/SqlMap/Statements/TInsertMappedStatement.php @@ -47,4 +47,3 @@ class TInsertMappedStatement extends TMappedStatement } } -?> diff --git a/framework/Data/SqlMap/Statements/TMappedStatement.php b/framework/Data/SqlMap/Statements/TMappedStatement.php index 2feeba90..6a9130fe 100644 --- a/framework/Data/SqlMap/Statements/TMappedStatement.php +++ b/framework/Data/SqlMap/Statements/TMappedStatement.php @@ -4,7 +4,7 @@ * * @author Wei Zhuo * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Data.SqlMap.Statements @@ -561,7 +561,7 @@ class TMappedStatement extends TComponent implements IMappedStatement else $obj = $this->fillDefaultResultMap(null, $row, $resultObject); if(class_exists('TActiveRecord',false) && $obj instanceof TActiveRecord) - //Create a new clean active record. + //Create a new clean active record. $obj=TActiveRecord::createRecord(get_class($obj),$obj); return $obj; } @@ -1115,7 +1115,7 @@ class TSqlMapObjectCollectionTree else if(is_array($list)) $list[] = $this->_entries[$node]['object']; else - throw TSqlMapExecutionException( + throw new TSqlMapExecutionException( 'sqlmap_property_must_be_list'); } @@ -1216,4 +1216,3 @@ class TResultSetMapItemParameter extends TComponent } } -?> diff --git a/framework/Data/SqlMap/Statements/TPreparedCommand.php b/framework/Data/SqlMap/Statements/TPreparedCommand.php index 76407190..99bb6eff 100644 --- a/framework/Data/SqlMap/Statements/TPreparedCommand.php +++ b/framework/Data/SqlMap/Statements/TPreparedCommand.php @@ -58,4 +58,3 @@ class TPreparedCommand } } -?> diff --git a/framework/Data/SqlMap/Statements/TPreparedStatement.php b/framework/Data/SqlMap/Statements/TPreparedStatement.php index be005e81..7d862378 100644 --- a/framework/Data/SqlMap/Statements/TPreparedStatement.php +++ b/framework/Data/SqlMap/Statements/TPreparedStatement.php @@ -41,4 +41,3 @@ class TPreparedStatement extends TComponent } -?> diff --git a/framework/Data/SqlMap/Statements/TPreparedStatementFactory.php b/framework/Data/SqlMap/Statements/TPreparedStatementFactory.php index 5c3e2f22..44603408 100644 --- a/framework/Data/SqlMap/Statements/TPreparedStatementFactory.php +++ b/framework/Data/SqlMap/Statements/TPreparedStatementFactory.php @@ -47,4 +47,3 @@ class TPreparedStatementFactory } } -?> diff --git a/framework/Data/SqlMap/Statements/TSelectMappedStatement.php b/framework/Data/SqlMap/Statements/TSelectMappedStatement.php index a8253536..1802db2f 100644 --- a/framework/Data/SqlMap/Statements/TSelectMappedStatement.php +++ b/framework/Data/SqlMap/Statements/TSelectMappedStatement.php @@ -34,4 +34,3 @@ class TSelectMappedStatement extends TMappedStatement } -?> diff --git a/framework/Data/SqlMap/Statements/TSimpleDynamicSql.php b/framework/Data/SqlMap/Statements/TSimpleDynamicSql.php index 38554778..910fd659 100644 --- a/framework/Data/SqlMap/Statements/TSimpleDynamicSql.php +++ b/framework/Data/SqlMap/Statements/TSimpleDynamicSql.php @@ -47,4 +47,3 @@ class TSimpleDynamicSql extends TStaticSql } } -?> diff --git a/framework/Data/SqlMap/Statements/TStaticSql.php b/framework/Data/SqlMap/Statements/TStaticSql.php index 8f4687df..eba54ed7 100644 --- a/framework/Data/SqlMap/Statements/TStaticSql.php +++ b/framework/Data/SqlMap/Statements/TStaticSql.php @@ -34,4 +34,3 @@ class TStaticSql extends TComponent } } -?> diff --git a/framework/Data/SqlMap/Statements/TUpdateMappedStatement.php b/framework/Data/SqlMap/Statements/TUpdateMappedStatement.php index c0aa798e..633ec797 100644 --- a/framework/Data/SqlMap/Statements/TUpdateMappedStatement.php +++ b/framework/Data/SqlMap/Statements/TUpdateMappedStatement.php @@ -47,4 +47,3 @@ class TUpdateMappedStatement extends TMappedStatement } } -?> diff --git a/framework/Data/SqlMap/TSqlMapConfig.php b/framework/Data/SqlMap/TSqlMapConfig.php index 5a779dda..98f2a844 100644 --- a/framework/Data/SqlMap/TSqlMapConfig.php +++ b/framework/Data/SqlMap/TSqlMapConfig.php @@ -162,4 +162,3 @@ class TSqlMapConfig extends TDataSourceConfig } } -?> diff --git a/framework/Data/SqlMap/TSqlMapGateway.php b/framework/Data/SqlMap/TSqlMapGateway.php index dd7c2069..97b31b50 100644 --- a/framework/Data/SqlMap/TSqlMapGateway.php +++ b/framework/Data/SqlMap/TSqlMapGateway.php @@ -259,4 +259,3 @@ class TSqlMapGateway extends TComponent } } -?> diff --git a/framework/Data/SqlMap/TSqlMapManager.php b/framework/Data/SqlMap/TSqlMapManager.php index 62c2de20..290050d1 100644 --- a/framework/Data/SqlMap/TSqlMapManager.php +++ b/framework/Data/SqlMap/TSqlMapManager.php @@ -258,4 +258,3 @@ class TSqlMapManager extends TComponent } } -?> diff --git a/framework/Data/TDataSourceConfig.php b/framework/Data/TDataSourceConfig.php index 804ea848..9e6bb2fc 100644 --- a/framework/Data/TDataSourceConfig.php +++ b/framework/Data/TDataSourceConfig.php @@ -165,5 +165,3 @@ class TDataSourceConfig extends TModule throw new TConfigurationException('datasource_dbconnection_invalid',$id); } } - -?> diff --git a/framework/Data/TDbCommand.php b/framework/Data/TDbCommand.php index c48e7ded..d09c53f4 100644 --- a/framework/Data/TDbCommand.php +++ b/framework/Data/TDbCommand.php @@ -305,4 +305,3 @@ class TDbCommand extends TComponent } } -?> diff --git a/framework/Data/TDbConnection.php b/framework/Data/TDbConnection.php index 5489c7fd..259ca7b7 100644 --- a/framework/Data/TDbConnection.php +++ b/framework/Data/TDbConnection.php @@ -167,9 +167,11 @@ class TDbConnection extends TComponent try { $this->_pdo=new PDO($this->getConnectionString(),$this->getUsername(), - $this->getPassword(),$this->_attributes); + $this->getPassword(),$this->_attributes); + // This attribute is only useful for PDO::MySql driver. + // Ignore the warning if a driver doesn't understand this. + @$this->_pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); $this->_pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - $this->_pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); $this->_active=true; $this->setConnectionCharset(); } diff --git a/framework/Data/TDbDataReader.php b/framework/Data/TDbDataReader.php index 65fc363d..7b54414e 100644 --- a/framework/Data/TDbDataReader.php +++ b/framework/Data/TDbDataReader.php @@ -223,4 +223,3 @@ class TDbDataReader extends TComponent implements Iterator } } -?> diff --git a/framework/Data/TDbTransaction.php b/framework/Data/TDbTransaction.php index 5a19cacf..60b14a55 100644 --- a/framework/Data/TDbTransaction.php +++ b/framework/Data/TDbTransaction.php @@ -110,4 +110,3 @@ class TDbTransaction extends TComponent } } -?> diff --git a/framework/Exceptions/TErrorHandler.php b/framework/Exceptions/TErrorHandler.php index 589e841c..fa8e6d4a 100644 --- a/framework/Exceptions/TErrorHandler.php +++ b/framework/Exceptions/TErrorHandler.php @@ -362,4 +362,3 @@ class TErrorHandler extends TModule } } -?> diff --git a/framework/Exceptions/TException.php b/framework/Exceptions/TException.php index 4173a04e..c6a87b4d 100644 --- a/framework/Exceptions/TException.php +++ b/framework/Exceptions/TException.php @@ -417,4 +417,3 @@ class THttpException extends TSystemException } } -?> diff --git a/framework/Exceptions/messages/messages.txt b/framework/Exceptions/messages/messages.txt index 3edd5d49..fc2b63f1 100644 --- a/framework/Exceptions/messages/messages.txt +++ b/framework/Exceptions/messages/messages.txt @@ -408,6 +408,11 @@ soapservice_serverid_duplicated = SOAP server ID '{0}' is duplicated. soapserver_id_invalid = Invalid SOAP server ID '{0}'. It should not end with '.wsdl'. soapserver_version_invalid = Invalid SOAP version '{0}'. It must be either '1.1' or '1.2'. +jsonservice_id_required = TJsonService requires 'id' attribute in its JSON elements. +jsonservice_response_type_invalid = JSON class {0} is invalid. It should be TJsonResponse or extend from TJsonResponse. +jsonservice_class_required = TJsonService requires 'class' attribute in its JSON elements. +jsonservice_provider_unknown = Unknown JSON provider '{0}' requested. + dbusermanager_userclass_required = TDbUserManager.UserClass is required. dbusermanager_userclass_invalid = TDbUserManager.UserClass '{0}' is not a valid user class. The class must extend TDbUser. dbusermanager_connectionid_invalid = TDbUserManager.ConnectionID '{0}' does not point to a valid TDataSourceConfig module. @@ -466,3 +471,5 @@ datasource_dbconnection_invalid = TDataSourceConfig.DbConnection '{0}' is inva response_status_reason_missing = HTTP 1.1 need reason for extended status-codes response_status_reason_badchars = For HTTP 1.1 header, the token status-reason must not contain token CR or LF + +activefileupload_temppath_invalid = TActiveFileUpload TempPath path '{0}' does not exist or is not writable by Web server process. diff --git a/framework/I18N/TDateFormat.php b/framework/I18N/TDateFormat.php index 2343011e..914131bd 100644 --- a/framework/I18N/TDateFormat.php +++ b/framework/I18N/TDateFormat.php @@ -4,7 +4,7 @@ * * @author Wei Zhuo * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.I18N @@ -51,6 +51,9 @@ Prado::using('System.I18N.TI18NControl'); * 'fulldate', 'longdate', 'mediumdate', 'shortdate', 'fulltime', * 'longtime', 'mediumtime', and 'shorttime'. Custom patterns can specified * when the Pattern property does not match the predefined patterns. + * - DefaultText, string, + *
      Gets or sets the default text. If Value is not set, DefaultText will be + * shown instead of todays date and time. * * @author Xiang Wei Zhuo * @version v1.0, last update on Sat Dec 11 15:25:11 EST 2004 @@ -146,7 +149,11 @@ class TDateFormat extends TI18NControl implements IDataRenderer { $value = $this->getViewState('Value',''); if(empty($value)) - return time(); + { + $defaultText = $this->getDefaultText(); + if(empty($defaultText)) + return time(); + } return $value; } @@ -158,6 +165,24 @@ class TDateFormat extends TI18NControl implements IDataRenderer { $this->setViewState('Value',$value,''); } + + /** + * Get the default text value for this control. + * @return string default text value + */ + public function getDefaultText() + { + return $this->getViewState('DefaultText',''); + } + + /** + * Set the default text value for this control. + * @param string default text value + */ + public function setDefaultText($value) + { + $this->setViewState('DefaultText',$value,''); + } /** * Get the date-time value for this control. @@ -193,6 +218,11 @@ class TDateFormat extends TI18NControl implements IDataRenderer */ protected function getFormattedDate() { + $value = $this->getValue(); + $defaultText = $this->getDefaultText(); + if(empty($value) && !empty($defaultText)) + return $this->getDefaultText(); + $app = $this->getApplication()->getGlobalization(); //initialized the default class wide formatter @@ -205,12 +235,12 @@ class TDateFormat extends TI18NControl implements IDataRenderer if(strlen($culture) && $app->getCulture() !== $culture) { $formatter = new DateFormat($culture); - return $formatter->format($this->getValue(), + return $formatter->format($value, $this->getPattern(), $this->getCharset()); } //return the application wide culture formatted date time. - $result = self::$formatter->format($this->getValue(), + $result = self::$formatter->format($value, $this->getPattern(), $this->getCharset()); return $result; @@ -221,5 +251,4 @@ class TDateFormat extends TI18NControl implements IDataRenderer $writer->write($this->getFormattedDate()); } -} -?> +} \ No newline at end of file diff --git a/framework/I18N/TGlobalizationAutoDetect.php b/framework/I18N/TGlobalizationAutoDetect.php index b4611910..a77ea861 100644 --- a/framework/I18N/TGlobalizationAutoDetect.php +++ b/framework/I18N/TGlobalizationAutoDetect.php @@ -47,4 +47,3 @@ class TGlobalizationAutoDetect extends TGlobalization } } -?> diff --git a/framework/I18N/TI18NControl.php b/framework/I18N/TI18NControl.php index 9060ee77..ac3246fe 100644 --- a/framework/I18N/TI18NControl.php +++ b/framework/I18N/TI18NControl.php @@ -88,4 +88,3 @@ class TI18NControl extends TControl } } -?> diff --git a/framework/I18N/TNumberFormat.php b/framework/I18N/TNumberFormat.php index 12422521..62b43243 100644 --- a/framework/I18N/TNumberFormat.php +++ b/framework/I18N/TNumberFormat.php @@ -4,7 +4,7 @@ * * @author Wei Zhuo * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.I18N @@ -56,6 +56,9 @@ Prado::using('System.I18N.TI18NControl'); * The default is 'USD' if the Currency property is not specified. * - Pattern, string, *
      Gets or sets the custom number formatting pattern. + * - DefaultText, string, + *
      Gets or sets the default text. If Value is not set, DefaultText will be + * shown instead of the default currency Value/Pattern. * * @author Xiang Wei Zhuo * @version v1.0, last update on Sat Dec 11 17:49:56 EST 2004 @@ -105,6 +108,23 @@ class TNumberFormat extends TI18NControl implements IDataRenderer $this->setViewState('Value',$value,''); } + /** + * Get the default text value for this control. + * @return string default text value + */ + public function getDefaultText() + { + return $this->getViewState('DefaultText',''); + } + + /** + * Set the default text value for this control. + * @param string default text value + */ + public function setDefaultText($value) + { + $this->setViewState('DefaultText',$value,''); + } /** * Get the numberic value for this control. @@ -193,6 +213,11 @@ class TNumberFormat extends TI18NControl implements IDataRenderer */ protected function getFormattedValue() { + $value = $this->getValue(); + $defaultText = $this->getDefaultText(); + if(empty($value) && !empty($defaultText)) + return $this->getDefaultText(); + $app = $this->getApplication()->getGlobalization(); //initialized the default class wide formatter if(is_null(self::$formatter)) @@ -223,4 +248,4 @@ class TNumberFormat extends TI18NControl implements IDataRenderer } } -?> +?> diff --git a/framework/I18N/TTranslate.php b/framework/I18N/TTranslate.php index c3b28c79..2f1e0633 100644 --- a/framework/I18N/TTranslate.php +++ b/framework/I18N/TTranslate.php @@ -254,4 +254,3 @@ class TTranslate extends TI18NControl } } -?> diff --git a/framework/I18N/TTranslateParameter.php b/framework/I18N/TTranslateParameter.php index 2b32b27b..37443133 100644 --- a/framework/I18N/TTranslateParameter.php +++ b/framework/I18N/TTranslateParameter.php @@ -117,4 +117,3 @@ class TTranslateParameter extends TControl } } -?> diff --git a/framework/I18N/Translation.php b/framework/I18N/Translation.php index cb90577f..a0fa504d 100644 --- a/framework/I18N/Translation.php +++ b/framework/I18N/Translation.php @@ -106,4 +106,3 @@ class Translation extends TComponent } } -?> diff --git a/framework/I18N/core/CultureInfo.php b/framework/I18N/core/CultureInfo.php index 46b833b7..7ee50bba 100644 --- a/framework/I18N/core/CultureInfo.php +++ b/framework/I18N/core/CultureInfo.php @@ -630,4 +630,3 @@ class CultureInfo } } -?> diff --git a/framework/I18N/core/DateTimeFormatInfo.php b/framework/I18N/core/DateTimeFormatInfo.php index 0a99082d..aebd094a 100644 --- a/framework/I18N/core/DateTimeFormatInfo.php +++ b/framework/I18N/core/DateTimeFormatInfo.php @@ -514,4 +514,3 @@ class DateTimeFormatInfo } } -?> diff --git a/framework/I18N/core/Gettext/MO.php b/framework/I18N/core/Gettext/MO.php index 2a85598a..2a97aee7 100644 --- a/framework/I18N/core/Gettext/MO.php +++ b/framework/I18N/core/Gettext/MO.php @@ -353,4 +353,3 @@ class TGettext_MO extends TGettext return true; } } -?> diff --git a/framework/I18N/core/Gettext/PO.php b/framework/I18N/core/Gettext/PO.php index edadbf9a..54fe10e3 100644 --- a/framework/I18N/core/Gettext/PO.php +++ b/framework/I18N/core/Gettext/PO.php @@ -158,4 +158,3 @@ class TGettext_PO extends TGettext return true; } } -?> diff --git a/framework/I18N/core/Gettext/TGettext.php b/framework/I18N/core/Gettext/TGettext.php index ea35154b..39e5d07e 100644 --- a/framework/I18N/core/Gettext/TGettext.php +++ b/framework/I18N/core/Gettext/TGettext.php @@ -284,4 +284,3 @@ class TGettext return $PO; } } -?> diff --git a/framework/I18N/core/HTTPNegotiator.php b/framework/I18N/core/HTTPNegotiator.php index f76efbe2..9199ba15 100644 --- a/framework/I18N/core/HTTPNegotiator.php +++ b/framework/I18N/core/HTTPNegotiator.php @@ -127,4 +127,3 @@ class HTTPNegotiator } } -?> diff --git a/framework/I18N/core/IMessageSource.php b/framework/I18N/core/IMessageSource.php index eb0e5a1a..1d40bd73 100644 --- a/framework/I18N/core/IMessageSource.php +++ b/framework/I18N/core/IMessageSource.php @@ -120,4 +120,3 @@ interface IMessageSource } -?> diff --git a/framework/I18N/core/MessageFormat.php b/framework/I18N/core/MessageFormat.php index 21cf5f23..7af6deb1 100644 --- a/framework/I18N/core/MessageFormat.php +++ b/framework/I18N/core/MessageFormat.php @@ -253,4 +253,3 @@ class MessageFormat } } -?> diff --git a/framework/I18N/core/MessageSource_XLIFF.php b/framework/I18N/core/MessageSource_XLIFF.php index f962e9a1..4c101bf0 100644 --- a/framework/I18N/core/MessageSource_XLIFF.php +++ b/framework/I18N/core/MessageSource_XLIFF.php @@ -502,7 +502,7 @@ class MessageSource_XLIFF extends MessageSource { $date = @date('c'); $xml = << + diff --git a/framework/I18N/core/NumberFormatInfo.php b/framework/I18N/core/NumberFormatInfo.php index 136a20eb..17149317 100644 --- a/framework/I18N/core/NumberFormatInfo.php +++ b/framework/I18N/core/NumberFormatInfo.php @@ -648,4 +648,3 @@ class NumberFormatInfo } } -?> diff --git a/framework/IO/TTextWriter.php b/framework/IO/TTextWriter.php index 0dd9bcf5..b043e217 100644 --- a/framework/IO/TTextWriter.php +++ b/framework/IO/TTextWriter.php @@ -57,4 +57,3 @@ class TTextWriter extends TComponent implements ITextWriter } } -?> diff --git a/framework/PradoBase.php b/framework/PradoBase.php index 15932cad..11bc7f41 100644 --- a/framework/PradoBase.php +++ b/framework/PradoBase.php @@ -115,6 +115,11 @@ class PradoBase return 'Powered by PRADO'; } + public static function metaGenerator() + { + return 'PRADO - http://www.pradosoft.com/'; + } + /** * PHP error handler. * This method should be registered as PHP error handler using diff --git a/framework/Security/IUserManager.php b/framework/Security/IUserManager.php index d8907160..37cf632f 100644 --- a/framework/Security/IUserManager.php +++ b/framework/Security/IUserManager.php @@ -56,4 +56,3 @@ interface IUserManager public function validateUser($username,$password); } -?> diff --git a/framework/Security/TAuthManager.php b/framework/Security/TAuthManager.php index 64422845..40d94e19 100644 --- a/framework/Security/TAuthManager.php +++ b/framework/Security/TAuthManager.php @@ -4,7 +4,7 @@ * * @author Qiang Xue * @link http://www.pradosoft.com/ - * @copyright Copyright © 2005-2008 PradoSoft + * @copyright Copyright © 2005-2008 PradoSoft * @license http://www.pradosoft.com/license/ * @version $Id$ * @package System.Security @@ -25,6 +25,13 @@ Prado::using('System.Security.IUserManager'); * browser to a login page that is specified via the {@link setLoginPage LoginPage}. * To login or logout a user, call {@link login} or {@link logout}, respectively. * + * The {@link setAuthExpire AuthExpire} property can be used to define the time + * in seconds after which the authentication should expire. + * {@link setAllowAutoLogin AllowAutoLogin} specifies if the login information + * should be stored in a cookie to perform automatic login. Enabling this + * feature will cause that {@link setAuthExpire AuthExpire} has no effect + * since the user will be logged in again on authentication expiration. + * * To load TAuthManager, configure it in application configuration as follows, * * @@ -68,6 +75,10 @@ class TAuthManager extends TModule * @var string variable name used to store user session or cookie */ private $_userKey; + /** + * @var integer authentication expiration time in seconds. Defaults to zero (no expiration) + */ + private $_authExpire=0; /** * Initializes this module. @@ -241,6 +252,24 @@ class TAuthManager extends TModule $this->_allowAutoLogin=TPropertyValue::ensureBoolean($value); } + /** + * @return integer authentication expiration time in seconds. Defaults to zero (no expiration). + * @since 3.1.3 + */ + public function getAuthExpire() + { + return $this->_authExpire; + } + + /** + * @param integer authentication expiration time in seconds. Defaults to zero (no expiration). + * @since 3.1.3 + */ + public function setAuthExpire($value) + { + $this->_authExpire=TPropertyValue::ensureInteger($value); + } + /** * Performs the real authentication work. * An OnAuthenticate event will be raised if there is any handler attached to it. @@ -260,8 +289,12 @@ class TAuthManager extends TModule $sessionInfo=$session->itemAt($this->getUserKey()); $user=$this->_userManager->getUser(null)->loadFromString($sessionInfo); + // check for authentication expiration + $isAuthExpired = $this->_authExpire>0 && !$user->getIsGuest() && + ($expiretime=$session->itemAt('AuthExpireTime')) && $expiretimegetAllowAutoLogin() && $user->getIsGuest()) + if($this->getAllowAutoLogin() && ($user->getIsGuest() || $isAuthExpired)) { $cookie=$this->getRequest()->getCookies()->itemAt($this->getUserKey()); if($cookie instanceof THttpCookie) @@ -270,17 +303,37 @@ class TAuthManager extends TModule { $user=$user2; $this->updateSessionUser($user); + // user is restored from cookie, auth may not expire + $isAuthExpired = false; } } } $application->setUser($user); + // handle authentication expiration or update expiration time + if($isAuthExpired) + $this->onAuthExpire($param); + else + $session->add('AuthExpireTime', time() + $this->_authExpire); + // event handler gets a chance to do further auth work if($this->hasEventHandler('OnAuthenticate')) $this->raiseEvent('OnAuthenticate',$this,$application); } - + + /** + * Performs user logout on authentication expiration. + * An 'OnAuthExpire' event will be raised if there is any handler attached to it. + * @param mixed parameter to be passed to OnAuthExpire event. + */ + public function onAuthExpire($param) + { + $this->logout(); + if($this->hasEventHandler('OnAuthExpire')) + $this->raiseEvent('OnAuthExpire',$this,$param); + } + /** * Performs the real authorization work. * Authorization rules obtained from the application will be used to check @@ -401,4 +454,4 @@ class TAuthManager extends TModule } } -?> +?> diff --git a/framework/Security/TAuthorizationRule.php b/framework/Security/TAuthorizationRule.php index d301737b..896ce376 100644 --- a/framework/Security/TAuthorizationRule.php +++ b/framework/Security/TAuthorizationRule.php @@ -294,4 +294,3 @@ class TAuthorizationRuleCollection extends TList } } -?> diff --git a/framework/Security/TDbUserManager.php b/framework/Security/TDbUserManager.php index bd70de8d..873d43f8 100644 --- a/framework/Security/TDbUserManager.php +++ b/framework/Security/TDbUserManager.php @@ -318,4 +318,3 @@ abstract class TDbUser extends TUser } } -?> diff --git a/framework/Security/TSecurityManager.php b/framework/Security/TSecurityManager.php index 9fbadd10..d43c9fec 100644 --- a/framework/Security/TSecurityManager.php +++ b/framework/Security/TSecurityManager.php @@ -279,4 +279,3 @@ class TSecurityManagerValidationMode extends TEnumerable const SHA1='SHA1'; } -?> diff --git a/framework/Security/TUser.php b/framework/Security/TUser.php index d0e850cf..35e3e3a5 100644 --- a/framework/Security/TUser.php +++ b/framework/Security/TUser.php @@ -220,4 +220,3 @@ class TUser extends TComponent implements IUser } } -?> diff --git a/framework/Security/TUserManager.php b/framework/Security/TUserManager.php index 6326803d..dbaa5ffb 100644 --- a/framework/Security/TUserManager.php +++ b/framework/Security/TUserManager.php @@ -148,7 +148,7 @@ class TUserManager extends TModule implements IUserManager * Loads user/role information from an XML node. * @param TXmlElement the XML node containing the user information */ - private function loadUserDataFromXml($xmlNode) + protected function loadUserDataFromXml($xmlNode) { foreach($xmlNode->getElementsByTagName('user') as $node) { diff --git a/framework/TApplication.php b/framework/TApplication.php index d9626179..e690aa96 100644 --- a/framework/TApplication.php +++ b/framework/TApplication.php @@ -293,6 +293,11 @@ class TApplication extends TComponent * @var TApplicationMode application mode */ private $_mode=TApplicationMode::Debug; + + /** + * @var string Customizable page service ID + */ + private $_pageServiceID = self::PAGE_SERVICE_ID; /** * Constructor. @@ -325,7 +330,8 @@ class TApplication extends TComponent // generates unique ID by hashing the runtime path $this->_uniqueID=md5($this->_runtimePath); $this->_parameters=new TMap; - $this->_services=array(self::PAGE_SERVICE_ID=>array('TPageService',array(),null)); + $this->_services=array($this->getPageServiceID()=>array('TPageService',array(),null)); + Prado::setPathOfAlias('Application',$this->_basePath); } @@ -509,6 +515,22 @@ class TApplication extends TComponent { $this->_id=$value; } + + /** + * @return string page service ID + */ + public function getPageServiceID() + { + return $this->_pageServiceID; + } + + /** + * @param string page service ID + */ + public function setPageServiceID($value) + { + $this->_pageServiceID=$value; + } /** * @return string an ID that uniquely identifies this Prado application from the others @@ -623,6 +645,10 @@ class TApplication extends TComponent public function setRuntimePath($value) { $this->_runtimePath=$value; + if($this->_cacheFile) + $this->_cacheFile=$this->_runtimePath.DIRECTORY_SEPARATOR.self::CONFIGCACHE_FILE; + // generates unique ID by hashing the runtime path + $this->_uniqueID=md5($this->_runtimePath); } /** @@ -912,6 +938,9 @@ class TApplication extends TComponent foreach($config->getProperties() as $name=>$value) $this->setSubProperty($name,$value); } + + if(empty($this->_services)) + $this->_services=array($this->getPageServiceID()=>array('TPageService',array(),null)); // load parameters foreach($config->getParameters() as $id=>$parameter) @@ -996,8 +1025,8 @@ class TApplication extends TComponent } if(($serviceID=$this->getRequest()->resolveRequest(array_keys($this->_services)))===null) - $serviceID=self::PAGE_SERVICE_ID; - + $serviceID=$this->getPageServiceID(); + $this->startService($serviceID); } @@ -1761,4 +1790,3 @@ class TApplicationStatePersister extends TModule implements IStatePersister } } -?> diff --git a/framework/TApplicationComponent.php b/framework/TApplicationComponent.php index 41e1b80e..6e2c5bbe 100644 --- a/framework/TApplicationComponent.php +++ b/framework/TApplicationComponent.php @@ -116,4 +116,3 @@ class TApplicationComponent extends TComponent } } -?> diff --git a/framework/TComponent.php b/framework/TComponent.php index cba21b7d..f9c36cc8 100644 --- a/framework/TComponent.php +++ b/framework/TComponent.php @@ -839,4 +839,3 @@ class TComponentReflection extends TComponent } } -?> diff --git a/framework/TModule.php b/framework/TModule.php index 9ff20d6f..6426aa70 100644 --- a/framework/TModule.php +++ b/framework/TModule.php @@ -54,4 +54,3 @@ abstract class TModule extends TApplicationComponent implements IModule } } -?> diff --git a/framework/TService.php b/framework/TService.php index a10460cc..cf2fb142 100644 --- a/framework/TService.php +++ b/framework/TService.php @@ -81,4 +81,3 @@ abstract class TService extends TApplicationComponent implements IService } } -?> diff --git a/framework/TShellApplication.php b/framework/TShellApplication.php index ad219cd1..0d2cb826 100644 --- a/framework/TShellApplication.php +++ b/framework/TShellApplication.php @@ -46,4 +46,3 @@ class TShellApplication extends TApplication } } -?> diff --git a/framework/Util/TDataFieldAccessor.php b/framework/Util/TDataFieldAccessor.php index fa65a9a2..bf0b58ae 100644 --- a/framework/Util/TDataFieldAccessor.php +++ b/framework/Util/TDataFieldAccessor.php @@ -80,4 +80,3 @@ class TDataFieldAccessor } } -?> diff --git a/framework/Util/TLogRouter.php b/framework/Util/TLogRouter.php index 5c755985..aa772194 100644 --- a/framework/Util/TLogRouter.php +++ b/framework/Util/TLogRouter.php @@ -95,6 +95,20 @@ class TLogRouter extends TModule } } + /** + * Adds a TLogRoute instance to the log router. + * + * @param TLogRoute $route + * @throws TInvalidDataTypeException if the route object is invalid + */ + public function addRoute($route) + { + if(!($route instanceof TLogRoute)) + throw new TInvalidDataTypeException('logrouter_routetype_invalid'); + $this->_routes[]=$route; + $route->init(null); + } + /** * @return string external configuration file. Defaults to null. */ @@ -106,11 +120,11 @@ class TLogRouter extends TModule /** * @param string external configuration file in namespace format. The file * must be suffixed with '.xml'. - * @throws TInvalidDataValueException if the file is invalid. + * @throws TConfigurationException if the file is invalid. */ public function setConfigFile($value) { - if(($this->_configFile=Prado::getPathOfNamespace($value,self::LOG_FILE_EXT))===null) + if(($this->_configFile=Prado::getPathOfNamespace($value,self::CONFIG_FILE_EXT))===null) throw new TConfigurationException('logrouter_configfile_invalid',$value); } @@ -509,8 +523,9 @@ class TEmailLogRoute extends TLogRoute foreach($logs as $log) $message.=$this->formatLogMessage($log[0],$log[1],$log[2],$log[3]); $message=wordwrap($message,70); + $returnPath = ini_get('sendmail_path') ? "Return-Path:{$this->_from}\r\n" : ''; foreach($this->_emails as $email) - mail($email,$this->getSubject(),$message,"From:{$this->_from}\r\n"); + mail($email,$this->getSubject(),$message,"From:{$this->_from}\r\n{$returnPath}"); } diff --git a/framework/Util/TLogger.php b/framework/Util/TLogger.php index 6d5385eb..51005883 100644 --- a/framework/Util/TLogger.php +++ b/framework/Util/TLogger.php @@ -127,4 +127,3 @@ class TLogger extends TComponent } } -?> diff --git a/framework/Util/TParameterModule.php b/framework/Util/TParameterModule.php index 020db8db..529f20ca 100644 --- a/framework/Util/TParameterModule.php +++ b/framework/Util/TParameterModule.php @@ -141,4 +141,3 @@ class TParameterModule extends TModule } } -?> diff --git a/framework/Util/TVarDumper.php b/framework/Util/TVarDumper.php index 180bb71a..e30e2400 100644 --- a/framework/Util/TVarDumper.php +++ b/framework/Util/TVarDumper.php @@ -126,4 +126,3 @@ class TVarDumper } } -?> diff --git a/framework/Web/Javascripts/TJavaScript.php b/framework/Web/Javascripts/TJavaScript.php index 511515c8..9c4741a4 100644 --- a/framework/Web/Javascripts/TJavaScript.php +++ b/framework/Web/Javascripts/TJavaScript.php @@ -227,4 +227,3 @@ class TJavaScript } } -?> diff --git a/framework/Web/Javascripts/source/packages.php b/framework/Web/Javascripts/source/packages.php index 1cca7b7c..d6c04e7f 100644 --- a/framework/Web/Javascripts/source/packages.php +++ b/framework/Web/Javascripts/source/packages.php @@ -47,7 +47,8 @@ $packages = array( ), 'dragdrop'=>array( - SCRIPTACULOUS_DIR.'/dragdrop.js' + SCRIPTACULOUS_DIR.'/dragdrop.js', + 'prado/activecontrols/dragdrop.js' ), 'slider'=>array( @@ -60,6 +61,14 @@ $packages = array( 'tabpanel'=>array( 'prado/controls/tabpanel.js' + ), + + 'activedatepicker' => array( + 'prado/activecontrols/activedatepicker.js' + ), + + 'activefileupload' => array( + 'prado/activefileupload/activefileupload.js' ), ); @@ -67,19 +76,20 @@ $packages = array( //package names and their dependencies $dependencies = array( - 'prado' => array('prado'), - 'effects' => array('prado', 'effects'), - 'validator' => array('prado', 'validator'), - 'logger' => array('prado', 'logger'), - 'datepicker' => array('prado', 'datepicker'), - 'colorpicker' => array('prado', 'colorpicker'), - 'ajax' => array('prado', 'effects', 'ajax'), - 'dragdrop' => array('prado', 'effects', 'dragdrop'), - 'slider' => array('prado', 'slider'), - 'keyboard' => array('prado', 'keyboard'), - 'tabpanel' => array('prado', 'tabpanel'), + 'prado' => array('prado'), + 'effects' => array('prado', 'effects'), + 'validator' => array('prado', 'validator'), + 'logger' => array('prado', 'logger'), + 'datepicker' => array('prado', 'datepicker'), + 'colorpicker' => array('prado', 'colorpicker'), + 'ajax' => array('prado', 'effects', 'ajax'), + 'dragdrop' => array('prado', 'effects', 'ajax', 'dragdrop'), + 'slider' => array('prado', 'slider'), + 'keyboard' => array('prado', 'keyboard'), + 'tabpanel' => array('prado', 'tabpanel'), + 'activedatepicker' => array('datepicker', 'ajax', 'activedatepicker'), + 'activefileupload' => array('prado', 'ajax', 'activefileupload'), ); return array($packages, $dependencies); -?> diff --git a/framework/Web/Javascripts/source/prado/activecontrols/activecontrols3.js b/framework/Web/Javascripts/source/prado/activecontrols/activecontrols3.js index 7ee4c0e6..d5cae7b8 100644 --- a/framework/Web/Javascripts/source/prado/activecontrols/activecontrols3.js +++ b/framework/Web/Javascripts/source/prado/activecontrols/activecontrols3.js @@ -1,362 +1,387 @@ -/** - * Generic postback control. - */ -Prado.WebUI.CallbackControl = Class.extend(Prado.WebUI.PostBackControl, -{ - onPostBack : function(event, options) - { - var request = new Prado.CallbackRequest(options.EventTarget, options); - request.dispatch(); - Event.stop(event); - } -}); - -/** - * TActiveButton control. - */ -Prado.WebUI.TActiveButton = Class.extend(Prado.WebUI.CallbackControl); -/** - * TActiveLinkButton control. - */ -Prado.WebUI.TActiveLinkButton = Class.extend(Prado.WebUI.CallbackControl); - -Prado.WebUI.TActiveImageButton = Class.extend(Prado.WebUI.TImageButton, -{ - onPostBack : function(event, options) - { - this.addXYInput(event,options); - var request = new Prado.CallbackRequest(options.EventTarget, options); - request.dispatch(); - Event.stop(event); - } -}); -/** - * Active check box. - */ -Prado.WebUI.TActiveCheckBox = Class.extend(Prado.WebUI.CallbackControl, -{ - onPostBack : function(event, options) - { - var request = new Prado.CallbackRequest(options.EventTarget, options); - if(request.dispatch()==false) - Event.stop(event); - } -}); - -/** - * TActiveRadioButton control. - */ -Prado.WebUI.TActiveRadioButton = Class.extend(Prado.WebUI.TActiveCheckBox); - - -Prado.WebUI.TActiveCheckBoxList = Base.extend( -{ - constructor : function(options) - { - for(var i = 0; i 0) - { - this.hasResults = true; - this.updateChoices(result); - } - else - { - this.active = false; - this.hasResults = false; - this.hide(); - } - } - } -}); - -/** - * Time Triggered Callback class. - */ -Prado.WebUI.TTimeTriggeredCallback = Base.extend( -{ - constructor : function(options) - { - this.options = Object.extend({ Interval : 1 }, options || {}); - Prado.WebUI.TTimeTriggeredCallback.register(this); - }, - - startTimer : function() - { - setTimeout(this.onTimerEvent.bind(this), 100); - if(typeof(this.timer) == 'undefined' || this.timer == null) - this.timer = setInterval(this.onTimerEvent.bind(this),this.options.Interval*1000); - }, - - stopTimer : function() - { - if(typeof(this.timer) != 'undefined') - { - clearInterval(this.timer); - this.timer = null; - } - }, - - onTimerEvent : function() - { - var request = new Prado.CallbackRequest(this.options.EventTarget, this.options); - request.dispatch(); - } -}, -//class methods -{ - timers : {}, - - register : function(timer) - { - Prado.WebUI.TTimeTriggeredCallback.timers[timer.options.ID] = timer; - }, - - start : function(id) - { - if(Prado.WebUI.TTimeTriggeredCallback.timers[id]) - Prado.WebUI.TTimeTriggeredCallback.timers[id].startTimer(); - }, - - stop : function(id) - { - if(Prado.WebUI.TTimeTriggeredCallback.timers[id]) - Prado.WebUI.TTimeTriggeredCallback.timers[id].stopTimer(); - } -}); - -Prado.WebUI.ActiveListControl = Base.extend( -{ - constructor : function(options) - { - this.element = $(options.ID); - if(this.element) - { - this.options = options; - Event.observe(this.element, "change", this.doCallback.bind(this)); - } - }, - - doCallback : function(event) - { - var request = new Prado.CallbackRequest(this.options.EventTarget, this.options); - request.dispatch(); - Event.stop(event); - } -}); - -Prado.WebUI.TActiveDropDownList = Prado.WebUI.ActiveListControl; -Prado.WebUI.TActiveListBox = Prado.WebUI.ActiveListControl; - -/** - * Observe event of a particular control to trigger a callback request. - */ -Prado.WebUI.TEventTriggeredCallback = Base.extend( -{ - constructor : function(options) - { - this.options = options; - var element = $(options['ControlID']); - if(element) - Event.observe(element, this.getEventName(element), this.doCallback.bind(this)); - }, - - getEventName : function(element) - { - var name = this.options.EventName; - if(typeof(name) == "undefined" && element.type) - { - switch (element.type.toLowerCase()) - { - case 'password': - case 'text': - case 'textarea': - case 'select-one': - case 'select-multiple': - return 'change'; - } - } - return typeof(name) == "undefined" || name == "undefined" ? 'click' : name; - }, - - doCallback : function(event) - { - var request = new Prado.CallbackRequest(this.options.EventTarget, this.options); - request.dispatch(); - if(this.options.StopEvent == true) - Event.stop(event); - } -}); - -/** - * Observe changes to a property of a particular control to trigger a callback. - */ -Prado.WebUI.TValueTriggeredCallback = Base.extend( -{ - count : 1, - - observing : true, - - constructor : function(options) - { - this.options = options; - this.options.PropertyName = this.options.PropertyName || 'value'; - var element = $(options['ControlID']); - this.value = element ? element[this.options.PropertyName] : undefined; - Prado.WebUI.TValueTriggeredCallback.register(this); - this.startObserving(); - }, - - stopObserving : function() - { - clearTimeout(this.timer); - this.observing = false; - }, - - startObserving : function() - { - this.timer = setTimeout(this.checkChanges.bind(this), this.options.Interval*1000); - }, - - checkChanges : function() - { - var element = $(this.options.ControlID); - if(element) - { - var value = element[this.options.PropertyName]; - if(this.value != value) - { - this.doCallback(this.value, value); - this.value = value; - this.count=1; - } - else - this.count = this.count + this.options.Decay; - if(this.observing) - this.time = setTimeout(this.checkChanges.bind(this), - parseInt(this.options.Interval*1000*this.count)); - } - }, - - doCallback : function(oldValue, newValue) - { - var request = new Prado.CallbackRequest(this.options.EventTarget, this.options); - var param = {'OldValue' : oldValue, 'NewValue' : newValue}; - request.setCallbackParameter(param); - request.dispatch(); - } -}, -//class methods -{ - timers : {}, - - register : function(timer) - { - Prado.WebUI.TValueTriggeredCallback.timers[timer.options.ID] = timer; - }, - - stop : function(id) - { - Prado.WebUI.TValueTriggeredCallback.timers[id].stopObserving(); - } -}); +/** + * Generic postback control. + */ +Prado.WebUI.CallbackControl = Class.extend(Prado.WebUI.PostBackControl, +{ + onPostBack : function(event, options) + { + var request = new Prado.CallbackRequest(options.EventTarget, options); + request.dispatch(); + Event.stop(event); + } +}); + +/** + * TActiveButton control. + */ +Prado.WebUI.TActiveButton = Class.extend(Prado.WebUI.CallbackControl); +/** + * TActiveLinkButton control. + */ +Prado.WebUI.TActiveLinkButton = Class.extend(Prado.WebUI.CallbackControl); + +Prado.WebUI.TActiveImageButton = Class.extend(Prado.WebUI.TImageButton, +{ + onPostBack : function(event, options) + { + this.addXYInput(event,options); + var request = new Prado.CallbackRequest(options.EventTarget, options); + request.dispatch(); + Event.stop(event); + this.removeXYInput(event,options); + } +}); +/** + * Active check box. + */ +Prado.WebUI.TActiveCheckBox = Class.extend(Prado.WebUI.CallbackControl, +{ + onPostBack : function(event, options) + { + var request = new Prado.CallbackRequest(options.EventTarget, options); + if(request.dispatch()==false) + Event.stop(event); + } +}); + +/** + * TActiveRadioButton control. + */ +Prado.WebUI.TActiveRadioButton = Class.extend(Prado.WebUI.TActiveCheckBox); + + +Prado.WebUI.TActiveCheckBoxList = Base.extend( +{ + constructor : function(options) + { + for(var i = 0; i 0) + { + this.hasResults = true; + this.updateChoices(result); + } + else + { + this.active = false; + this.hasResults = false; + this.hide(); + } + } + } +}); + +/** + * Time Triggered Callback class. + */ +Prado.WebUI.TTimeTriggeredCallback = Base.extend( +{ + constructor : function(options) + { + this.options = Object.extend({ Interval : 1 }, options || {}); + Prado.WebUI.TTimeTriggeredCallback.register(this); + }, + + startTimer : function() + { + setTimeout(this.onTimerEvent.bind(this), 100); + if(typeof(this.timer) == 'undefined' || this.timer == null) + this.timer = setInterval(this.onTimerEvent.bind(this),this.options.Interval*1000); + }, + + stopTimer : function() + { + if(typeof(this.timer) != 'undefined') + { + clearInterval(this.timer); + this.timer = null; + } + }, + + resetTimer : function() + { + if(typeof(this.timer) != 'undefined') + { + clearInterval(this.timer); + this.timer = null; + this.timer = setInterval(this.onTimerEvent.bind(this),this.options.Interval*1000); + } + }, + + onTimerEvent : function() + { + var request = new Prado.CallbackRequest(this.options.EventTarget, this.options); + request.dispatch(); + }, + + setInterval : function(value) + { + if (this.options.Interval != value){ + this.options.Interval = value; + this.resetTimer(); + } + } +}, +//class methods +{ + timers : {}, + + register : function(timer) + { + Prado.WebUI.TTimeTriggeredCallback.timers[timer.options.ID] = timer; + }, + + start : function(id) + { + if(Prado.WebUI.TTimeTriggeredCallback.timers[id]) + Prado.WebUI.TTimeTriggeredCallback.timers[id].startTimer(); + }, + + stop : function(id) + { + if(Prado.WebUI.TTimeTriggeredCallback.timers[id]) + Prado.WebUI.TTimeTriggeredCallback.timers[id].stopTimer(); + }, + + setInterval : function (id,value) + { + if(Prado.WebUI.TTimeTriggeredCallback.timers[id]) + Prado.WebUI.TTimeTriggeredCallback.timers[id].setInterval(value); + } +}); + +Prado.WebUI.ActiveListControl = Base.extend( +{ + constructor : function(options) + { + this.element = $(options.ID); + if(this.element) + { + this.options = options; + Event.observe(this.element, "change", this.doCallback.bind(this)); + } + }, + + doCallback : function(event) + { + var request = new Prado.CallbackRequest(this.options.EventTarget, this.options); + request.dispatch(); + Event.stop(event); + } +}); + +Prado.WebUI.TActiveDropDownList = Prado.WebUI.ActiveListControl; +Prado.WebUI.TActiveListBox = Prado.WebUI.ActiveListControl; + +/** + * Observe event of a particular control to trigger a callback request. + */ +Prado.WebUI.TEventTriggeredCallback = Base.extend( +{ + constructor : function(options) + { + this.options = options; + var element = $(options['ControlID']); + if(element) + Event.observe(element, this.getEventName(element), this.doCallback.bind(this)); + }, + + getEventName : function(element) + { + var name = this.options.EventName; + if(typeof(name) == "undefined" && element.type) + { + switch (element.type.toLowerCase()) + { + case 'password': + case 'text': + case 'textarea': + case 'select-one': + case 'select-multiple': + return 'change'; + } + } + return typeof(name) == "undefined" || name == "undefined" ? 'click' : name; + }, + + doCallback : function(event) + { + var request = new Prado.CallbackRequest(this.options.EventTarget, this.options); + request.dispatch(); + if(this.options.StopEvent == true) + Event.stop(event); + } +}); + +/** + * Observe changes to a property of a particular control to trigger a callback. + */ +Prado.WebUI.TValueTriggeredCallback = Base.extend( +{ + count : 1, + + observing : true, + + constructor : function(options) + { + this.options = options; + this.options.PropertyName = this.options.PropertyName || 'value'; + var element = $(options['ControlID']); + this.value = element ? element[this.options.PropertyName] : undefined; + Prado.WebUI.TValueTriggeredCallback.register(this); + this.startObserving(); + }, + + stopObserving : function() + { + clearTimeout(this.timer); + this.observing = false; + }, + + startObserving : function() + { + this.timer = setTimeout(this.checkChanges.bind(this), this.options.Interval*1000); + }, + + checkChanges : function() + { + var element = $(this.options.ControlID); + if(element) + { + var value = element[this.options.PropertyName]; + if(this.value != value) + { + this.doCallback(this.value, value); + this.value = value; + this.count=1; + } + else + this.count = this.count + this.options.Decay; + if(this.observing) + this.time = setTimeout(this.checkChanges.bind(this), + parseInt(this.options.Interval*1000*this.count)); + } + }, + + doCallback : function(oldValue, newValue) + { + var request = new Prado.CallbackRequest(this.options.EventTarget, this.options); + var param = {'OldValue' : oldValue, 'NewValue' : newValue}; + request.setCallbackParameter(param); + request.dispatch(); + } +}, +//class methods +{ + timers : {}, + + register : function(timer) + { + Prado.WebUI.TValueTriggeredCallback.timers[timer.options.ID] = timer; + }, + + stop : function(id) + { + Prado.WebUI.TValueTriggeredCallback.timers[id].stopObserving(); + } +}); diff --git a/framework/Web/Javascripts/source/prado/activecontrols/activedatepicker.js b/framework/Web/Javascripts/source/prado/activecontrols/activedatepicker.js new file mode 100755 index 00000000..87b48bf3 --- /dev/null +++ b/framework/Web/Javascripts/source/prado/activecontrols/activedatepicker.js @@ -0,0 +1,79 @@ +/** + * TActiveDatePicker control + */ +Prado.WebUI.TActiveDatePicker = Class.extend(Prado.WebUI.TDatePicker, +{ + initialize : function(options) + { + this.options = options || []; + this.control = $(options.ID); + this.dateSlot = new Array(42); + this.weekSlot = new Array(6); + this.minimalDaysInFirstWeek = 4; + this.selectedDate = this.newDate(); + this.positionMode = 'Bottom'; + + //which element to trigger to show the calendar + if(this.options.Trigger) + { + this.trigger = $(this.options.Trigger) ; + var triggerEvent = this.options.TriggerEvent || "click"; + } + else + { + this.trigger = this.control; + var triggerEvent = this.options.TriggerEvent || "focus"; + } + + // Popup position + if(this.options.PositionMode == 'Top') + { + this.positionMode = this.options.PositionMode; + } + + Object.extend(this,options); + + Event.observe(this.trigger, triggerEvent, this.show.bindEvent(this)); + + // Listen to change event + if(this.options.InputMode == "TextBox") + { + Event.observe(this.control, "change", this.onDateChanged.bindEvent(this)); + } + else + { + var day = Prado.WebUI.TDatePicker.getDayListControl(this.control); + var month = Prado.WebUI.TDatePicker.getMonthListControl(this.control); + var year = Prado.WebUI.TDatePicker.getYearListControl(this.control); + Event.observe (day, "change", this.onDateChanged.bindEvent(this)); + Event.observe (month, "change", this.onDateChanged.bindEvent(this)); + Event.observe (year, "change", this.onDateChanged.bindEvent(this)); + + } + + }, + + // Respond to change event on the textbox or dropdown list + // This method raises OnDateChanged event on client side if it has been defined, + // and raise the callback request + onDateChanged : function () + { + var date; + if (this.options.InputMode == "TextBox") + { + date=this.control.value; + } + else + { + var day = Prado.WebUI.TDatePicker.getDayListControl(this.control).selectedIndex+1; + var month = Prado.WebUI.TDatePicker.getMonthListControl(this.control).selectedIndex; + var year = Prado.WebUI.TDatePicker.getYearListControl(this.control).value; + date=new Date(year, month, day, 0,0,0).SimpleFormat(this.Format, this); + } + if (typeof(this.options.OnDateChanged) == "function") this.options.OnDateChanged(this, date); + + // Make callback request + var request = new Prado.CallbackRequest(this.options.EventTarget,this.options); + request.dispatch(); + } +}); diff --git a/framework/Web/Javascripts/source/prado/activecontrols/dragdrop.js b/framework/Web/Javascripts/source/prado/activecontrols/dragdrop.js new file mode 100755 index 00000000..0b42afd5 --- /dev/null +++ b/framework/Web/Javascripts/source/prado/activecontrols/dragdrop.js @@ -0,0 +1,24 @@ +/** + * DropContainer control + */ + +Prado.WebUI.DropContainer = Class.extend(Prado.WebUI.CallbackControl); + +Object.extend(Prado.WebUI.DropContainer.prototype, +{ + initialize: function(options) + { + this.options = options; + Object.extend (this.options, + { + onDrop: this.onDrop.bind(this) + }); + + Droppables.add (options.ID, this.options); + }, + + onDrop: function(dragElement, dropElement) + { + Prado.Callback(this.options.EventTarget, dragElement.id, null, this.options); + } +}); diff --git a/framework/Web/Javascripts/source/prado/activecontrols/inlineeditor.js b/framework/Web/Javascripts/source/prado/activecontrols/inlineeditor.js index 87b8ddde..51e3f489 100644 --- a/framework/Web/Javascripts/source/prado/activecontrols/inlineeditor.js +++ b/framework/Web/Javascripts/source/prado/activecontrols/inlineeditor.js @@ -188,7 +188,7 @@ Prado.WebUI.TInPlaceTextBox = Base.extend( if(this.options.AutoHide) this.showLabel(); } - else if (Event.keyCode(e) == Event.KEY_RETURN) + else if (Event.keyCode(e) == Event.KEY_RETURN && this.options.TextMode != 'MultiLine') Event.stop(e); }, diff --git a/framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadBlank.html b/framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadBlank.html new file mode 100755 index 00000000..44f50ce4 --- /dev/null +++ b/framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadBlank.html @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadComplete.png b/framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadComplete.png new file mode 100755 index 00000000..98badd7f Binary files /dev/null and b/framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadComplete.png differ diff --git a/framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadError.png b/framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadError.png new file mode 100755 index 00000000..26c529fc Binary files /dev/null and b/framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadError.png differ diff --git a/framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadIndicator.gif b/framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadIndicator.gif new file mode 100755 index 00000000..085ccaec Binary files /dev/null and b/framework/Web/Javascripts/source/prado/activefileupload/ActiveFileUploadIndicator.gif differ diff --git a/framework/Web/Javascripts/source/prado/activefileupload/activefileupload.js b/framework/Web/Javascripts/source/prado/activefileupload/activefileupload.js new file mode 100755 index 00000000..9f57f912 --- /dev/null +++ b/framework/Web/Javascripts/source/prado/activefileupload/activefileupload.js @@ -0,0 +1,63 @@ +Prado.WebUI.TActiveFileUpload = Base.extend( +{ + constructor : function(options) + { + this.options = options || {}; + Prado.WebUI.TActiveFileUpload.register(this); + + this.input = $(options.inputID); + this.flag = $(options.flagID); + this.form = $(options.formID); + + this.indicator = $(options.indicatorID); + this.complete = $(options.completeID); + this.error = $(options.errorID); + + // set up events + Event.observe(this.input,"change",this.fileChanged.bind(this)); + }, + + fileChanged:function(){ + // show the upload indicator, and hide the complete and error indicators (if they areSn't already). + this.flag.value = '1'; + this.complete.style.display = 'none'; + this.error.style.display = 'none'; + this.indicator.style.display = ''; + + // set the form to submit in the iframe, submit it, and then reset it. + this.oldtargetID = this.form.target; + this.form.target = this.options.targetID; + this.form.submit(); + this.form.target = this.oldtargetID; + }, + + finishUpload:function(options){ + // hide the display indicator. + this.flag.value = ''; + this.indicator.style.display = 'none'; + if (this.options.targetID == options.targetID){ + // show the complete indicator. + if (options.errorCode == 0){ + this.complete.style.display = ''; + this.input.value = ''; + } else { + this.error.style.display = ''; + } + Prado.Callback(this.options.EventTarget, options, null, this.options); + } + } +}, +{ +// class methods + controls : {}, + + register : function(control) + { + Prado.WebUI.TActiveFileUpload.controls[control.options.ID] = control; + }, + + onFileUpload: function(options) + { + Prado.WebUI.TActiveFileUpload.controls[options.clientID].finishUpload(options); + } +}); \ No newline at end of file diff --git a/framework/Web/Javascripts/source/prado/activeratings/blocks.css b/framework/Web/Javascripts/source/prado/activeratings/blocks.css deleted file mode 100644 index bb846094..00000000 --- a/framework/Web/Javascripts/source/prado/activeratings/blocks.css +++ /dev/null @@ -1,42 +0,0 @@ -.TActiveRatingList_blocks -{ - border-collapse: collapse; -} -.TActiveRatingList_blocks input, .TActiveRatingList_blocks label -{ - display: none; -} - -.TActiveRatingList_blocks td -{ - width: 18px; - height: 9px; - padding: 1px; -} - -.TActiveRatingList_blocks td.rating -{ - background-image: url(blocks_combined.gif); - background-repeat: no-repeat; - cursor: pointer; - background-position: 1px 0px; -} -.TActiveRatingList_blocks td.rating_selected -{ - background-position: 1px -100px; -} - -.TActiveRatingList_blocks td.rating_half -{ - background-position: 1px -200px; -} - -.TActiveRatingList_blocks td.rating_hover -{ - background-position: 1px -300px; -} - -.TActiveRatingList_blocks td.rating_disabled -{ - cursor: default !important; -} diff --git a/framework/Web/Javascripts/source/prado/activeratings/default.css b/framework/Web/Javascripts/source/prado/activeratings/default.css deleted file mode 100644 index ba90eb27..00000000 --- a/framework/Web/Javascripts/source/prado/activeratings/default.css +++ /dev/null @@ -1,43 +0,0 @@ -.TActiveRatingList_default -{ - border-collapse: collapse; -} -.TActiveRatingList_default input, .TActiveRatingList_default label -{ - display: none; -} - -.TActiveRatingList_default td -{ - width: 18px; - height: 18px; - padding: 0; -} - -.TActiveRatingList_default td.rating -{ - background-image: url(default_combined.gif); - background-repeat: no-repeat; - cursor: pointer; - background-position: 0px 0px; -} - -.TActiveRatingList_default td.rating_selected -{ - background-position: 0px -100px; -} - -.TActiveRatingList_default td.rating_half -{ - background-position: 0px -200px; -} - -.TActiveRatingList_default td.rating_hover -{ - background-position: 0px -300px; -} - -.TActiveRatingList_default td.rating_disabled -{ - cursor: default !important; -} \ No newline at end of file diff --git a/framework/Web/Javascripts/source/prado/activeratings/ratings.js b/framework/Web/Javascripts/source/prado/activeratings/ratings.js deleted file mode 100644 index 4eeddbd8..00000000 --- a/framework/Web/Javascripts/source/prado/activeratings/ratings.js +++ /dev/null @@ -1,178 +0,0 @@ -Prado.WebUI.TActiveRatingList = Base.extend( -{ - selectedIndex : -1, - rating: -1, - enabled : true, - readOnly : false, - - constructor : function(options) - { - var cap = $(options.CaptionID); - this.options = Object.extend( - { - caption : cap ? cap.innerHTML : '' - }, options || {}); - - Prado.WebUI.TActiveRatingList.register(this); - this._init(); - this.selectedIndex = options.SelectedIndex; - this.rating = options.Rating; - if(options.Rating <= 0 && options.SelectedIndex >= 0) - this.rating = options.SelectedIndex+1; - this.showRating(this.rating); - }, - - _init: function(options) - { - Element.addClassName($(this.options.ListID),this.options.Style); - this.radios = new Array(); - var index=0; - for(var i = 0; i halfMax ? base+1 : base; - for(var i = 0; i halfMax ? base+1 : base; - var hasHalf = remainder >= halfMin && remainder <= halfMax; - for(var i = 0; i index ? 'removeClassName' : 'addClassName'; - Element[action](node, "rating_selected"); - if(i==index+1 && hasHalf) - Element.addClassName(node, "rating_half"); - else - Element.removeClassName(node, "rating_half"); - Element.removeClassName(node,"rating_hover"); - } - }, - - getIndexCaption : function(index) - { - return index > -1 ? this.radios[index].value : this.options.caption; - }, - - showCaption : function(value) - { - var caption = $(this.options.CaptionID); - if(caption) caption.innerHTML = value; - $(this.options.ListID).title = value; - }, - - setCaption : function(value) - { - this.options.caption = value; - this.showCaption(value); - }, - - setEnabled : function(value) - { - this.enabled = value; - for(var i = 0; i