diff options
author | rojaro <> | 2010-02-15 11:03:12 +0000 |
---|---|---|
committer | rojaro <> | 2010-02-15 11:03:12 +0000 |
commit | c844dfc79f5379f8d201fd73e5636befc0653e78 (patch) | |
tree | a8667aa7149a702fec91f96ea3bac173e6b4fb82 /framework | |
parent | cd8b3f0bd654198533a8807c81e1dbb5c1c8589e (diff) |
Removed pradolite.php file
Diffstat (limited to 'framework')
-rw-r--r-- | framework/pradolite.php | 9489 |
1 files changed, 0 insertions, 9489 deletions
diff --git a/framework/pradolite.php b/framework/pradolite.php deleted file mode 100644 index 726a5343..00000000 --- a/framework/pradolite.php +++ /dev/null @@ -1,9489 +0,0 @@ -<?php
-/**
- * File Name: pradolite.php
- * Last Update: 2009/05/11 08:48:33
- * Generated By: buildscripts/phpbuilder/build.php
- *
- * This file is used in lieu of prado.php to boost PRADO application performance.
- * It is generated by expanding prado.php with included files.
- * Comments and trace statements are stripped off.
- *
- * Do not modify this file manually.
- */
- -if(!defined('PRADO_DIR')) - define('PRADO_DIR',dirname(__FILE__)); -if(!defined('PRADO_CHMOD')) - define('PRADO_CHMOD',0777); -class PradoBase -{ - const CLASS_FILE_EXT='.php'; - private static $_aliases=array('System'=>PRADO_DIR); - private static $_usings=array(); - private static $_application=null; - private static $_logger=null; - public static function getVersion() - { - return '3.1.5a'; - } - public static function initErrorHandlers() - { - set_error_handler(array('PradoBase','phpErrorHandler'),error_reporting()); - set_exception_handler(array('PradoBase','exceptionHandler')); - } - public static function autoload($className) - { - include_once($className.self::CLASS_FILE_EXT); - if(!class_exists($className,false) && !interface_exists($className,false)) - self::fatalError("Class file for '$className' cannot be found."); - } - public static function poweredByPrado($logoType=0) - { - $logoName=$logoType==1?'powered2':'powered'; - if(self::$_application!==null) - { - $am=self::$_application->getAssetManager(); - $url=$am->publishFilePath(self::getPathOfNamespace('System.'.$logoName,'.gif')); - } - else - $url='http://www.pradosoft.com/images/'.$logoName.'.gif'; - return '<a title="Powered by PRADO" href="http://www.pradosoft.com/" target="_blank"><img src="'.$url.'" style="border-width:0px;" alt="Powered by PRADO" /></a>'; - } - public static function phpErrorHandler($errno,$errstr,$errfile,$errline) - { - if(error_reporting()!=0) - throw new TPhpErrorException($errno,$errstr,$errfile,$errline); - } - public static function exceptionHandler($exception) - { - if(self::$_application!==null && ($errorHandler=self::$_application->getErrorHandler())!==null) - { - $errorHandler->handleError(null,$exception); - } - else - { - echo $exception; - } - exit(1); - } - public static function setApplication($application) - { - if(self::$_application!==null) - throw new TInvalidOperationException('prado_application_singleton_required'); - self::$_application=$application; - } - public static function getApplication() - { - return self::$_application; - } - public static function getFrameworkPath() - { - return PRADO_DIR; - } - public static function serialize($data) - { - $arr[0]=$data; - return serialize($arr); - } - public static function unserialize($str) - { - $arr=unserialize($str); - return isset($arr[0])?$arr[0]:null; - } - public static function createComponent($type) - { - self::using($type); - if(($pos=strrpos($type,'.'))!==false) - $type=substr($type,$pos+1); - if(($n=func_num_args())>1) - { - $args=func_get_args(); - $s='$args[1]'; - for($i=2;$i<$n;++$i) - $s.=",\$args[$i]"; - eval("\$component=new $type($s);"); - return $component; - } - else - return new $type; - } - public static function using($namespace,$checkClassExistence=true) - { - if(isset(self::$_usings[$namespace]) || class_exists($namespace,false)) - return; - if(($pos=strrpos($namespace,'.'))===false) { - try - { - include_once($namespace.self::CLASS_FILE_EXT); - } - catch(Exception $e) - { - if($checkClassExistence && !class_exists($namespace,false)) - throw new TInvalidOperationException('prado_component_unknown',$namespace,$e->getMessage()); - else - throw $e; - } - } - else if(($path=self::getPathOfNamespace($namespace,self::CLASS_FILE_EXT))!==null) - { - $className=substr($namespace,$pos+1); - if($className==='*') { - self::$_usings[$namespace]=$path; - set_include_path(get_include_path().PATH_SEPARATOR.$path); - } - else { - self::$_usings[$namespace]=$path; - if(!$checkClassExistence || !class_exists($className,false)) - { - try - { - include_once($path); - } - catch(Exception $e) - { - if($checkClassExistence && !class_exists($className,false)) - throw new TInvalidOperationException('prado_component_unknown',$className,$e->getMessage()); - else - throw $e; - } - } - } - } - else - throw new TInvalidDataValueException('prado_using_invalid',$namespace); - } - public static function getPathOfNamespace($namespace,$ext='') - { - if(isset(self::$_usings[$namespace])) - return self::$_usings[$namespace]; - else if(isset(self::$_aliases[$namespace])) - return self::$_aliases[$namespace]; - else - { - $segs=explode('.',$namespace); - $alias=array_shift($segs); - if(($file=array_pop($segs))!==null && ($root=self::getPathOfAlias($alias))!==null) - return rtrim($root.DIRECTORY_SEPARATOR.implode(DIRECTORY_SEPARATOR ,$segs),'/\\').(($file==='*')?'':DIRECTORY_SEPARATOR.$file.$ext); - else - return null; - } - } - public static function getPathOfAlias($alias) - { - return isset(self::$_aliases[$alias])?self::$_aliases[$alias]:null; - } - protected static function getPathAliases() - { - return self::$_aliases; - } - public static function setPathOfAlias($alias,$path) - { - if(isset(self::$_aliases[$alias])) - throw new TInvalidOperationException('prado_alias_redefined',$alias); - else if(($rp=realpath($path))!==false && is_dir($rp)) - { - if(strpos($alias,'.')===false) - self::$_aliases[$alias]=$rp; - else - throw new TInvalidDataValueException('prado_aliasname_invalid',$alias); - } - else - throw new TInvalidDataValueException('prado_alias_invalid',$alias,$path); - } - public static function fatalError($msg) - { - echo '<h1>Fatal Error</h1>'; - echo '<p>'.$msg.'</p>'; - if(!function_exists('debug_backtrace')) - return; - echo '<h2>Debug Backtrace</h2>'; - echo '<pre>'; - $index=-1; - foreach(debug_backtrace() as $t) - { - $index++; - if($index==0) continue; - echo '#'.$index.' '; - if(isset($t['file'])) - echo basename($t['file']) . ':' . $t['line']; - else - echo '<PHP inner-code>'; - echo ' -- '; - if(isset($t['class'])) - echo $t['class'] . $t['type']; - echo $t['function'] . '('; - if(isset($t['args']) && sizeof($t['args']) > 0) - { - $count=0; - foreach($t['args'] as $item) - { - if(is_string($item)) - { - $str=htmlentities(str_replace("\r\n", "", $item), ENT_QUOTES); - if (strlen($item) > 70) - echo "'". substr($str, 0, 70) . "...'"; - else - echo "'" . $str . "'"; - } - else if (is_int($item) || is_float($item)) - echo $item; - else if (is_object($item)) - echo get_class($item); - else if (is_array($item)) - echo 'array(' . count($item) . ')'; - else if (is_bool($item)) - echo $item ? 'true' : 'false'; - else if ($item === null) - echo 'NULL'; - else if (is_resource($item)) - echo get_resource_type($item); - $count++; - if (count($t['args']) > $count) - echo ', '; - } - } - echo ")\n"; - } - echo '</pre>'; - exit(1); - } - public static function getUserLanguages() - { - static $languages=null; - if($languages===null) - { - if(!isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) - $languages[0]='en'; - else - { - $languages=array(); - foreach(explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']) as $language) - { - $array=explode(';q=',trim($language)); - $languages[trim($array[0])]=isset($array[1])?(float)$array[1]:1.0; - } - arsort($languages); - $languages=array_keys($languages); - if(empty($languages)) - $languages[0]='en'; - } - } - return $languages; - } - public static function getPreferredLanguage() - { - static $language=null; - if($language===null) - { - $langs=Prado::getUserLanguages(); - $lang=explode('-',$langs[0]); - if(empty($lang[0]) || !ctype_alpha($lang[0])) - $language='en'; - else - $language=$lang[0]; - } - return $language; - } - public static function trace($msg,$category='Uncategorized') - { - if(self::$_application && self::$_application->getMode()===TApplicationMode::Performance) - return; - if(!self::$_application || self::$_application->getMode()===TApplicationMode::Debug) - { - $trace=debug_backtrace(); - if(isset($trace[0]['file']) && isset($trace[0]['line'])) - $msg.=" (line {$trace[0]['line']}, {$trace[0]['file']})"; - $level=TLogger::DEBUG; - } - else - $level=TLogger::INFO; - self::log($msg,$level,$category); - } - public static function log($msg,$level=TLogger::INFO,$category='Uncategorized') - { - if(self::$_logger===null) - self::$_logger=new TLogger; - self::$_logger->log($msg,$level,$category); - } - public static function getLogger() - { - if(self::$_logger===null) - self::$_logger=new TLogger; - return self::$_logger; - } - public static function varDump($var,$depth=10,$highlight=false) - { - Prado::using('System.Util.TVarDumper'); - return TVarDumper::dump($var,$depth,$highlight); - } - public static function localize($text, $parameters=array(), $catalogue=null, $charset=null) - { - Prado::using('System.I18N.Translation'); - $app = Prado::getApplication()->getGlobalization(false); - $params = array(); - foreach($parameters as $key => $value) - $params['{'.$key.'}'] = $value; - if($app===null || ($config = $app->getTranslationConfiguration())===null) - return strtr($text, $params); - if ($catalogue===null) - $catalogue=isset($config['catalogue'])?$config['catalogue']:'messages'; - Translation::init($catalogue); - $appCharset = $app===null ? '' : $app->getCharset(); - $defaultCharset = ($app===null) ? 'UTF-8' : $app->getDefaultCharset(); - if(empty($charset)) $charset = $appCharset; - if(empty($charset)) $charset = $defaultCharset; - return Translation::formatter($catalogue)->format($text,$params,$catalogue,$charset); - } -} -class TReflectionClass extends ReflectionClass -{ -} -PradoBase::using('System.TComponent'); -PradoBase::using('System.Exceptions.TException'); -PradoBase::using('System.Util.TLogger'); -if(!class_exists('Prado',false)) -{ - class Prado extends PradoBase - { - } -} -spl_autoload_register(array('Prado','autoload')); -Prado::initErrorHandlers(); -interface IModule -{ - public function init($config); - public function getID(); - public function setID($id); -} -interface IService -{ - public function init($config); - public function getID(); - public function setID($id); - public function getEnabled(); - public function setEnabled($value); - public function run(); -} -interface ITextWriter -{ - public function write($str); - public function flush(); -} -interface IUser -{ - public function getName(); - public function setName($value); - public function getIsGuest(); - public function setIsGuest($value); - public function getRoles(); - public function setRoles($value); - public function isInRole($role); - public function saveToString(); - public function loadFromString($string); -} -interface IStatePersister -{ - public function load(); - public function save($state); -} -interface ICache -{ - public function get($id); - public function set($id,$value,$expire=0,$dependency=null); - public function add($id,$value,$expire=0,$dependency=null); - public function delete($id); - public function flush(); -} -interface ICacheDependency -{ - public function getHasChanged(); -} -interface IRenderable -{ - public function render($writer); -} -interface IBindable -{ - public function dataBind(); -} -interface IStyleable -{ - public function getHasStyle(); - public function getStyle(); - public function clearStyle(); -} -interface IActiveControl -{ - public function getActiveControl(); -} -interface ICallbackEventHandler -{ - public function raiseCallbackEvent($eventArgument); -} -interface IDataRenderer -{ - public function getData(); - public function setData($value); -} -class TApplicationComponent extends TComponent -{ - public function getApplication() - { - return Prado::getApplication(); - } - public function getService() - { - return Prado::getApplication()->getService(); - } - public function getRequest() - { - return Prado::getApplication()->getRequest(); - } - public function getResponse() - { - return Prado::getApplication()->getResponse(); - } - public function getSession() - { - return Prado::getApplication()->getSession(); - } - public function getUser() - { - return Prado::getApplication()->getUser(); - } - public function publishAsset($assetPath,$className=null) - { - if($className===null) - $className=get_class($this); - $class=new ReflectionClass($className); - $fullPath=dirname($class->getFileName()).DIRECTORY_SEPARATOR.$assetPath; - return $this->publishFilePath($fullPath); - } - public function publishFilePath($fullPath) - { - return Prado::getApplication()->getAssetManager()->publishFilePath($fullPath); - } -} -abstract class TModule extends TApplicationComponent implements IModule -{ - private $_id; - public function init($config) - { - } - public function getID() - { - return $this->_id; - } - public function setID($value) - { - $this->_id=$value; - } -} -abstract class TService extends TApplicationComponent implements IService -{ - private $_id; - private $_enabled=true; - public function init($config) - { - } - public function getID() - { - return $this->_id; - } - public function setID($value) - { - $this->_id=$value; - } - public function getEnabled() - { - return $this->_enabled; - } - public function setEnabled($value) - { - $this->_enabled=TPropertyValue::ensureBoolean($value); - } - public function run() - { - } -} -class TErrorHandler extends TModule -{ - const ERROR_FILE_NAME='error'; - const EXCEPTION_FILE_NAME='exception'; - const SOURCE_LINES=12; - private $_templatePath=null; - public function init($config) - { - $this->getApplication()->setErrorHandler($this); - } - public function getErrorTemplatePath() - { - if($this->_templatePath===null) - $this->_templatePath=Prado::getFrameworkPath().'/Exceptions/templates'; - return $this->_templatePath; - } - public function setErrorTemplatePath($value) - { - if(($templatePath=Prado::getPathOfNamespace($value))!==null && is_dir($templatePath)) - $this->_templatePath=$templatePath; - else - throw new TConfigurationException('errorhandler_errortemplatepath_invalid',$value); - } - public function handleError($sender,$param) - { - static $handling=false; - restore_error_handler(); - restore_exception_handler(); - if($handling) - $this->handleRecursiveError($param); - else - { - $handling=true; - if(($response=$this->getResponse())!==null) - $response->clear(); - if(!headers_sent()) - header('Content-Type: text/html; charset=UTF-8'); - if($param instanceof THttpException) - $this->handleExternalError($param->getStatusCode(),$param); - else if($this->getApplication()->getMode()===TApplicationMode::Debug) - $this->displayException($param); - else - $this->handleExternalError(500,$param); - } - } - protected function handleExternalError($statusCode,$exception) - { - if(!($exception instanceof THttpException)) - error_log($exception->__toString()); - $content=$this->getErrorTemplate($statusCode,$exception); - $serverAdmin=isset($_SERVER['SERVER_ADMIN'])?$_SERVER['SERVER_ADMIN']:''; - if($this->getApplication()->getMode()===TApplicationMode::Debug) - $version=$_SERVER['SERVER_SOFTWARE'].' <a href="http://www.pradosoft.com/">PRADO</a>/'.Prado::getVersion(); - else - $version=''; - $tokens=array( - '%%StatusCode%%' => "$statusCode", - '%%ErrorMessage%%' => htmlspecialchars($exception->getMessage()), - '%%ServerAdmin%%' => $serverAdmin, - '%%Version%%' => $version, - '%%Time%%' => @strftime('%Y-%m-%d %H:%M',time()) - ); - header("HTTP/1.0 $statusCode ".$exception->getMessage()); - echo strtr($content,$tokens); - } - protected function handleRecursiveError($exception) - { - if($this->getApplication()->getMode()===TApplicationMode::Debug) - { - echo "<html><head><title>Recursive Error</title></head>\n"; - echo "<body><h1>Recursive Error</h1>\n"; - echo "<pre>".$exception->__toString()."</pre>\n"; - echo "</body></html>"; - } - else - { - error_log("Error happened while processing an existing error:\n".$exception->__toString()); - header('HTTP/1.0 500 Internal Error'); - } - } - protected function displayException($exception) - { - if(php_sapi_name()==='cli') - { - echo $exception->getMessage()."\n"; - echo $exception->getTraceAsString(); - return; - } - if($exception instanceof TTemplateException) - { - $fileName=$exception->getTemplateFile(); - $lines=empty($fileName)?explode("\n",$exception->getTemplateSource()):@file($fileName); - $source=$this->getSourceCode($lines,$exception->getLineNumber()); - if($fileName==='') - $fileName='---embedded template---'; - $errorLine=$exception->getLineNumber(); - } - else - { - if(($trace=$this->getExactTrace($exception))!==null) - { - $fileName=$trace['file']; - $errorLine=$trace['line']; - } - else - { - $fileName=$exception->getFile(); - $errorLine=$exception->getLine(); - } - $source=$this->getSourceCode(@file($fileName),$errorLine); - } - if($this->getApplication()->getMode()===TApplicationMode::Debug) - $version=$_SERVER['SERVER_SOFTWARE'].' <a href="http://www.pradosoft.com/">PRADO</a>/'.Prado::getVersion(); - else - $version=''; - $tokens=array( - '%%ErrorType%%' => get_class($exception), - '%%ErrorMessage%%' => $this->addLink(htmlspecialchars($exception->getMessage())), - '%%SourceFile%%' => htmlspecialchars($fileName).' ('.$errorLine.')', - '%%SourceCode%%' => $source, - '%%StackTrace%%' => htmlspecialchars($exception->getTraceAsString()), - '%%Version%%' => $version, - '%%Time%%' => @strftime('%Y-%m-%d %H:%M',time()) - ); - $content=$this->getExceptionTemplate($exception); - echo strtr($content,$tokens); - } - protected function getExceptionTemplate($exception) - { - $lang=Prado::getPreferredLanguage(); - $exceptionFile=Prado::getFrameworkPath().'/Exceptions/templates/'.self::EXCEPTION_FILE_NAME.'-'.$lang.'.html'; - if(!is_file($exceptionFile)) - $exceptionFile=Prado::getFrameworkPath().'/Exceptions/templates/'.self::EXCEPTION_FILE_NAME.'.html'; - if(($content=@file_get_contents($exceptionFile))===false) - die("Unable to open exception template file '$exceptionFile'."); - return $content; - } - protected function getErrorTemplate($statusCode,$exception) - { - $base=$this->getErrorTemplatePath().DIRECTORY_SEPARATOR.self::ERROR_FILE_NAME; - $lang=Prado::getPreferredLanguage(); - if(is_file("$base$statusCode-$lang.html")) - $errorFile="$base$statusCode-$lang.html"; - else if(is_file("$base$statusCode.html")) - $errorFile="$base$statusCode.html"; - else if(is_file("$base-$lang.html")) - $errorFile="$base-$lang.html"; - else - $errorFile="$base.html"; - if(($content=@file_get_contents($errorFile))===false) - die("Unable to open error template file '$errorFile'."); - return $content; - } - private function getExactTrace($exception) - { - $trace=$exception->getTrace(); - $result=null; - if($exception instanceof TPhpErrorException) - $result=isset($trace[0]['file'])?$trace[0]:$trace[1]; - else if($exception instanceof TInvalidOperationException) - { - if(($result=$this->getPropertyAccessTrace($trace,'__get'))===null) - $result=$this->getPropertyAccessTrace($trace,'__set'); - } - if($result!==null && strpos($result['file'],': eval()\'d code')!==false) - return null; - return $result; - } - private function getPropertyAccessTrace($trace,$pattern) - { - $result=null; - foreach($trace as $t) - { - if(isset($t['function']) && $t['function']===$pattern) - $result=$t; - else - break; - } - return $result; - } - private function getSourceCode($lines,$errorLine) - { - $beginLine=$errorLine-self::SOURCE_LINES>=0?$errorLine-self::SOURCE_LINES:0; - $endLine=$errorLine+self::SOURCE_LINES<=count($lines)?$errorLine+self::SOURCE_LINES:count($lines); - $source=''; - for($i=$beginLine;$i<$endLine;++$i) - { - if($i===$errorLine-1) - { - $line=htmlspecialchars(sprintf("%04d: %s",$i+1,str_replace("\t",' ',$lines[$i]))); - $source.="<div class=\"error\">".$line."</div>"; - } - else - $source.=htmlspecialchars(sprintf("%04d: %s",$i+1,str_replace("\t",' ',$lines[$i]))); - } - return $source; - } - private function addLink($message) - { - $baseUrl='http://www.pradosoft.com/docs/classdoc'; - return preg_replace('/\b(T[A-Z]\w+)\b/',"<a href=\"$baseUrl/\${1}\" target=\"_blank\">\${1}</a>",$message); - } -} -class TList extends TComponent implements IteratorAggregate,ArrayAccess,Countable -{ - private $_d=array(); - private $_c=0; - private $_r=false; - public function __construct($data=null,$readOnly=false) - { - if($data!==null) - $this->copyFrom($data); - $this->setReadOnly($readOnly); - } - public function getReadOnly() - { - return $this->_r; - } - protected function setReadOnly($value) - { - $this->_r=TPropertyValue::ensureBoolean($value); - } - public function getIterator() - { - return new TListIterator($this->_d); - } - public function count() - { - return $this->getCount(); - } - public function getCount() - { - return $this->_c; - } - public function itemAt($index) - { - if($index>=0 && $index<$this->_c) - return $this->_d[$index]; - else - throw new TInvalidDataValueException('list_index_invalid',$index); - } - public function add($item) - { - $this->insertAt($this->_c,$item); - return $this->_c-1; - } - public function insertAt($index,$item) - { - if(!$this->_r) - { - if($index===$this->_c) - $this->_d[$this->_c++]=$item; - else if($index>=0 && $index<$this->_c) - { - array_splice($this->_d,$index,0,array($item)); - $this->_c++; - } - else - throw new TInvalidDataValueException('list_index_invalid',$index); - } - else - throw new TInvalidOperationException('list_readonly',get_class($this)); - } - public function remove($item) - { - if(($index=$this->indexOf($item))>=0) - { - $this->removeAt($index); - return $index; - } - else - throw new TInvalidDataValueException('list_item_inexistent'); - } - public function removeAt($index) - { - if(!$this->_r) - { - if($index>=0 && $index<$this->_c) - { - $this->_c--; - if($index===$this->_c) - return array_pop($this->_d); - else - { - $item=$this->_d[$index]; - array_splice($this->_d,$index,1); - return $item; - } - } - else - throw new TInvalidDataValueException('list_index_invalid',$index); - } - else - throw new TInvalidOperationException('list_readonly',get_class($this)); - } - public function clear() - { - for($i=$this->_c-1;$i>=0;--$i) - $this->removeAt($i); - } - public function contains($item) - { - return $this->indexOf($item)>=0; - } - public function indexOf($item) - { - if(($index=array_search($item,$this->_d,true))===false) - return -1; - else - return $index; - } - public function toArray() - { - return $this->_d; - } - public function copyFrom($data) - { - if(is_array($data) || ($data instanceof Traversable)) - { - if($this->_c>0) - $this->clear(); - foreach($data as $item) - $this->add($item); - } - else if($data!==null) - throw new TInvalidDataTypeException('list_data_not_iterable'); - } - public function mergeWith($data) - { - if(is_array($data) || ($data instanceof Traversable)) - { - foreach($data as $item) - $this->add($item); - } - else if($data!==null) - throw new TInvalidDataTypeException('list_data_not_iterable'); - } - public function offsetExists($offset) - { - return ($offset>=0 && $offset<$this->_c); - } - public function offsetGet($offset) - { - return $this->itemAt($offset); - } - public function offsetSet($offset,$item) - { - if($offset===null || $offset===$this->_c) - $this->insertAt($this->_c,$item); - else - { - $this->removeAt($offset); - $this->insertAt($offset,$item); - } - } - public function offsetUnset($offset) - { - $this->removeAt($offset); - } -} -class TListIterator implements Iterator -{ - private $_d; - private $_i; - private $_c; - public function __construct(&$data) - { - $this->_d=&$data; - $this->_i=0; - $this->_c=count($this->_d); - } - public function rewind() - { - $this->_i=0; - } - public function key() - { - return $this->_i; - } - public function current() - { - return $this->_d[$this->_i]; - } - public function next() - { - $this->_i++; - } - public function valid() - { - return $this->_i<$this->_c; - } -} -abstract class TCache extends TModule implements ICache, ArrayAccess -{ - private $_prefix=null; - private $_primary=true; - public function init($config) - { - if($this->_prefix===null) - $this->_prefix=$this->getApplication()->getUniqueID(); - if($this->_primary) - { - if($this->getApplication()->getCache()===null) - $this->getApplication()->setCache($this); - else - throw new TConfigurationException('cache_primary_duplicated',get_class($this)); - } - } - public function getPrimaryCache() - { - return $this->_primary; - } - public function setPrimaryCache($value) - { - $this->_primary=TPropertyValue::ensureBoolean($value); - } - public function getKeyPrefix() - { - return $this->_prefix; - } - public function setKeyPrefix($value) - { - $this->_prefix=$value; - } - protected function generateUniqueKey($key) - { - return md5($this->_prefix.$key); - } - public function get($id) - { - if(($value=$this->getValue($this->generateUniqueKey($id)))!==false) - { - $data=unserialize($value); - if(!is_array($data)) - return false; - if(!($data[1] instanceof ICacheDependency) || !$data[1]->getHasChanged()) - return $data[0]; - } - return false; - } - public function set($id,$value,$expire=0,$dependency=null) - { - if(empty($value) && $expire === 0) - $this->delete($id); - else - { - $data=array($value,$dependency); - return $this->setValue($this->generateUniqueKey($id),serialize($data),$expire); - } - } - 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); - } - public function delete($id) - { - return $this->deleteValue($this->generateUniqueKey($id)); - } - public function flush() - { - throw new TNotSupportedException('cache_flush_unsupported'); - } - abstract protected function getValue($key); - abstract protected function setValue($key,$value,$expire); - abstract protected function addValue($key,$value,$expire); - abstract protected function deleteValue($key); - public function offsetExists($id) - { - return $this->get($id) !== false; - } - public function offsetGet($id) - { - return $this->get($id); - } - public function offsetSet($id, $value) - { - $this->set($id, $value); - } - public function offsetUnset($id) - { - $this->delete($id); - } -} -abstract class TCacheDependency extends TComponent implements ICacheDependency -{ -} -class TFileCacheDependency extends TCacheDependency -{ - private $_fileName; - private $_timestamp; - public function __construct($fileName) - { - $this->setFileName($fileName); - } - public function getFileName() - { - return $this->_fileName; - } - public function setFileName($value) - { - $this->_fileName=$value; - $this->_timestamp=@filemtime($value); - } - public function getTimestamp() - { - return $this->_timestamp; - } - public function getHasChanged() - { - return @filemtime($this->_fileName)!==$this->_timestamp; - } -} -class TDirectoryCacheDependency extends TCacheDependency -{ - private $_recursiveCheck=true; - private $_recursiveLevel=-1; - private $_timestamps; - private $_directory; - public function __construct($directory) - { - $this->setDirectory($directory); - } - public function getDirectory() - { - return $this->_directory; - } - public function setDirectory($directory) - { - if(($path=realpath($directory))===false || !is_dir($path)) - throw new TInvalidDataValueException('directorycachedependency_directory_invalid',$directory); - $this->_directory=$path; - $this->_timestamps=$this->generateTimestamps($path); - } - public function getRecursiveCheck() - { - return $this->_recursiveCheck; - } - public function setRecursiveCheck($value) - { - $this->_recursiveCheck=TPropertyValue::ensureBoolean($value); - } - public function getRecursiveLevel() - { - return $this->_recursiveLevel; - } - public function setRecursiveLevel($value) - { - $this->_recursiveLevel=TPropertyValue::ensureInteger($value); - } - public function getHasChanged() - { - return $this->generateTimestamps($this->_directory)!=$this->_timestamps; - } - protected function validateFile($fileName) - { - return true; - } - protected function validateDirectory($directory) - { - return true; - } - protected function generateTimestamps($directory,$level=0) - { - if(($dir=opendir($directory))===false) - throw new TIOException('directorycachedependency_directory_invalid',$directory); - $timestamps=array(); - while(($file=readdir($dir))!==false) - { - $path=$directory.DIRECTORY_SEPARATOR.$file; - if($file==='.' || $file==='..') - continue; - else if(is_dir($path)) - { - if(($this->_recursiveLevel<0 || $level<$this->_recursiveLevel) && $this->validateDirectory($path)) - $timestamps=array_merge($this->generateTimestamps($path,$level+1)); - } - else if($this->validateFile($path)) - $timestamps[$path]=filemtime($path); - } - closedir($dir); - return $timestamps; - } -} -class TGlobalStateCacheDependency extends TCacheDependency -{ - private $_stateName; - private $_stateValue; - public function __construct($name) - { - $this->setStateName($name); - } - public function getStateName() - { - return $this->_stateName; - } - public function setStateName($value) - { - $this->_stateName=$value; - $this->_stateValue=Prado::getApplication()->getGlobalState($value); - } - public function getHasChanged() - { - return $this->_stateValue!==Prado::getApplication()->getGlobalState($this->_stateName); - } -} -class TChainedCacheDependency extends TCacheDependency -{ - private $_dependencies=null; - public function getDependencies() - { - if($this->_dependencies===null) - $this->_dependencies=new TCacheDependencyList; - return $this->_dependencies; - } - public function getHasChanged() - { - if($this->_dependencies!==null) - { - foreach($this->_dependencies as $dependency) - if($dependency->getHasChanged()) - return true; - } - return false; - } -} -class TApplicationStateCacheDependency extends TCacheDependency -{ - public function getHasChanged() - { - return Prado::getApplication()->getMode()!==TApplicationMode::Performance; - } -} -class TCacheDependencyList extends TList -{ - public function insertAt($index,$item) - { - if($item instanceof ICacheDependency) - parent::insertAt($index,$item); - else - throw new TInvalidDataTypeException('cachedependencylist_cachedependency_required'); - } -} -class TTextWriter extends TComponent implements ITextWriter -{ - private $_str=''; - public function flush() - { - $str=$this->_str; - $this->_str=''; - return $str; - } - public function write($str) - { - $this->_str.=$str; - } - public function writeLine($str='') - { - $this->write($str."\n"); - } -} -class TMap extends TComponent implements IteratorAggregate,ArrayAccess,Countable -{ - private $_d=array(); - private $_r=false; - public function __construct($data=null,$readOnly=false) - { - if($data!==null) - $this->copyFrom($data); - $this->setReadOnly($readOnly); - } - public function getReadOnly() - { - return $this->_r; - } - protected function setReadOnly($value) - { - $this->_r=TPropertyValue::ensureBoolean($value); - } - public function getIterator() - { - return new TMapIterator($this->_d); - } - public function count() - { - return $this->getCount(); - } - public function getCount() - { - return count($this->_d); - } - public function getKeys() - { - return array_keys($this->_d); - } - public function itemAt($key) - { - return isset($this->_d[$key]) ? $this->_d[$key] : null; - } - public function add($key,$value) - { - if(!$this->_r) - $this->_d[$key]=$value; - else - throw new TInvalidOperationException('map_readonly',get_class($this)); - } - public function remove($key) - { - if(!$this->_r) - { - if(isset($this->_d[$key]) || array_key_exists($key,$this->_d)) - { - $value=$this->_d[$key]; - unset($this->_d[$key]); - return $value; - } - else - return null; - } - else - throw new TInvalidOperationException('map_readonly',get_class($this)); - } - public function clear() - { - foreach(array_keys($this->_d) as $key) - $this->remove($key); - } - public function contains($key) - { - return isset($this->_d[$key]) || array_key_exists($key,$this->_d); - } - public function toArray() - { - return $this->_d; - } - public function copyFrom($data) - { - if(is_array($data) || $data instanceof Traversable) - { - if($this->getCount()>0) - $this->clear(); - foreach($data as $key=>$value) - $this->add($key,$value); - } - else if($data!==null) - throw new TInvalidDataTypeException('map_data_not_iterable'); - } - public function mergeWith($data) - { - if(is_array($data) || $data instanceof Traversable) - { - foreach($data as $key=>$value) - $this->add($key,$value); - } - else if($data!==null) - throw new TInvalidDataTypeException('map_data_not_iterable'); - } - public function offsetExists($offset) - { - return $this->contains($offset); - } - public function offsetGet($offset) - { - return $this->itemAt($offset); - } - public function offsetSet($offset,$item) - { - $this->add($offset,$item); - } - public function offsetUnset($offset) - { - $this->remove($offset); - } -} -class TMapIterator implements Iterator -{ - private $_d; - private $_keys; - private $_key; - public function __construct(&$data) - { - $this->_d=&$data; - $this->_keys=array_keys($data); - } - public function rewind() - { - $this->_key=reset($this->_keys); - } - public function key() - { - return $this->_key; - } - public function current() - { - return $this->_d[$this->_key]; - } - public function next() - { - $this->_key=next($this->_keys); - } - public function valid() - { - return $this->_key!==false; - } -} -class TStack extends TComponent implements IteratorAggregate,Countable -{ - private $_d=array(); - private $_c=0; - public function __construct($data=null) - { - if($data!==null) - $this->copyFrom($data); - } - public function toArray() - { - return $this->_d; - } - public function copyFrom($data) - { - if(is_array($data) || ($data instanceof Traversable)) - { - $this->clear(); - foreach($data as $item) - { - $this->_d[]=$item; - ++$this->_c; - } - } - else if($data!==null) - throw new TInvalidDataTypeException('stack_data_not_iterable'); - } - public function clear() - { - $this->_c=0; - $this->_d=array(); - } - public function contains($item) - { - return array_search($item,$this->_d,true)!==false; - } - public function peek() - { - if($this->_c===0) - throw new TInvalidOperationException('stack_empty'); - else - return $this->_d[$this->_c-1]; - } - public function pop() - { - if($this->_c===0) - throw new TInvalidOperationException('stack_empty'); - else - { - --$this->_c; - return array_pop($this->_d); - } - } - public function push($item) - { - ++$this->_c; - $this->_d[] = $item; - } - public function getIterator() - { - return new TStackIterator($this->_d); - } - public function getCount() - { - return $this->_c; - } - public function count() - { - return $this->getCount(); - } -} -class TStackIterator implements Iterator -{ - private $_d; - private $_i; - private $_c; - public function __construct(&$data) - { - $this->_d=&$data; - $this->_i=0; - $this->_c=count($this->_d); - } - public function rewind() - { - $this->_i=0; - } - public function key() - { - return $this->_i; - } - public function current() - { - return $this->_d[$this->_i]; - } - public function next() - { - $this->_i++; - } - public function valid() - { - return $this->_i<$this->_c; - } -} -class TXmlElement extends TComponent -{ - private $_parent=null; - private $_tagName='unknown'; - private $_value=''; - private $_elements=null; - private $_attributes=null; - public function __construct($tagName) - { - $this->setTagName($tagName); - } - public function getParent() - { - return $this->_parent; - } - public function setParent($parent) - { - $this->_parent=$parent; - } - public function getTagName() - { - return $this->_tagName; - } - public function setTagName($tagName) - { - $this->_tagName=$tagName; - } - public function getValue() - { - return $this->_value; - } - public function setValue($value) - { - $this->_value=$value; - } - public function getHasElement() - { - return $this->_elements!==null && $this->_elements->getCount()>0; - } - public function getHasAttribute() - { - return $this->_attributes!==null && $this->_attributes->getCount()>0; - } - public function getAttribute($name) - { - if($this->_attributes!==null) - return $this->_attributes->itemAt($name); - else - return null; - } - public function setAttribute($name,$value) - { - $this->getAttributes()->add($name,$value); - } - public function getElements() - { - if(!$this->_elements) - $this->_elements=new TXmlElementList($this); - return $this->_elements; - } - public function getAttributes() - { - if(!$this->_attributes) - $this->_attributes=new TMap; - return $this->_attributes; - } - public function getElementByTagName($tagName) - { - if($this->_elements) - { - foreach($this->_elements as $element) - if($element->_tagName===$tagName) - return $element; - } - return null; - } - public function getElementsByTagName($tagName) - { - $list=new TList; - if($this->_elements) - { - foreach($this->_elements as $element) - if($element->_tagName===$tagName) - $list->add($element); - } - return $list; - } - public function toString($indent=0) - { - $attr=''; - if($this->_attributes!==null) - { - foreach($this->_attributes as $name=>$value) - { - $value=$this->xmlEncode($value); - $attr.=" $name=\"$value\""; - } - } - $prefix=str_repeat(' ',$indent*4); - if($this->getHasElement()) - { - $str=$prefix."<{$this->_tagName}$attr>\n"; - foreach($this->getElements() as $element) - $str.=$element->toString($indent+1)."\n"; - $str.=$prefix."</{$this->_tagName}>"; - return $str; - } - else if(($value=$this->getValue())!=='') - { - $value=$this->xmlEncode($value); - return $prefix."<{$this->_tagName}$attr>$value</{$this->_tagName}>"; - } - else - return $prefix."<{$this->_tagName}$attr />"; - } - public function __toString() - { - return $this->toString(); - } - private function xmlEncode($str) - { - return strtr($str,array( - '>'=>'>', - '<'=>'<', - '&'=>'&', - '"'=>'"', - "\r"=>'
', - "\t"=>'	', - "\n"=>'
')); - } -} -class TXmlDocument extends TXmlElement -{ - private $_version; - private $_encoding; - public function __construct($version='1.0',$encoding='') - { - parent::__construct(''); - $this->setVersion($version); - $this->setEncoding($encoding); - } - public function getVersion() - { - return $this->_version; - } - public function setVersion($version) - { - $this->_version=$version; - } - public function getEncoding() - { - return $this->_encoding; - } - public function setEncoding($encoding) - { - $this->_encoding=$encoding; - } - public function loadFromFile($file) - { - if(($str=@file_get_contents($file))!==false) - return $this->loadFromString($str); - else - throw new TIOException('xmldocument_file_read_failed',$file); - } - public function loadFromString($string) - { - $doc=new DOMDocument(); - if($doc->loadXML($string)===false) - return false; - $this->setEncoding($doc->encoding); - $this->setVersion($doc->version); - $element=$doc->documentElement; - $this->setTagName($element->tagName); - $this->setValue($element->nodeValue); - $elements=$this->getElements(); - $attributes=$this->getAttributes(); - $elements->clear(); - $attributes->clear(); - static $bSimpleXml; - if($bSimpleXml === null) - $bSimpleXml = (boolean)function_exists('simplexml_load_string'); - if($bSimpleXml) - { - $simpleDoc = simplexml_load_string($string); - $docNamespaces = $simpleDoc->getDocNamespaces(false); - $simpleDoc = null; - foreach($docNamespaces as $prefix => $uri) - { - if($prefix === '') - $attributes->add('xmlns', $uri); - else - $attributes->add('xmlns:'.$prefix, $uri); - } - } - foreach($element->attributes as $name=>$attr) - $attributes->add(($attr->prefix === '' ? '' : $attr->prefix . ':') .$name,$attr->value); - foreach($element->childNodes as $child) - { - if($child instanceof DOMElement) - $elements->add($this->buildElement($child)); - } - return true; - } - public function saveToFile($file) - { - if(($fw=fopen($file,'w'))!==false) - { - fwrite($fw,$this->saveToString()); - fclose($fw); - } - else - throw new TIOException('xmldocument_file_write_failed',$file); - } - public function saveToString() - { - $version=empty($this->_version)?' version="1.0"':' version="'.$this->_version.'"'; - $encoding=empty($this->_encoding)?'':' encoding="'.$this->_encoding.'"'; - return "<?xml{$version}{$encoding}?>\n".$this->toString(0); - } - public function __toString() - { - return $this->saveToString(); - } - private function buildElement($node) - { - $element=new TXmlElement($node->tagName); - $element->setValue($node->nodeValue); - foreach($node->attributes as $name=>$attr) - $element->getAttributes()->add(($attr->prefix === '' ? '' : $attr->prefix . ':') . $name,$attr->value); - foreach($node->childNodes as $child) - { - if($child instanceof DOMElement) - $element->getElements()->add($this->buildElement($child)); - } - return $element; - } -} -class TXmlElementList extends TList -{ - private $_o; - public function __construct(TXmlElement $owner) - { - $this->_o=$owner; - } - protected function getOwner() - { - return $this->_o; - } - public function insertAt($index,$item) - { - if($item instanceof TXmlElement) - { - parent::insertAt($index,$item); - if($item->getParent()!==null) - $item->getParent()->getElements()->remove($item); - $item->setParent($this->_o); - } - else - throw new TInvalidDataTypeException('xmlelementlist_xmlelement_required'); - } - public function removeAt($index) - { - $item=parent::removeAt($index); - if($item instanceof TXmlElement) - $item->setParent(null); - return $item; - } -} -class TAuthorizationRule extends TComponent -{ - private $_action; - private $_users; - private $_roles; - private $_verb; - private $_ipRules; - private $_everyone; - private $_guest; - private $_authenticated; - public function __construct($action,$users,$roles,$verb='',$ipRules='') - { - $action=strtolower(trim($action)); - if($action==='allow' || $action==='deny') - $this->_action=$action; - else - throw new TInvalidDataValueException('authorizationrule_action_invalid',$action); - $this->_users=array(); - $this->_roles=array(); - $this->_ipRules=array(); - $this->_everyone=false; - $this->_guest=false; - $this->_authenticated=false; - if(trim($users)==='') - $users='*'; - foreach(explode(',',$users) as $user) - { - if(($user=trim(strtolower($user)))!=='') - { - if($user==='*') - { - $this->_everyone=true; - break; - } - else if($user==='?') - $this->_guest=true; - else if($user==='@') - $this->_authenticated=true; - else - $this->_users[]=$user; - } - } - if(trim($roles)==='') - $roles='*'; - foreach(explode(',',$roles) as $role) - { - if(($role=trim(strtolower($role)))!=='') - $this->_roles[]=$role; - } - if(($verb=trim(strtolower($verb)))==='') - $verb='*'; - if($verb==='*' || $verb==='get' || $verb==='post') - $this->_verb=$verb; - else - throw new TInvalidDataValueException('authorizationrule_verb_invalid',$verb); - if(trim($ipRules)==='') - $ipRules='*'; - foreach(explode(',',$ipRules) as $ipRule) - { - if(($ipRule=trim($ipRule))!=='') - $this->_ipRules[]=$ipRule; - } - } - public function getAction() - { - return $this->_action; - } - public function getUsers() - { - return $this->_users; - } - public function getRoles() - { - return $this->_roles; - } - public function getVerb() - { - return $this->_verb; - } - public function getIPRules() - { - return $this->_ipRules; - } - public function getGuestApplied() - { - return $this->_guest || $this->_everyone; - } - public function getEveryoneApplied() - { - return $this->_everyone; - } - public function getAuthenticatedApplied() - { - return $this->_authenticated || $this->_everyone; - } - public function isUserAllowed(IUser $user,$verb,$ip) - { - if($this->isVerbMatched($verb) && $this->isIpMatched($ip) && $this->isUserMatched($user) && $this->isRoleMatched($user)) - return ($this->_action==='allow')?1:-1; - else - return 0; - } - private function isIpMatched($ip) - { - if(empty($this->_ipRules)) - return 1; - foreach($this->_ipRules as $rule) - { - if($rule==='*' || $rule===$ip || (($pos=strpos($rule,'*'))!==false && strncmp($ip,$rule,$pos)===0)) - return 1; - } - return 0; - } - private function isUserMatched($user) - { - return ($this->_everyone || ($this->_guest && $user->getIsGuest()) || ($this->_authenticated && !$user->getIsGuest()) || in_array(strtolower($user->getName()),$this->_users)); - } - private function isRoleMatched($user) - { - foreach($this->_roles as $role) - { - if($role==='*' || $user->isInRole($role)) - return true; - } - return false; - } - private function isVerbMatched($verb) - { - return ($this->_verb==='*' || strcasecmp($verb,$this->_verb)===0); - } -} -class TAuthorizationRuleCollection extends TList -{ - public function isUserAllowed($user,$verb,$ip) - { - if($user instanceof IUser) - { - $verb=strtolower(trim($verb)); - foreach($this as $rule) - { - if(($decision=$rule->isUserAllowed($user,$verb,$ip))!==0) - return ($decision>0); - } - return true; - } - else - return false; - } - public function insertAt($index,$item) - { - if($item instanceof TAuthorizationRule) - parent::insertAt($index,$item); - else - throw new TInvalidDataTypeException('authorizationrulecollection_authorizationrule_required'); - } -} -class TSecurityManager extends TModule -{ - const STATE_VALIDATION_KEY='prado:securitymanager:validationkey'; - const STATE_ENCRYPTION_KEY='prado:securitymanager:encryptionkey'; - private $_validationKey=null; - private $_encryptionKey=null; - private $_validation=TSecurityManagerValidationMode::SHA1; - private $_encryption='3DES'; - public function init($config) - { - $this->getApplication()->setSecurityManager($this); - } - protected function generateRandomKey() - { - return rand().rand().rand().rand(); - } - public function getValidationKey() - { - if($this->_validationKey===null) - { - if(($this->_validationKey=$this->getApplication()->getGlobalState(self::STATE_VALIDATION_KEY))===null) - { - $this->_validationKey=$this->generateRandomKey(); - $this->getApplication()->setGlobalState(self::STATE_VALIDATION_KEY,$this->_validationKey,null); - } - } - return $this->_validationKey; - } - public function setValidationKey($value) - { - if($value!=='') - $this->_validationKey=$value; - else - throw new TInvalidDataValueException('securitymanager_validationkey_invalid'); - } - public function getEncryptionKey() - { - if($this->_encryptionKey===null) - { - if(($this->_encryptionKey=$this->getApplication()->getGlobalState(self::STATE_ENCRYPTION_KEY))===null) - { - $this->_encryptionKey=$this->generateRandomKey(); - $this->getApplication()->setGlobalState(self::STATE_ENCRYPTION_KEY,$this->_encryptionKey,null); - } - } - return $this->_encryptionKey; - } - public function setEncryptionKey($value) - { - if($value!=='') - $this->_encryptionKey=$value; - else - throw new TInvalidDataValueException('securitymanager_encryptionkey_invalid'); - } - public function getValidation() - { - return $this->_validation; - } - public function setValidation($value) - { - $this->_validation=TPropertyValue::ensureEnum($value,'TSecurityManagerValidationMode'); - } - public function getEncryption() - { - return $this->_encryption; - } - public function setEncryption($value) - { - throw new TNotSupportedException('Currently only 3DES encryption is supported'); - } - public function encrypt($data) - { - if(function_exists('mcrypt_encrypt')) - { - $module=mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); - $key=substr(md5($this->getEncryptionKey()),0,mcrypt_enc_get_key_size($module)); - srand(); - $iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($module), MCRYPT_RAND); - mcrypt_generic_init($module,$key,$iv); - $encrypted=$iv.mcrypt_generic($module,$data); - mcrypt_generic_deinit($module); - mcrypt_module_close($module); - return $encrypted; - } - else - throw new TNotSupportedException('securitymanager_mcryptextension_required'); - } - public function decrypt($data) - { - if(function_exists('mcrypt_decrypt')) - { - $module=mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, ''); - $key=substr(md5($this->getEncryptionKey()),0,mcrypt_enc_get_key_size($module)); - $ivSize=mcrypt_enc_get_iv_size($module); - $iv=substr($data,0,$ivSize); - mcrypt_generic_init($module,$key,$iv); - $decrypted=mdecrypt_generic($module,substr($data,$ivSize)); - mcrypt_generic_deinit($module); - mcrypt_module_close($module); - return rtrim($decrypted,"\0"); - } - else - throw new TNotSupportedException('securitymanager_mcryptextension_required'); - } - public function hashData($data) - { - $hmac=$this->computeHMAC($data); - return $hmac.$data; - } - public function validateData($data) - { - $len=$this->_validation==='SHA1'?40:32; - if(strlen($data)>=$len) - { - $hmac=substr($data,0,$len); - $data2=substr($data,$len); - return $hmac===$this->computeHMAC($data2)?$data2:false; - } - else - return false; - } - protected function computeHMAC($data) - { - if($this->_validation==='SHA1') - { - $pack='H40'; - $func='sha1'; - } - else - { - $pack='H32'; - $func='md5'; - } - $key=$this->getValidationKey(); - $key=str_pad($func($key), 64, chr(0)); - return $func((str_repeat(chr(0x5C), 64) ^ substr($key, 0, 64)) . pack($pack, $func((str_repeat(chr(0x36), 64) ^ substr($key, 0, 64)) . $data))); - } -} -class TSecurityManagerValidationMode extends TEnumerable -{ - const MD5='MD5'; - const SHA1='SHA1'; -} -class THttpUtility -{ - private static $_encodeTable=array('<'=>'<','>'=>'>','"'=>'"'); - private static $_decodeTable=array('<'=>'<','>'=>'>','"'=>'"'); - public static function htmlEncode($s) - { - return strtr($s,self::$_encodeTable); - } - public static function htmlDecode($s) - { - return strtr($s,self::$_decodeTable); - } -} -class TJavaScript -{ - private static $_json; - public static function renderScriptFiles($files) - { - $str=''; - foreach($files as $file) - $str.= self::renderScriptFile($file); - return $str; - } - public static function renderScriptFile($file) - { - return '<script type="text/javascript" src="'.THttpUtility::htmlEncode($file)."\"></script>\n"; - } - public static function renderScriptBlocks($scripts) - { - if(count($scripts)) - return "<script type=\"text/javascript\">\n/*<![CDATA[*/\n".implode("\n",$scripts)."\n/*]]>*/\n</script>\n"; - else - return ''; - } - public static function renderScriptBlock($script) - { - return "<script type=\"text/javascript\">\n/*<![CDATA[*/\n{$script}\n/*]]>*/\n</script>\n"; - } - public static function quoteString($js,$forUrl=false) - { - if($forUrl) - return strtr($js,array('%'=>'%25',"\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\')); - else - return strtr($js,array("\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\')); - } - public static function quoteFunction($js) - { - if(self::isFunction($js)) - return $js; - else - return 'javascript:'.$js; - } - public static function isFunction($js) - { - return preg_match('/^\s*javascript:/i', $js); - } - public static function encode($value,$toMap=true,$encodeEmptyStrings=false) - { - if(is_string($value)) - { - if(($n=strlen($value))>2) - { - $first=$value[0]; - $last=$value[$n-1]; - if(($first==='[' && $last===']') || ($first==='{' && $last==='}')) - return $value; - } - if(self::isFunction($value)) - return preg_replace('/^\s*javascript:/', '', $value); - else - return "'".self::quoteString($value)."'"; - } - else if(is_bool($value)) - return $value?'true':'false'; - else if(is_array($value)) - { - $results=''; - if(($n=count($value))>0 && array_keys($value)!==range(0,$n-1)) - { - foreach($value as $k=>$v) - { - if($v!=='' || $encodeEmptyStrings) - { - if($results!=='') - $results.=','; - $results.="'$k':".self::encode($v,$toMap,$encodeEmptyStrings); - } - } - return '{'.$results.'}'; - } - else - { - foreach($value as $v) - { - if($v!=='' || $encodeEmptyStrings) - { - if($results!=='') - $results.=','; - $results.=self::encode($v,$toMap, $encodeEmptyStrings); - } - } - return '['.$results.']'; - } - } - else if(is_integer($value)) - return "$value"; - else if(is_float($value)) - { - if($value===-INF) - return 'Number.NEGATIVE_INFINITY'; - else if($value===INF) - return 'Number.POSITIVE_INFINITY'; - else - return "$value"; - } - else if(is_object($value)) - return self::encode(get_object_vars($value),$toMap); - else if($value===null) - return 'null'; - else - return ''; - } - public static function jsonEncode($value) - { - if(self::$_json === null) - self::$_json = Prado::createComponent('System.Web.Javascripts.TJSON'); - return self::$_json->encode($value); - } - public static function jsonDecode($value) - { - if(self::$_json === null) - self::$_json = Prado::createComponent('System.Web.Javascripts.TJSON'); - return self::$_json->decode($value); - } -} -class TUrlManager extends TModule -{ - public function constructUrl($serviceID,$serviceParam,$getItems,$encodeAmpersand,$encodeGetItems) - { - $url=$serviceID.'='.urlencode($serviceParam); - $amp=$encodeAmpersand?'&':'&'; - $request=$this->getRequest(); - if(is_array($getItems) || $getItems instanceof Traversable) - { - if($encodeGetItems) - { - foreach($getItems as $name=>$value) - { - if(is_array($value)) - { - $name=urlencode($name.'[]'); - foreach($value as $v) - $url.=$amp.$name.'='.urlencode($v); - } - else - $url.=$amp.urlencode($name).'='.urlencode($value); - } - } - else - { - foreach($getItems as $name=>$value) - { - if(is_array($value)) - { - foreach($value as $v) - $url.=$amp.$name.'[]='.$v; - } - else - $url.=$amp.$name.'='.$value; - } - } - } - if($request->getUrlFormat()===THttpRequestUrlFormat::Path) - return $request->getApplicationUrl().'/'.strtr($url,array($amp=>'/','?'=>'/','='=>$request->getUrlParamSeparator())); - else - return $request->getApplicationUrl().'?'.$url; - } - public function parseUrl() - { - $request=$this->getRequest(); - $pathInfo=trim($request->getPathInfo(),'/'); - if($request->getUrlFormat()===THttpRequestUrlFormat::Path && $pathInfo!=='') - { - $separator=$request->getUrlParamSeparator(); - $paths=explode('/',$pathInfo); - $getVariables=array(); - foreach($paths as $path) - { - if(($path=trim($path))!=='') - { - if(($pos=strpos($path,$separator))!==false) - { - $name=substr($path,0,$pos); - $value=substr($path,$pos+1); - if(($pos=strpos($name,'[]'))!==false) - $getVariables[substr($name,0,$pos)][]=$value; - else - $getVariables[$name]=$value; - } - else - $getVariables[$path]=''; - } - } - return $getVariables; - } - else - return array(); - } -} -class THttpRequest extends TApplicationComponent implements IteratorAggregate,ArrayAccess,Countable,IModule -{ - private $_urlManager=null; - private $_urlManagerID=''; - private $_separator=','; - private $_serviceID=null; - private $_serviceParam=null; - private $_cookies=null; - private $_requestUri; - private $_pathInfo; - private $_cookieOnly=false; - private $_urlFormat=THttpRequestUrlFormat::Get; - private $_services; - private $_requestResolved=false; - private $_enableCookieValidation=false; - private $_url=null; - private $_id; - private $_items=array(); - public function getID() - { - return $this->_id; - } - public function setID($value) - { - $this->_id=$value; - } - public function init($config) - { - if(empty($this->_urlManagerID)) - { - $this->_urlManager=new TUrlManager; - $this->_urlManager->init(null); - } - else - { - $this->_urlManager=$this->getApplication()->getModule($this->_urlManagerID); - if($this->_urlManager===null) - throw new TConfigurationException('httprequest_urlmanager_inexist',$this->_urlManagerID); - if(!($this->_urlManager instanceof TUrlManager)) - throw new TConfigurationException('httprequest_urlmanager_invalid',$this->_urlManagerID); - } - if(php_sapi_name()==='cli') - { - $_SERVER['REMOTE_ADDR']='127.0.0.1'; - $_SERVER['REQUEST_METHOD']='GET'; - $_SERVER['SERVER_NAME']='localhost'; - $_SERVER['SERVER_PORT']=80; - $_SERVER['HTTP_USER_AGENT']=''; - } - $this->_cookieOnly=(int)ini_get('session.use_cookies') && (int)ini_get('session.use_only_cookies'); - if(isset($_SERVER['REQUEST_URI'])) - $this->_requestUri=$_SERVER['REQUEST_URI']; - else $this->_requestUri=$_SERVER['SCRIPT_NAME'].(empty($_SERVER['QUERY_STRING'])?'':'?'.$_SERVER['QUERY_STRING']); - if(isset($_SERVER['PATH_INFO'])) - $this->_pathInfo=$_SERVER['PATH_INFO']; - else if(strpos($_SERVER['PHP_SELF'],$_SERVER['SCRIPT_NAME'])===0 && $_SERVER['PHP_SELF']!==$_SERVER['SCRIPT_NAME']) - $this->_pathInfo=substr($_SERVER['PHP_SELF'],strlen($_SERVER['SCRIPT_NAME'])); - else - $this->_pathInfo=''; - if(get_magic_quotes_gpc()) - { - if(isset($_GET)) - $_GET=$this->stripSlashes($_GET); - if(isset($_POST)) - $_POST=$this->stripSlashes($_POST); - if(isset($_REQUEST)) - $_REQUEST=$this->stripSlashes($_REQUEST); - if(isset($_COOKIE)) - $_COOKIE=$this->stripSlashes($_COOKIE); - } - $this->getApplication()->setRequest($this); - } - public function stripSlashes(&$data) - { - return is_array($data)?array_map(array($this,'stripSlashes'),$data):stripslashes($data); - } - public function getUrl() - { - if($this->_url===null) - { - $secure=$this->getIsSecureConnection(); - $url=$secure?'https://':'http://'; - if(empty($_SERVER['HTTP_HOST'])) - { - $url.=$_SERVER['SERVER_NAME']; - $port=$_SERVER['SERVER_PORT']; - if(($port!=80 && !$secure) || ($port!=443 && $secure)) - $url.=':'.$port; - } - else - $url.=$_SERVER['HTTP_HOST']; - $url.=$this->getRequestUri(); - $this->_url=new TUri($url); - } - return $this->_url; - } - public function getUrlManager() - { - return $this->_urlManagerID; - } - public function setUrlManager($value) - { - $this->_urlManagerID=$value; - } - public function getUrlManagerModule() - { - return $this->_urlManager; - } - public function getUrlFormat() - { - return $this->_urlFormat; - } - public function setUrlFormat($value) - { - $this->_urlFormat=TPropertyValue::ensureEnum($value,'THttpRequestUrlFormat'); - } - public function getUrlParamSeparator() - { - return $this->_separator; - } - public function setUrlParamSeparator($value) - { - if(strlen($value)===1) - $this->_separator=$value; - else - throw new TInvalidDataValueException('httprequest_separator_invalid'); - } - public function getRequestType() - { - return $_SERVER['REQUEST_METHOD']; - } - public function getIsSecureConnection() - { - return isset($_SERVER['HTTPS']) && strcasecmp($_SERVER['HTTPS'],'off'); - } - public function getPathInfo() - { - return $this->_pathInfo; - } - public function getQueryString() - { - return isset($_SERVER['QUERY_STRING'])?$_SERVER['QUERY_STRING']:''; - } - public function getHttpProtocolVersion () - { - return isset($_SERVER['SERVER_PROTOCOL'])?$_SERVER['SERVER_PROTOCOL']:''; - } - public function getRequestUri() - { - return $this->_requestUri; - } - public function getBaseUrl($forceSecureConnection=false) - { - $url=$this->getUrl(); - $scheme=($forceSecureConnection)?"https":$url->getScheme(); - $host=$url->getHost(); - if (($port=$url->getPort())) $host.=':'.$port; - return $scheme.'://'.$host; - } - public function getApplicationUrl() - { - return $_SERVER['SCRIPT_NAME']; - } - public function getAbsoluteApplicationUrl($forceSecureConnection=false) - { - return $this->getBaseUrl($forceSecureConnection) . $this->getApplicationUrl(); - } - public function getApplicationFilePath() - { - return realpath($_SERVER['SCRIPT_FILENAME']); - } - public function getServerName() - { - return $_SERVER['SERVER_NAME']; - } - public function getServerPort() - { - return $_SERVER['SERVER_PORT']; - } - public function getUrlReferrer() - { - return isset($_SERVER['HTTP_REFERER'])?$_SERVER['HTTP_REFERER']:null; - } - public function getBrowser() - { - try - { - return get_browser(); - } - catch(TPhpErrorException $e) - { - throw new TConfigurationException('httprequest_browscap_required'); - } - } - public function getUserAgent() - { - return $_SERVER['HTTP_USER_AGENT']; - } - public function getUserHostAddress() - { - return $_SERVER['REMOTE_ADDR']; - } - public function getUserHost() - { - return isset($_SERVER['REMOTE_HOST'])?$_SERVER['REMOTE_HOST']:null; - } - public function getAcceptTypes() - { - return $_SERVER['HTTP_ACCEPT']; - } - public function getUserLanguages() - { - return Prado::getUserLanguages(); - } - public function getEnableCookieValidation() - { - return $this->_enableCookieValidation; - } - public function setEnableCookieValidation($value) - { - $this->_enableCookieValidation=TPropertyValue::ensureBoolean($value); - } - public function getCookies() - { - if($this->_cookies===null) - { - $this->_cookies=new THttpCookieCollection; - if($this->getEnableCookieValidation()) - { - $sm=$this->getApplication()->getSecurityManager(); - foreach($_COOKIE as $key=>$value) - { - if(($value=$sm->validateData($value))!==false) - $this->_cookies->add(new THttpCookie($key,$value)); - } - } - else - { - foreach($_COOKIE as $key=>$value) - $this->_cookies->add(new THttpCookie($key,$value)); - } - } - return $this->_cookies; - } - public function getUploadedFiles() - { - return $_FILES; - } - public function getServerVariables() - { - return $_SERVER; - } - public function getEnvironmentVariables() - { - return $_ENV; - } - public function constructUrl($serviceID,$serviceParam,$getItems=null,$encodeAmpersand=true,$encodeGetItems=true) - { - $url=$this->_urlManager->constructUrl($serviceID,$serviceParam,$getItems,$encodeAmpersand,$encodeGetItems); - if(defined('SID') && SID != '' && !$this->_cookieOnly) - return $url . (strpos($url,'?')===false? '?' : ($encodeAmpersand?'&':'&')) . SID; - else - return $url; - } - protected function parseUrl() - { - return $this->_urlManager->parseUrl(); - } - public function resolveRequest($serviceIDs) - { - $getParams=$this->parseUrl(); - foreach($getParams as $name=>$value) - $_GET[$name]=$value; - $this->_items=array_merge($_GET,$_POST); - $this->_requestResolved=true; - foreach($serviceIDs as $serviceID) - { - if($this->contains($serviceID)) - { - $this->setServiceID($serviceID); - $this->setServiceParameter($this->itemAt($serviceID)); - return $serviceID; - } - } - return null; - } - public function getRequestResolved() - { - return $this->_requestResolved; - } - public function getServiceID() - { - return $this->_serviceID; - } - public function setServiceID($value) - { - $this->_serviceID=$value; - } - public function getServiceParameter() - { - return $this->_serviceParam; - } - public function setServiceParameter($value) - { - $this->_serviceParam=$value; - } - public function getIterator() - { - return new TMapIterator($this->_items); - } - public function getCount() - { - return count($this->_items); - } - public function count() - { - return $this->getCount(); - } - public function getKeys() - { - return array_keys($this->_items); - } - public function itemAt($key) - { - return isset($this->_items[$key]) ? $this->_items[$key] : null; - } - public function add($key,$value) - { - $this->_items[$key]=$value; - } - public function remove($key) - { - if(isset($this->_items[$key]) || array_key_exists($key,$this->_items)) - { - $value=$this->_items[$key]; - unset($this->_items[$key]); - return $value; - } - else - return null; - } - public function clear() - { - foreach(array_keys($this->_items) as $key) - $this->remove($key); - } - public function contains($key) - { - return isset($this->_items[$key]) || array_key_exists($key,$this->_items); - } - public function toArray() - { - return $this->_items; - } - public function offsetExists($offset) - { - return $this->contains($offset); - } - public function offsetGet($offset) - { - return $this->itemAt($offset); - } - public function offsetSet($offset,$item) - { - $this->add($offset,$item); - } - public function offsetUnset($offset) - { - $this->remove($offset); - } -} -class THttpCookieCollection extends TList -{ - private $_o; - public function __construct($owner=null) - { - $this->_o=$owner; - } - public function insertAt($index,$item) - { - if($item instanceof THttpCookie) - { - parent::insertAt($index,$item); - if($this->_o instanceof THttpResponse) - $this->_o->addCookie($item); - } - else - throw new TInvalidDataTypeException('httpcookiecollection_httpcookie_required'); - } - public function removeAt($index) - { - $item=parent::removeAt($index); - if($this->_o instanceof THttpResponse) - $this->_o->removeCookie($item); - return $item; - } - public function itemAt($index) - { - if(is_integer($index)) - return parent::itemAt($index); - else - return $this->findCookieByName($index); - } - public function findCookieByName($name) - { - foreach($this as $cookie) - if($cookie->getName()===$name) - return $cookie; - return null; - } -} -class THttpCookie extends TComponent -{ - private $_domain=''; - private $_name; - private $_value=''; - private $_expire=0; - private $_path='/'; - private $_secure=false; - public function __construct($name,$value) - { - $this->_name=$name; - $this->_value=$value; - } - public function getDomain() - { - return $this->_domain; - } - public function setDomain($value) - { - $this->_domain=$value; - } - public function getExpire() - { - return $this->_expire; - } - public function setExpire($value) - { - $this->_expire=TPropertyValue::ensureInteger($value); - } - public function getName() - { - return $this->_name; - } - public function setName($value) - { - $this->_name=$value; - } - public function getValue() - { - return $this->_value; - } - public function setValue($value) - { - $this->_value=$value; - } - public function getPath() - { - return $this->_path; - } - public function setPath($value) - { - $this->_path=$value; - } - public function getSecure() - { - return $this->_secure; - } - public function setSecure($value) - { - $this->_secure=TPropertyValue::ensureBoolean($value); - } -} -class TUri extends TComponent -{ - private static $_defaultPort=array( - 'ftp'=>21, - 'gopher'=>70, - 'http'=>80, - 'https'=>443, - 'news'=>119, - 'nntp'=>119, - 'wais'=>210, - 'telnet'=>23 - ); - private $_scheme; - private $_host; - private $_port; - private $_user; - private $_pass; - private $_path; - private $_query; - private $_fragment; - private $_uri; - public function __construct($uri) - { - if(($ret=@parse_url($uri))!==false) - { - $this->_scheme=isset($ret['scheme'])?$ret['scheme']:''; - $this->_host=isset($ret['host'])?$ret['host']:''; - $this->_port=isset($ret['port'])?$ret['port']:''; - $this->_user=isset($ret['user'])?$ret['user']:''; - $this->_pass=isset($ret['pass'])?$ret['pass']:''; - $this->_path=isset($ret['path'])?$ret['path']:''; - $this->_query=isset($ret['query'])?$ret['query']:''; - $this->_fragment=isset($ret['fragment'])?$ret['fragment']:''; - $this->_uri=$uri; - } - else - { - throw new TInvalidDataValueException('uri_format_invalid',$uri); - } - } - public function getUri() - { - return $this->_uri; - } - public function getScheme() - { - return $this->_scheme; - } - public function getHost() - { - return $this->_host; - } - public function getPort() - { - return $this->_port; - } - public function getUser() - { - return $this->_user; - } - public function getPassword() - { - return $this->_pass; - } - public function getPath() - { - return $this->_path; - } - public function getQuery() - { - return $this->_query; - } - public function getFragment() - { - return $this->_fragment; - } -} -class THttpRequestUrlFormat extends TEnumerable -{ - const Get='Get'; - const Path='Path'; -} -class THttpResponseAdapter extends TApplicationComponent -{ - private $_response; - public function __construct($response) - { - $this->_response=$response; - } - public function getResponse() - { - return $this->_response; - } - public function flushContent() - { - $this->_response->flushContent(); - } - public function httpRedirect($url) - { - $this->_response->httpRedirect($url); - } - public function createNewHtmlWriter($type, $writer) - { - return $this->_response->createNewHtmlWriter($type,$writer); - } -} -class THttpResponse extends TModule implements ITextWriter -{ - private static $HTTP_STATUS_CODES = array( - 100 => 'Continue', 101 => 'Switching Protocols', - 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', - 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 307 => 'Temporary Redirect', - 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Time-out', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Request Entity Too Large', 414 => 'Request-URI Too Large', 415 => 'Unsupported Media Type', 416 => 'Requested range not satisfiable', 417 => 'Expectation Failed', - 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Time-out', 505 => 'HTTP Version not supported' - ); - private $_bufferOutput=true; - private $_initialized=false; - private $_cookies=null; - private $_status=200; - private $_reason='OK'; - private $_htmlWriterType='System.Web.UI.THtmlWriter'; - private $_contentType=null; - private $_charset=''; - private $_adapter; - public function __destruct() - { - } - public function setAdapter(THttpResponseAdapter $adapter) - { - $this->_adapter=$adapter; - } - public function getAdapter() - { - return $this->_adapter; - } - public function getHasAdapter() - { - return $this->_adapter!==null; - } - public function init($config) - { - if($this->_bufferOutput) - ob_start(); - $this->_initialized=true; - $this->getApplication()->setResponse($this); - } - public function getCacheExpire() - { - return session_cache_expire(); - } - public function setCacheExpire($value) - { - session_cache_expire(TPropertyValue::ensureInteger($value)); - } - public function getCacheControl() - { - return session_cache_limiter(); - } - public function setCacheControl($value) - { - session_cache_limiter(TPropertyValue::ensureEnum($value,array('none','nocache','private','private_no_expire','public'))); - } - public function setContentType($type) - { - $this->_contentType = $type; - } - public function getContentType() - { - return $this->_contentType; - } - public function getCharset() - { - return $this->_charset; - } - public function setCharset($charset) - { - $this->_charset = $charset; - } - public function getBufferOutput() - { - return $this->_bufferOutput; - } - public function setBufferOutput($value) - { - if($this->_initialized) - throw new TInvalidOperationException('httpresponse_bufferoutput_unchangeable'); - else - $this->_bufferOutput=TPropertyValue::ensureBoolean($value); - } - public function getStatusCode() - { - return $this->_status; - } - public function setStatusCode($status, $reason=null) - { - $status=TPropertyValue::ensureInteger($status); - if(isset(self::$HTTP_STATUS_CODES[$status])) { - $this->_reason=self::$HTTP_STATUS_CODES[$status]; - }else{ - if($reason===null || $reason==='') { - throw new TInvalidDataValueException("response_status_reason_missing"); - } - $reason=TPropertyValue::ensureString($reason); - if(strpos($reason, "\r")!=false || strpos($reason, "\n")!=false) { - throw new TInvalidDataValueException("response_status_reason_barchars"); - } - $this->_reason=$reason; - } - $this->_status=$status; - } - public function getStatusReason() { - return $this->_reason; - } - public function getCookies() - { - if($this->_cookies===null) - $this->_cookies=new THttpCookieCollection($this); - return $this->_cookies; - } - public function write($str) - { - echo $str; - } - public function writeFile($fileName,$content=null,$mimeType=null,$headers=null) - { - static $defaultMimeTypes=array( - 'css'=>'text/css', - 'gif'=>'image/gif', - 'jpg'=>'image/jpeg', - 'jpeg'=>'image/jpeg', - 'htm'=>'text/html', - 'html'=>'text/html', - 'js'=>'javascript/js', - 'pdf'=>'application/pdf', - 'xls'=>'application/vnd.ms-excel', - ); - if($mimeType===null) - { - $mimeType='text/plain'; - if(function_exists('mime_content_type')) - $mimeType=mime_content_type($fileName); - else if(($ext=strrchr($fileName,'.'))!==false) - { - $ext=substr($ext,1); - if(isset($defaultMimeTypes[$ext])) - $mimeType=$defaultMimeTypes[$ext]; - } - } - $fn=basename($fileName); - $this->sendHttpHeader(); - if(is_array($headers)) - { - foreach($headers as $h) - header($h); - } - else - { - header('Pragma: public'); - header('Expires: 0'); - header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); - } - header("Content-type: $mimeType"); - header('Content-Length: '.($content===null?filesize($fileName):strlen($content))); - header("Content-Disposition: attachment; filename=\"$fn\""); - header('Content-Transfer-Encoding: binary'); - if($content===null) - readfile($fileName); - else - echo $content; - } - public function redirect($url) - { - if($this->getHasAdapter()) - $this->_adapter->httpRedirect($url); - else - $this->httpRedirect($url); - } - public function httpRedirect($url) - { - if(!$this->getApplication()->getRequestCompleted()) - $this->getApplication()->onEndRequest(); - if($url[0]==='/') - $url=$this->getRequest()->getBaseUrl().$url; - if ($this->_status >= 300 && $this->_status < 400) - header('Location: '.str_replace('&','&',$url), true, $this->_status); - else - header('Location: '.str_replace('&','&',$url)); - exit(); - } - public function reload() - { - $this->redirect($this->getRequest()->getRequestUri()); - } - public function flush() - { - if($this->getHasAdapter()) - $this->_adapter->flushContent(); - else - $this->flushContent(); - } - public function flushContent() - { - $this->sendHttpHeader(); - $this->sendContentTypeHeader(); - if($this->_bufferOutput) - ob_flush(); - } - protected function sendHttpHeader () - { - if (($version=$this->getRequest()->getHttpProtocolVersion())==='') - header (' ', true, $this->_status); - else - header($version.' '.$this->_status.' '.$this->_reason, true, $this->_status); - } - protected function sendContentTypeHeader() - { - $charset=$this->getCharset(); - if($charset==='' && ($globalization=$this->getApplication()->getGlobalization(false))!==null) - $charset=$globalization->getCharset(); - if($charset!=='') - { - $contentType=$this->_contentType===null?'text/html':$this->_contentType; - $this->appendHeader('Content-Type: '.$contentType.';charset='.$charset); - } - else if($this->_contentType!==null) - $this->appendHeader('Content-Type: '.$this->_contentType.';charset=UTF-8'); - } - public function getContents() - { - return $this->_bufferOutput?ob_get_contents():''; - } - public function clear() - { - if($this->_bufferOutput) - ob_clean(); - } - public function appendHeader($value) - { - header($value); - } - public function appendLog($message,$messageType=0,$destination='',$extraHeaders='') - { - error_log($message,$messageType,$destination,$extraHeaders); - } - public function addCookie($cookie) - { - $request=$this->getRequest(); - if($request->getEnableCookieValidation()) - { - $value=$this->getApplication()->getSecurityManager()->hashData($cookie->getValue()); - setcookie($cookie->getName(),$value,$cookie->getExpire(),$cookie->getPath(),$cookie->getDomain(),$cookie->getSecure()); - } - else - setcookie($cookie->getName(),$cookie->getValue(),$cookie->getExpire(),$cookie->getPath(),$cookie->getDomain(),$cookie->getSecure()); - } - public function removeCookie($cookie) - { - setcookie($cookie->getName(),null,0,$cookie->getPath(),$cookie->getDomain(),$cookie->getSecure()); - } - public function getHtmlWriterType() - { - return $this->_htmlWriterType; - } - public function setHtmlWriterType($value) - { - $this->_htmlWriterType=$value; - } - public function createHtmlWriter($type=null) - { - if($type===null) - $type=$this->getHtmlWriterType(); - if($this->getHasAdapter()) - return $this->_adapter->createNewHtmlWriter($type, $this); - else - return $this->createNewHtmlWriter($type, $this); - } - public function createNewHtmlWriter($type, $writer) - { - return Prado::createComponent($type, $writer); - } -} -class THttpSession extends TApplicationComponent implements IteratorAggregate,ArrayAccess,Countable,IModule -{ - private $_initialized=false; - private $_started=false; - private $_autoStart=false; - private $_cookie=null; - private $_id; - private $_customStorage=false; - public function getID() - { - return $this->_id; - } - public function setID($value) - { - $this->_id=$value; - } - public function init($config) - { - if($this->_autoStart) - $this->open(); - $this->_initialized=true; - $this->getApplication()->setSession($this); - register_shutdown_function(array($this, "close")); - } - public function open() - { - if(!$this->_started) - { - if($this->_customStorage) - session_set_save_handler(array($this,'_open'),array($this,'_close'),array($this,'_read'),array($this,'_write'),array($this,'_destroy'),array($this,'_gc')); - if($this->_cookie!==null) - session_set_cookie_params($this->_cookie->getExpire(),$this->_cookie->getPath(),$this->_cookie->getDomain(),$this->_cookie->getSecure()); - if(ini_get('session.auto_start')!=='1') - session_start(); - $this->_started=true; - } - } - public function close() - { - if($this->_started) - { - session_write_close(); - $this->_started=false; - } - } - public function destroy() - { - if($this->_started) - { - session_destroy(); - $this->_started=false; - } - } - public function getIsStarted() - { - return $this->_started; - } - public function getSessionID() - { - return session_id(); - } - public function setSessionID($value) - { - if($this->_started) - throw new TInvalidOperationException('httpsession_sessionid_unchangeable'); - else - session_id($value); - } - public function getSessionName() - { - return session_name(); - } - public function setSessionName($value) - { - if($this->_started) - throw new TInvalidOperationException('httpsession_sessionname_unchangeable'); - else if(ctype_alnum($value)) - session_name($value); - else - throw new TInvalidDataValueException('httpsession_sessionname_invalid',$value); - } - public function getSavePath() - { - return session_save_path(); - } - public function setSavePath($value) - { - if($this->_started) - throw new TInvalidOperationException('httpsession_savepath_unchangeable'); - else if(is_dir($value)) - session_save_path($value); - else - throw new TInvalidDataValueException('httpsession_savepath_invalid',$value); - } - public function getUseCustomStorage() - { - return $this->_customStorage; - } - public function setUseCustomStorage($value) - { - $this->_customStorage=TPropertyValue::ensureBoolean($value); - } - public function getCookie() - { - if($this->_cookie===null) - $this->_cookie=new THttpCookie($this->getSessionName(),$this->getSessionID()); - return $this->_cookie; - } - public function getCookieMode() - { - if(ini_get('session.use_cookies')==='0') - return THttpSessionCookieMode::None; - else if(ini_get('session.use_only_cookies')==='0') - return THttpSessionCookieMode::Allow; - else - return THttpSessionCookieMode::Only; - } - public function setCookieMode($value) - { - if($this->_started) - throw new TInvalidOperationException('httpsession_cookiemode_unchangeable'); - else - { - $value=TPropertyValue::ensureEnum($value,'THttpSessionCookieMode'); - if($value===THttpSessionCookieMode::None) - ini_set('session.use_cookies','0'); - else if($value===THttpSessionCookieMode::Allow) - { - ini_set('session.use_cookies','1'); - ini_set('session.use_only_cookies','0'); - } - else - { - ini_set('session.use_cookies','1'); - ini_set('session.use_only_cookies','1'); - } - } - } - public function getAutoStart() - { - return $this->_autoStart; - } - public function setAutoStart($value) - { - if($this->_initialized) - throw new TInvalidOperationException('httpsession_autostart_unchangeable'); - else - $this->_autoStart=TPropertyValue::ensureBoolean($value); - } - public function getGCProbability() - { - return TPropertyValue::ensureInteger(ini_get('session.gc_probability')); - } - public function setGCProbability($value) - { - if($this->_started) - throw new TInvalidOperationException('httpsession_gcprobability_unchangeable'); - else - { - $value=TPropertyValue::ensureInteger($value); - if($value>=0 && $value<=100) - { - ini_set('session.gc_probability',$value); - ini_set('session.gc_divisor','100'); - } - else - throw new TInvalidDataValueException('httpsession_gcprobability_invalid',$value); - } - } - public function getUseTransparentSessionID() - { - return ini_get('session.use_trans_sid')==='1'; - } - public function setUseTransparentSessionID($value) - { - if($this->_started) - throw new TInvalidOperationException('httpsession_transid_unchangeable'); - else - ini_set('session.use_trans_sid',TPropertyValue::ensureBoolean($value)?'1':'0'); - } - public function getTimeout() - { - return TPropertyValue::ensureInteger(ini_get('session.gc_maxlifetime')); - } - public function setTimeout($value) - { - if($this->_started) - throw new TInvalidOperationException('httpsession_maxlifetime_unchangeable'); - else - ini_set('session.gc_maxlifetime',$value); - } - public function _open($savePath,$sessionName) - { - return true; - } - public function _close() - { - return true; - } - public function _read($id) - { - return ''; - } - public function _write($id,$data) - { - return true; - } - public function _destroy($id) - { - return true; - } - public function _gc($maxLifetime) - { - return true; - } - public function getIterator() - { - return new TSessionIterator; - } - public function getCount() - { - return count($_SESSION); - } - public function count() - { - return $this->getCount(); - } - public function getKeys() - { - return array_keys($_SESSION); - } - public function itemAt($key) - { - return isset($_SESSION[$key]) ? $_SESSION[$key] : null; - } - public function add($key,$value) - { - $_SESSION[$key]=$value; - } - public function remove($key) - { - if(isset($_SESSION[$key])) - { - $value=$_SESSION[$key]; - unset($_SESSION[$key]); - return $value; - } - else - return null; - } - public function clear() - { - foreach(array_keys($_SESSION) as $key) - unset($_SESSION[$key]); - } - public function contains($key) - { - return isset($_SESSION[$key]); - } - public function toArray() - { - return $_SESSION; - } - public function offsetExists($offset) - { - return isset($_SESSION[$offset]); - } - public function offsetGet($offset) - { - return isset($_SESSION[$offset]) ? $_SESSION[$offset] : null; - } - public function offsetSet($offset,$item) - { - $_SESSION[$offset]=$item; - } - public function offsetUnset($offset) - { - unset($_SESSION[$offset]); - } -} -class TSessionIterator implements Iterator -{ - private $_keys; - private $_key; - public function __construct() - { - $this->_keys=array_keys($_SESSION); - } - public function rewind() - { - $this->_key=reset($this->_keys); - } - public function key() - { - return $this->_key; - } - public function current() - { - return isset($_SESSION[$this->_key])?$_SESSION[$this->_key]:null; - } - public function next() - { - do - { - $this->_key=next($this->_keys); - } - while(!isset($_SESSION[$this->_key]) && $this->_key!==false); - } - public function valid() - { - return $this->_key!==false; - } -} -class THttpSessionCookieMode extends TEnumerable -{ - const None='None'; - const Allow='Allow'; - const Only='Only'; -} -Prado::using('System.Web.UI.WebControls.*'); -class TAttributeCollection extends TMap -{ - private $_caseSensitive=false; - public function __get($name) - { - return $this->contains($name)?$this->itemAt($name):parent::__get($name); - } - public function __set($name,$value) - { - $this->add($name,$value); - } - public function getCaseSensitive() - { - return $this->_caseSensitive; - } - public function setCaseSensitive($value) - { - $this->_caseSensitive=TPropertyValue::ensureBoolean($value); - } - public function itemAt($key) - { - return parent::itemAt($this->_caseSensitive?$key:strtolower($key)); - } - public function add($key,$value) - { - parent::add($this->_caseSensitive?$key:strtolower($key),$value); - } - public function remove($key) - { - return parent::remove($this->_caseSensitive?$key:strtolower($key)); - } - public function contains($key) - { - return parent::contains($this->_caseSensitive?$key:strtolower($key)); - } - public function hasProperty($name) - { - return $this->contains($name) || parent::hasProperty($name); - } - public function canGetProperty($name) - { - return $this->contains($name) || parent::canGetProperty($name); - } - public function canSetProperty($name) - { - return true; - } -} -class TControlAdapter extends TApplicationComponent -{ - private $_control; - public function __construct($control) - { - $this->_control=$control; - } - public function getControl() - { - return $this->_control; - } - public function getPage() - { - return $this->_control?$this->_control->getPage():null; - } - public function createChildControls() - { - $this->_control->createChildControls(); - } - public function loadState() - { - $this->_control->loadState(); - } - public function saveState() - { - $this->_control->saveState(); - } - public function onInit($param) - { - $this->_control->onInit($param); - } - public function onLoad($param) - { - $this->_control->onLoad($param); - } - public function onPreRender($param) - { - $this->_control->onPreRender($param); - } - public function onUnload($param) - { - $this->_control->onUnload($param); - } - public function render($writer) - { - $this->_control->render($writer); - } - public function renderChildren($writer) - { - $this->_control->renderChildren($writer); - } -} -class TControl extends TApplicationComponent implements IRenderable, IBindable -{ - const ID_FORMAT='/^[a-zA-Z_]\\w*$/'; - const ID_SEPARATOR='$'; - const CLIENT_ID_SEPARATOR='_'; - const AUTOMATIC_ID_PREFIX='ctl'; - const CS_CONSTRUCTED=0; - const CS_CHILD_INITIALIZED=1; - const CS_INITIALIZED=2; - const CS_STATE_LOADED=3; - const CS_LOADED=4; - const CS_PRERENDERED=5; - const IS_ID_SET=0x01; - const IS_DISABLE_VIEWSTATE=0x02; - const IS_SKIN_APPLIED=0x04; - const IS_STYLESHEET_APPLIED=0x08; - const IS_DISABLE_THEMING=0x10; - const IS_CHILD_CREATED=0x20; - const IS_CREATING_CHILD=0x40; - const RF_CONTROLS=0; - const RF_CHILD_STATE=1; - const RF_NAMED_CONTROLS=2; - const RF_NAMED_CONTROLS_ID=3; - const RF_SKIN_ID=4; - const RF_DATA_BINDINGS=5; - const RF_EVENTS=6; - const RF_CONTROLSTATE=7; - const RF_NAMED_OBJECTS=8; - const RF_ADAPTER=9; - const RF_AUTO_BINDINGS=10; - private $_id=''; - private $_uid; - private $_parent; - private $_page; - private $_namingContainer; - private $_tplControl; - private $_viewState=array(); - private $_tempState=array(); - private $_trackViewState=true; - private $_stage=0; - private $_flags=0; - private $_rf=array(); - public function __construct() - { - } - public function __get($name) - { - if(isset($this->_rf[self::RF_NAMED_OBJECTS][$name])) - return $this->_rf[self::RF_NAMED_OBJECTS][$name]; - else - return parent::__get($name); - } - public function getHasAdapter() - { - return isset($this->_rf[self::RF_ADAPTER]); - } - public function getAdapter() - { - return isset($this->_rf[self::RF_ADAPTER])?$this->_rf[self::RF_ADAPTER]:null; - } - public function setAdapter(TControlAdapter $adapter) - { - $this->_rf[self::RF_ADAPTER]=$adapter; - } - public function getParent() - { - return $this->_parent; - } - public function getNamingContainer() - { - if(!$this->_namingContainer && $this->_parent) - { - if($this->_parent instanceof INamingContainer) - $this->_namingContainer=$this->_parent; - else - $this->_namingContainer=$this->_parent->getNamingContainer(); - } - return $this->_namingContainer; - } - public function getPage() - { - if(!$this->_page) - { - if($this->_parent) - $this->_page=$this->_parent->getPage(); - else if($this->_tplControl) - $this->_page=$this->_tplControl->getPage(); - } - return $this->_page; - } - public function setPage($page) - { - $this->_page=$page; - } - public function setTemplateControl($control) - { - $this->_tplControl=$control; - } - public function getTemplateControl() - { - if(!$this->_tplControl && $this->_parent) - $this->_tplControl=$this->_parent->getTemplateControl(); - return $this->_tplControl; - } - public function getSourceTemplateControl() - { - $control=$this; - while(($control instanceof TControl) && ($control=$control->getTemplateControl())!==null) - { - if(($control instanceof TTemplateControl) && $control->getIsSourceTemplateControl()) - return $control; - } - return $this->getPage(); - } - protected function getControlStage() - { - return $this->_stage; - } - protected function setControlStage($value) - { - $this->_stage=$value; - } - public function getID($hideAutoID=true) - { - if($hideAutoID) - return ($this->_flags & self::IS_ID_SET) ? $this->_id : ''; - else - return $this->_id; - } - public function setID($id) - { - if(!preg_match(self::ID_FORMAT,$id)) - throw new TInvalidDataValueException('control_id_invalid',get_class($this),$id); - $this->_id=$id; - $this->_flags |= self::IS_ID_SET; - $this->clearCachedUniqueID($this instanceof INamingContainer); - if($this->_namingContainer) - $this->_namingContainer->clearNameTable(); - } - public function getUniqueID() - { - if($this->_uid==='' || $this->_uid===null) - { - $this->_uid=''; - if($namingContainer=$this->getNamingContainer()) - { - if($this->getPage()===$namingContainer) - return ($this->_uid=$this->_id); - else if(($prefix=$namingContainer->getUniqueID())==='') - return $this->_id; - else - return ($this->_uid=$prefix.self::ID_SEPARATOR.$this->_id); - } - else - return $this->_id; - } - else - return $this->_uid; - } - public function focus() - { - $this->getPage()->setFocus($this); - } - public function getClientID() - { - return strtr($this->getUniqueID(),self::ID_SEPARATOR,self::CLIENT_ID_SEPARATOR); - } - public static function convertUniqueIdToClientId($uniqueID) - { - return strtr($uniqueID,self::ID_SEPARATOR,self::CLIENT_ID_SEPARATOR); - } - public function getSkinID() - { - return isset($this->_rf[self::RF_SKIN_ID])?$this->_rf[self::RF_SKIN_ID]:''; - } - public function setSkinID($value) - { - if(($this->_flags & self::IS_SKIN_APPLIED) || $this->_stage>=self::CS_CHILD_INITIALIZED) - throw new TInvalidOperationException('control_skinid_unchangeable',get_class($this)); - else - $this->_rf[self::RF_SKIN_ID]=$value; - } - public function getEnableTheming() - { - if($this->_flags & self::IS_DISABLE_THEMING) - return false; - else - return $this->_parent?$this->_parent->getEnableTheming():true; - } - public function setEnableTheming($value) - { - if($this->_stage>=self::CS_CHILD_INITIALIZED) - throw new TInvalidOperationException('control_enabletheming_unchangeable',get_class($this),$this->getUniqueID()); - else if(TPropertyValue::ensureBoolean($value)) - $this->_flags &= ~self::IS_DISABLE_THEMING; - else - $this->_flags |= self::IS_DISABLE_THEMING; - } - public function getCustomData() - { - return $this->getViewState('CustomData',null); - } - public function setCustomData($value) - { - $this->setViewState('CustomData',$value,null); - } - public function getHasControls() - { - return isset($this->_rf[self::RF_CONTROLS]) && $this->_rf[self::RF_CONTROLS]->getCount()>0; - } - public function getControls() - { - if(!isset($this->_rf[self::RF_CONTROLS])) - $this->_rf[self::RF_CONTROLS]=$this->createControlCollection(); - return $this->_rf[self::RF_CONTROLS]; - } - protected function createControlCollection() - { - return $this->getAllowChildControls()?new TControlCollection($this):new TEmptyControlCollection($this); - } - public function getVisible($checkParents=true) - { - if($checkParents) - { - for($control=$this;$control;$control=$control->_parent) - if(!$control->getVisible(false)) - return false; - return true; - } - else - return $this->getViewState('Visible',true); - } - public function setVisible($value) - { - $this->setViewState('Visible',TPropertyValue::ensureBoolean($value),true); - } - public function getEnabled($checkParents=false) - { - if($checkParents) - { - for($control=$this;$control;$control=$control->_parent) - if(!$control->getViewState('Enabled',true)) - return false; - return true; - } - else - return $this->getViewState('Enabled',true); - } - public function setEnabled($value) - { - $this->setViewState('Enabled',TPropertyValue::ensureBoolean($value),true); - } - public function getHasAttributes() - { - if($attributes=$this->getViewState('Attributes',null)) - return $attributes->getCount()>0; - else - return false; - } - public function getAttributes() - { - if($attributes=$this->getViewState('Attributes',null)) - return $attributes; - else - { - $attributes=new TAttributeCollection; - $this->setViewState('Attributes',$attributes,null); - return $attributes; - } - } - public function hasAttribute($name) - { - if($attributes=$this->getViewState('Attributes',null)) - return $attributes->contains($name); - else - return false; - } - public function getAttribute($name) - { - if($attributes=$this->getViewState('Attributes',null)) - return $attributes->itemAt($name); - else - return null; - } - public function setAttribute($name,$value) - { - $this->getAttributes()->add($name,$value); - } - public function removeAttribute($name) - { - if($attributes=$this->getViewState('Attributes',null)) - return $attributes->remove($name); - else - return null; - } - public function getEnableViewState($checkParents=false) - { - if($checkParents) - { - for($control=$this;$control!==null;$control=$control->getParent()) - if($control->_flags & self::IS_DISABLE_VIEWSTATE) - return false; - return true; - } - else - return !($this->_flags & self::IS_DISABLE_VIEWSTATE); - } - public function setEnableViewState($value) - { - if(TPropertyValue::ensureBoolean($value)) - $this->_flags &= ~self::IS_DISABLE_VIEWSTATE; - else - $this->_flags |= self::IS_DISABLE_VIEWSTATE; - } - protected function getControlState($key,$defaultValue=null) - { - return isset($this->_rf[self::RF_CONTROLSTATE][$key])?$this->_rf[self::RF_CONTROLSTATE][$key]:$defaultValue; - } - protected function setControlState($key,$value,$defaultValue=null) - { - if($value===$defaultValue) - unset($this->_rf[self::RF_CONTROLSTATE][$key]); - else - $this->_rf[self::RF_CONTROLSTATE][$key]=$value; - } - protected function clearControlState($key) - { - unset($this->_rf[self::RF_CONTROLSTATE][$key]); - } - public function trackViewState($enabled) - { - $this->_trackViewState=TPropertyValue::ensureBoolean($enabled); - } - public function getViewState($key,$defaultValue=null) - { - if(isset($this->_viewState[$key])) - return $this->_viewState[$key]!==null?$this->_viewState[$key]:$defaultValue; - else if(isset($this->_tempState[$key])) - { - if(is_object($this->_tempState[$key]) && $this->_trackViewState) - $this->_viewState[$key]=$this->_tempState[$key]; - return $this->_tempState[$key]; - } - else - return $defaultValue; - } - public function setViewState($key,$value,$defaultValue=null) - { - if($this->_trackViewState) - { - $this->_viewState[$key]=$value; - unset($this->_tempState[$key]); - } - else - { - unset($this->_viewState[$key]); - $this->_tempState[$key]=$value; - } - } - public function clearViewState($key) - { - unset($this->_viewState[$key]); - unset($this->_tempState[$key]); - } - public function bindProperty($name,$expression) - { - $this->_rf[self::RF_DATA_BINDINGS][$name]=$expression; - } - public function unbindProperty($name) - { - unset($this->_rf[self::RF_DATA_BINDINGS][$name]); - } - public function autoBindProperty($name,$expression) - { - $this->_rf[self::RF_AUTO_BINDINGS][$name]=$expression; - } - public function dataBind() - { - $this->dataBindProperties(); - $this->onDataBinding(null); - $this->dataBindChildren(); - } - protected function dataBindProperties() - { - if(isset($this->_rf[self::RF_DATA_BINDINGS])) - { - if(($context=$this->getTemplateControl())===null) - $context=$this; - foreach($this->_rf[self::RF_DATA_BINDINGS] as $property=>$expression) - $this->setSubProperty($property,$context->evaluateExpression($expression)); - } - } - protected function autoDataBindProperties() - { - if(isset($this->_rf[self::RF_AUTO_BINDINGS])) - { - if(($context=$this->getTemplateControl())===null) - $context=$this; - foreach($this->_rf[self::RF_AUTO_BINDINGS] as $property=>$expression) - $this->setSubProperty($property,$context->evaluateExpression($expression)); - } - } - protected function dataBindChildren() - { - if(isset($this->_rf[self::RF_CONTROLS])) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - if($control instanceof IBindable) - $control->dataBind(); - } - } - final protected function getChildControlsCreated() - { - return ($this->_flags & self::IS_CHILD_CREATED)!==0; - } - final protected function setChildControlsCreated($value) - { - if($value) - $this->_flags |= self::IS_CHILD_CREATED; - else - { - if($this->getHasControls() && ($this->_flags & self::IS_CHILD_CREATED)) - $this->getControls()->clear(); - $this->_flags &= ~self::IS_CHILD_CREATED; - } - } - public function ensureChildControls() - { - if(!($this->_flags & self::IS_CHILD_CREATED) && !($this->_flags & self::IS_CREATING_CHILD)) - { - try - { - $this->_flags |= self::IS_CREATING_CHILD; - if(isset($this->_rf[self::RF_ADAPTER])) - $this->_rf[self::RF_ADAPTER]->createChildControls(); - else - $this->createChildControls(); - $this->_flags &= ~self::IS_CREATING_CHILD; - $this->_flags |= self::IS_CHILD_CREATED; - } - catch(Exception $e) - { - $this->_flags &= ~self::IS_CREATING_CHILD; - $this->_flags |= self::IS_CHILD_CREATED; - throw $e; - } - } - } - public function createChildControls() - { - } - public function findControl($id) - { - $id=strtr($id,'.',self::ID_SEPARATOR); - $container=($this instanceof INamingContainer)?$this:$this->getNamingContainer(); - if(!$container || !$container->getHasControls()) - return null; - if(!isset($container->_rf[self::RF_NAMED_CONTROLS])) - { - $container->_rf[self::RF_NAMED_CONTROLS]=array(); - $container->fillNameTable($container,$container->_rf[self::RF_CONTROLS]); - } - if(($pos=strpos($id,self::ID_SEPARATOR))===false) - return isset($container->_rf[self::RF_NAMED_CONTROLS][$id])?$container->_rf[self::RF_NAMED_CONTROLS][$id]:null; - else - { - $cid=substr($id,0,$pos); - $sid=substr($id,$pos+1); - if(isset($container->_rf[self::RF_NAMED_CONTROLS][$cid])) - return $container->_rf[self::RF_NAMED_CONTROLS][$cid]->findControl($sid); - else - return null; - } - } - public function findControlsByType($type,$strict=true) - { - $controls=array(); - if($this->getHasControls()) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - { - if(is_object($control) && (get_class($control)===$type || (!$strict && ($control instanceof $type)))) - $controls[]=$control; - if(($control instanceof TControl) && $control->getHasControls()) - $controls=array_merge($controls,$control->findControlsByType($type,$strict)); - } - } - return $controls; - } - public function findControlsByID($id) - { - $controls=array(); - if($this->getHasControls()) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - { - if($control instanceof TControl) - { - if($control->_id===$id) - $controls[]=$control; - $controls=array_merge($controls,$control->findControlsByID($id)); - } - } - } - return $controls; - } - public function clearNamingContainer() - { - unset($this->_rf[self::RF_NAMED_CONTROLS_ID]); - $this->clearNameTable(); - } - public function registerObject($name,$object) - { - if(isset($this->_rf[self::RF_NAMED_OBJECTS][$name])) - throw new TInvalidOperationException('control_object_reregistered',$name); - $this->_rf[self::RF_NAMED_OBJECTS][$name]=$object; - } - public function unregisterObject($name) - { - unset($this->_rf[self::RF_NAMED_OBJECTS][$name]); - } - public function isObjectRegistered($name) - { - return isset($this->_rf[self::RF_NAMED_OBJECTS][$name]); - } - public function getHasChildInitialized() - { - return $this->getControlStage() >= self::CS_CHILD_INITIALIZED; - } - public function getHasInitialized() - { - return $this->getControlStage() >= self::CS_INITIALIZED; - } - public function getHasLoadedPostData() - { - return $this->getControlStage() >= self::CS_STATE_LOADED; - } - public function getHasLoaded() - { - return $this->getControlStage() >= self::CS_LOADED; - } - public function getHasPreRendered() - { - return $this->getControlStage() >= self::CS_PRERENDERED; - } - public function getRegisteredObject($name) - { - return isset($this->_rf[self::RF_NAMED_OBJECTS][$name])?$this->_rf[self::RF_NAMED_OBJECTS][$name]:null; - } - public function getAllowChildControls() - { - return true; - } - public function addParsedObject($object) - { - $this->getControls()->add($object); - } - final protected function clearChildState() - { - unset($this->_rf[self::RF_CHILD_STATE]); - } - final protected function isDescendentOf($ancestor) - { - $control=$this; - while($control!==$ancestor && $control->_parent) - $control=$control->_parent; - return $control===$ancestor; - } - public function addedControl($control) - { - if($control->_parent) - $control->_parent->getControls()->remove($control); - $control->_parent=$this; - $control->_page=$this->getPage(); - $namingContainer=($this instanceof INamingContainer)?$this:$this->_namingContainer; - if($namingContainer) - { - $control->_namingContainer=$namingContainer; - if($control->_id==='') - $control->generateAutomaticID(); - else - $namingContainer->clearNameTable(); - $control->clearCachedUniqueID($control instanceof INamingContainer); - } - if($this->_stage>=self::CS_CHILD_INITIALIZED) - { - $control->initRecursive($namingContainer); - if($this->_stage>=self::CS_STATE_LOADED) - { - if(isset($this->_rf[self::RF_CHILD_STATE][$control->_id])) - { - $state=$this->_rf[self::RF_CHILD_STATE][$control->_id]; - unset($this->_rf[self::RF_CHILD_STATE][$control->_id]); - } - else - $state=null; - $control->loadStateRecursive($state,!($this->_flags & self::IS_DISABLE_VIEWSTATE)); - if($this->_stage>=self::CS_LOADED) - { - $control->loadRecursive(); - if($this->_stage>=self::CS_PRERENDERED) - $control->preRenderRecursive(); - } - } - } - } - public function removedControl($control) - { - if($this->_namingContainer) - $this->_namingContainer->clearNameTable(); - $control->unloadRecursive(); - $control->_parent=null; - $control->_page=null; - $control->_namingContainer=null; - $control->_tplControl=null; - if(!($control->_flags & self::IS_ID_SET)) - $control->_id=''; - else - unset($this->_rf[self::RF_NAMED_OBJECTS][$control->_id]); - $control->clearCachedUniqueID(true); - } - protected function initRecursive($namingContainer=null) - { - $this->ensureChildControls(); - if($this->getHasControls()) - { - if($this instanceof INamingContainer) - $namingContainer=$this; - $page=$this->getPage(); - foreach($this->_rf[self::RF_CONTROLS] as $control) - { - if($control instanceof TControl) - { - $control->_namingContainer=$namingContainer; - $control->_page=$page; - if($control->_id==='' && $namingContainer) - $control->generateAutomaticID(); - $control->initRecursive($namingContainer); - } - } - } - if($this->_stage<self::CS_INITIALIZED) - { - $this->_stage=self::CS_CHILD_INITIALIZED; - if(($page=$this->getPage()) && $this->getEnableTheming() && !($this->_flags & self::IS_SKIN_APPLIED)) - { - $page->applyControlSkin($this); - $this->_flags |= self::IS_SKIN_APPLIED; - } - if(isset($this->_rf[self::RF_ADAPTER])) - $this->_rf[self::RF_ADAPTER]->onInit(null); - else - $this->onInit(null); - $this->_stage=self::CS_INITIALIZED; - } - } - protected function loadRecursive() - { - if($this->_stage<self::CS_LOADED) - { - if(isset($this->_rf[self::RF_ADAPTER])) - $this->_rf[self::RF_ADAPTER]->onLoad(null); - else - $this->onLoad(null); - } - if($this->getHasControls()) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - { - if($control instanceof TControl) - $control->loadRecursive(); - } - } - if($this->_stage<self::CS_LOADED) - $this->_stage=self::CS_LOADED; - } - protected function preRenderRecursive() - { - $this->autoDataBindProperties(); - if($this->getVisible(false)) - { - if(isset($this->_rf[self::RF_ADAPTER])) - $this->_rf[self::RF_ADAPTER]->onPreRender(null); - else - $this->onPreRender(null); - if($this->getHasControls()) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - { - if($control instanceof TControl) - $control->preRenderRecursive(); - else if($control instanceof TCompositeLiteral) - $control->evaluateDynamicContent(); - } - } - $this->addToPostDataLoader(); - } - $this->_stage=self::CS_PRERENDERED; - } - protected function addToPostDataLoader() - { - if($this instanceof IPostBackDataHandler) - $this->getPage()->registerPostDataLoader($this); - } - protected function unloadRecursive() - { - if(!($this->_flags & self::IS_ID_SET)) - $this->_id=''; - if($this->getHasControls()) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - if($control instanceof TControl) - $control->unloadRecursive(); - } - if(isset($this->_rf[self::RF_ADAPTER])) - $this->_rf[self::RF_ADAPTER]->onUnload(null); - else - $this->onUnload(null); - } - public function onInit($param) - { - $this->raiseEvent('OnInit',$this,$param); - } - public function onLoad($param) - { - $this->raiseEvent('OnLoad',$this,$param); - } - public function onDataBinding($param) - { - $this->raiseEvent('OnDataBinding',$this,$param); - } - public function onUnload($param) - { - $this->raiseEvent('OnUnload',$this,$param); - } - public function onPreRender($param) - { - $this->raiseEvent('OnPreRender',$this,$param); - } - protected function raiseBubbleEvent($sender,$param) - { - $control=$this; - while($control=$control->_parent) - { - if($control->bubbleEvent($sender,$param)) - break; - } - } - public function bubbleEvent($sender,$param) - { - return false; - } - public function broadcastEvent($name,$sender,$param) - { - $rootControl=(($page=$this->getPage())===null)?$this:$page; - $rootControl->broadcastEventInternal($name,$sender,new TBroadcastEventParameter($name,$param)); - } - private function broadcastEventInternal($name,$sender,$param) - { - if($this->hasEvent($name)) - $this->raiseEvent($name,$sender,$param->getParameter()); - if($this instanceof IBroadcastEventReceiver) - $this->broadcastEventReceived($sender,$param); - if($this->getHasControls()) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - { - if($control instanceof TControl) - $control->broadcastEventInternal($name,$sender,$param); - } - } - } - protected function traverseChildControls($param,$preCallback=null,$postCallback=null) - { - if($preCallback!==null) - call_user_func($preCallback,$this,$param); - if($this->getHasControls()) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - { - if($control instanceof TControl) - { - $control->traverseChildControls($param,$preCallback,$postCallback); - } - } - } - if($postCallback!==null) - call_user_func($postCallback,$this,$param); - } - public function renderControl($writer) - { - if($this->getVisible(false)) - { - if(isset($this->_rf[self::RF_ADAPTER])) - $this->_rf[self::RF_ADAPTER]->render($writer); - else - $this->render($writer); - } - } - public function render($writer) - { - $this->renderChildren($writer); - } - public function renderChildren($writer) - { - if($this->getHasControls()) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - { - if(is_string($control)) - $writer->write($control); - else if($control instanceof TControl) - $control->renderControl($writer); - else if($control instanceof IRenderable) - $control->render($writer); - } - } - } - public function saveState() - { - } - public function loadState() - { - } - protected function loadStateRecursive(&$state,$needViewState=true) - { - if(is_array($state)) - { - $needViewState=($needViewState && !($this->_flags & self::IS_DISABLE_VIEWSTATE)); - if(isset($state[1])) - { - $this->_rf[self::RF_CONTROLSTATE]=&$state[1]; - unset($state[1]); - } - else - unset($this->_rf[self::RF_CONTROLSTATE]); - if($needViewState) - { - if(isset($state[0])) - $this->_viewState=&$state[0]; - else - $this->_viewState=array(); - } - unset($state[0]); - if($this->getHasControls()) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - { - if($control instanceof TControl) - { - if(isset($state[$control->_id])) - { - $control->loadStateRecursive($state[$control->_id],$needViewState); - unset($state[$control->_id]); - } - } - } - } - if(!empty($state)) - $this->_rf[self::RF_CHILD_STATE]=&$state; - } - $this->_stage=self::CS_STATE_LOADED; - if(isset($this->_rf[self::RF_ADAPTER])) - $this->_rf[self::RF_ADAPTER]->loadState(); - else - $this->loadState(); - } - protected function &saveStateRecursive($needViewState=true) - { - if(isset($this->_rf[self::RF_ADAPTER])) - $this->_rf[self::RF_ADAPTER]->saveState(); - else - $this->saveState(); - $needViewState=($needViewState && !($this->_flags & self::IS_DISABLE_VIEWSTATE)); - $state=array(); - if($this->getHasControls()) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - { - if($control instanceof TControl) - $state[$control->_id]=&$control->saveStateRecursive($needViewState); - } - } - if($needViewState && !empty($this->_viewState)) - $state[0]=&$this->_viewState; - if(isset($this->_rf[self::RF_CONTROLSTATE])) - $state[1]=&$this->_rf[self::RF_CONTROLSTATE]; - return $state; - } - public function applyStyleSheetSkin($page) - { - if($page && !($this->_flags & self::IS_STYLESHEET_APPLIED)) - { - $page->applyControlStyleSheet($this); - $this->_flags |= self::IS_STYLESHEET_APPLIED; - } - else if($this->_flags & self::IS_STYLESHEET_APPLIED) - throw new TInvalidOperationException('control_stylesheet_applied',get_class($this)); - } - private function clearCachedUniqueID($recursive) - { - if($recursive && $this->_uid!==null && isset($this->_rf[self::RF_CONTROLS])) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - if($control instanceof TControl) - $control->clearCachedUniqueID($recursive); - } - $this->_uid=null; - } - private function generateAutomaticID() - { - $this->_flags &= ~self::IS_ID_SET; - if(!isset($this->_namingContainer->_rf[self::RF_NAMED_CONTROLS_ID])) - $this->_namingContainer->_rf[self::RF_NAMED_CONTROLS_ID]=0; - $id=$this->_namingContainer->_rf[self::RF_NAMED_CONTROLS_ID]++; - $this->_id=self::AUTOMATIC_ID_PREFIX . $id; - $this->_namingContainer->clearNameTable(); - } - private function clearNameTable() - { - unset($this->_rf[self::RF_NAMED_CONTROLS]); - } - private function fillNameTable($container,$controls) - { - foreach($controls as $control) - { - if($control instanceof TControl) - { - if($control->_id!=='') - { - if(isset($container->_rf[self::RF_NAMED_CONTROLS][$control->_id])) - throw new TInvalidDataValueException('control_id_nonunique',get_class($control),$control->_id); - else - $container->_rf[self::RF_NAMED_CONTROLS][$control->_id]=$control; - } - if(!($control instanceof INamingContainer) && $control->getHasControls()) - $this->fillNameTable($container,$control->_rf[self::RF_CONTROLS]); - } - } - } -} -class TControlCollection extends TList -{ - private $_o; - public function __construct(TControl $owner,$readOnly=false) - { - $this->_o=$owner; - parent::__construct(null,$readOnly); - } - protected function getOwner() - { - return $this->_o; - } - public function insertAt($index,$item) - { - if($item instanceof TControl) - { - parent::insertAt($index,$item); - $this->_o->addedControl($item); - } - else if(is_string($item) || ($item instanceof IRenderable)) - parent::insertAt($index,$item); - else - throw new TInvalidDataTypeException('controlcollection_control_required'); - } - public function removeAt($index) - { - $item=parent::removeAt($index); - if($item instanceof TControl) - $this->_o->removedControl($item); - return $item; - } - public function clear() - { - parent::clear(); - if($this->_o instanceof INamingContainer) - $this->_o->clearNamingContainer(); - } -} -class TEmptyControlCollection extends TControlCollection -{ - public function __construct(TControl $owner) - { - parent::__construct($owner,true); - } - public function insertAt($index,$item) - { - if(!is_string($item)) - parent::insertAt($index,$item); - } -} -interface INamingContainer -{ -} -interface IPostBackEventHandler -{ - public function raisePostBackEvent($param); -} -interface IPostBackDataHandler -{ - public function loadPostData($key,$values); - public function raisePostDataChangedEvent(); - public function getDataChanged(); -} -interface IValidator -{ - public function validate(); - public function getIsValid(); - public function setIsValid($value); - public function getErrorMessage(); - public function setErrorMessage($value); -} -interface IValidatable -{ - public function getValidationPropertyValue(); - public function getIsValid(); - public function setIsValid($value); -} -interface IBroadcastEventReceiver -{ - public function broadcastEventReceived($sender,$param); -} -interface ITheme -{ - public function applySkin($control); -} -interface ITemplate -{ - public function instantiateIn($parent); -} -interface IButtonControl -{ - public function getText(); - public function setText($value); - public function getCausesValidation(); - public function setCausesValidation($value); - public function getCommandName(); - public function setCommandName($value); - public function getCommandParameter(); - public function setCommandParameter($value); - public function getValidationGroup(); - public function setValidationGroup($value); - public function onClick($param); - public function onCommand($param); - public function setIsDefaultButton($value); - public function getIsDefaultButton(); -} -interface ISurroundable -{ - public function getSurroundingTagID(); -} -class TBroadcastEventParameter extends TEventParameter -{ - private $_name; - private $_param; - public function __construct($name='',$parameter=null) - { - $this->_name=$name; - $this->_param=$parameter; - } - public function getName() - { - return $this->_name; - } - public function setName($value) - { - $this->_name=$value; - } - public function getParameter() - { - return $this->_param; - } - public function setParameter($value) - { - $this->_param=$value; - } -} -class TCommandEventParameter extends TEventParameter -{ - private $_name; - private $_param; - public function __construct($name='',$parameter='') - { - $this->_name=$name; - $this->_param=$parameter; - } - public function getCommandName() - { - return $this->_name; - } - public function getCommandParameter() - { - return $this->_param; - } -} -class TCompositeLiteral extends TComponent implements IRenderable, IBindable -{ - const TYPE_EXPRESSION=0; - const TYPE_STATEMENTS=1; - const TYPE_DATABINDING=2; - private $_container=null; - private $_items=array(); - private $_expressions=array(); - private $_statements=array(); - private $_bindings=array(); - public function __construct($items) - { - $this->_items=array(); - $this->_expressions=array(); - $this->_statements=array(); - foreach($items as $id=>$item) - { - if(is_array($item)) - { - if($item[0]===self::TYPE_EXPRESSION) - $this->_expressions[$id]=$item[1]; - else if($item[0]===self::TYPE_STATEMENTS) - $this->_statements[$id]=$item[1]; - else if($item[0]===self::TYPE_DATABINDING) - $this->_bindings[$id]=$item[1]; - $this->_items[$id]=''; - } - else - $this->_items[$id]=$item; - } - } - public function getContainer() - { - return $this->_container; - } - public function setContainer(TComponent $value) - { - $this->_container=$value; - } - public function evaluateDynamicContent() - { - $context=$this->_container===null?$this:$this->_container; - foreach($this->_expressions as $id=>$expression) - $this->_items[$id]=$context->evaluateExpression($expression); - foreach($this->_statements as $id=>$statement) - $this->_items[$id]=$context->evaluateStatements($statement); - } - public function dataBind() - { - $context=$this->_container===null?$this:$this->_container; - foreach($this->_bindings as $id=>$binding) - $this->_items[$id]=$context->evaluateExpression($binding); - } - public function render($writer) - { - $writer->write(implode('',$this->_items)); - } -} -class TFont extends TComponent -{ - const IS_BOLD=0x01; - const IS_ITALIC=0x02; - const IS_OVERLINE=0x04; - const IS_STRIKEOUT=0x08; - const IS_UNDERLINE=0x10; - const IS_SET_BOLD=0x01000; - const IS_SET_ITALIC=0x02000; - const IS_SET_OVERLINE=0x04000; - const IS_SET_STRIKEOUT=0x08000; - const IS_SET_UNDERLINE=0x10000; - const IS_SET_SIZE=0x20000; - const IS_SET_NAME=0x40000; - private $_flags=0; - private $_name=''; - private $_size=''; - public function getBold() - { - return ($this->_flags & self::IS_BOLD)!==0; - } - public function setBold($value) - { - $this->_flags |= self::IS_SET_BOLD; - if(TPropertyValue::ensureBoolean($value)) - $this->_flags |= self::IS_BOLD; - else - $this->_flags &= ~self::IS_BOLD; - } - public function getItalic() - { - return ($this->_flags & self::IS_ITALIC)!==0; - } - public function setItalic($value) - { - $this->_flags |= self::IS_SET_ITALIC; - if(TPropertyValue::ensureBoolean($value)) - $this->_flags |= self::IS_ITALIC; - else - $this->_flags &= ~self::IS_ITALIC; - } - public function getOverline() - { - return ($this->_flags & self::IS_OVERLINE)!==0; - } - public function setOverline($value) - { - $this->_flags |= self::IS_SET_OVERLINE; - if(TPropertyValue::ensureBoolean($value)) - $this->_flags |= self::IS_OVERLINE; - else - $this->_flags &= ~self::IS_OVERLINE; - } - public function getSize() - { - return $this->_size; - } - public function setSize($value) - { - $this->_flags |= self::IS_SET_SIZE; - $this->_size=$value; - } - public function getStrikeout() - { - return ($this->_flags & self::IS_STRIKEOUT)!==0; - } - public function setStrikeout($value) - { - $this->_flags |= self::IS_SET_STRIKEOUT; - if(TPropertyValue::ensureBoolean($value)) - $this->_flags |= self::IS_STRIKEOUT; - else - $this->_flags &= ~self::IS_STRIKEOUT; - } - public function getUnderline() - { - return ($this->_flags & self::IS_UNDERLINE)!==0; - } - public function setUnderline($value) - { - $this->_flags |= self::IS_SET_UNDERLINE; - if(TPropertyValue::ensureBoolean($value)) - $this->_flags |= self::IS_UNDERLINE; - else - $this->_flags &= ~self::IS_UNDERLINE; - } - public function getName() - { - return $this->_name; - } - public function setName($value) - { - $this->_flags |= self::IS_SET_NAME; - $this->_name=$value; - } - public function getIsEmpty() - { - return !$this->_flags; - } - public function reset() - { - $this->_flags=0; - $this->_name=''; - $this->_size=''; - } - public function mergeWith($font) - { - if($font===null || $font->_flags===0) - return; - if(!($this->_flags & self::IS_SET_BOLD) && ($font->_flags & self::IS_SET_BOLD)) - $this->setBold($font->getBold()); - if(!($this->_flags & self::IS_SET_ITALIC) && ($font->_flags & self::IS_SET_ITALIC)) - $this->setItalic($font->getItalic()); - if(!($this->_flags & self::IS_SET_OVERLINE) && ($font->_flags & self::IS_SET_OVERLINE)) - $this->setOverline($font->getOverline()); - if(!($this->_flags & self::IS_SET_STRIKEOUT) && ($font->_flags & self::IS_SET_STRIKEOUT)) - $this->setStrikeout($font->getStrikeout()); - if(!($this->_flags & self::IS_SET_UNDERLINE) && ($font->_flags & self::IS_SET_UNDERLINE)) - $this->setUnderline($font->getUnderline()); - if(!($this->_flags & self::IS_SET_SIZE) && ($font->_flags & self::IS_SET_SIZE)) - $this->setSize($font->getSize()); - if(!($this->_flags & self::IS_SET_NAME) && ($font->_flags & self::IS_SET_NAME)) - $this->setName($font->getName()); - } - public function copyFrom($font) - { - if($font===null || $font->_flags===0) - return; - if($font->_flags & self::IS_SET_BOLD) - $this->setBold($font->getBold()); - if($font->_flags & self::IS_SET_ITALIC) - $this->setItalic($font->getItalic()); - if($font->_flags & self::IS_SET_OVERLINE) - $this->setOverline($font->getOverline()); - if($font->_flags & self::IS_SET_STRIKEOUT) - $this->setStrikeout($font->getStrikeout()); - if($font->_flags & self::IS_SET_UNDERLINE) - $this->setUnderline($font->getUnderline()); - if($font->_flags & self::IS_SET_SIZE) - $this->setSize($font->getSize()); - if($font->_flags & self::IS_SET_NAME) - $this->setName($font->getName()); - } - public function toString() - { - if($this->_flags===0) - return ''; - $str=''; - if($this->_flags & self::IS_SET_BOLD) - $str.='font-weight:'.(($this->_flags & self::IS_BOLD)?'bold;':'normal;'); - if($this->_flags & self::IS_SET_ITALIC) - $str.='font-style:'.(($this->_flags & self::IS_ITALIC)?'italic;':'normal;'); - $textDec=''; - if($this->_flags & self::IS_UNDERLINE) - $textDec.='underline'; - if($this->_flags & self::IS_OVERLINE) - $textDec.=' overline'; - if($this->_flags & self::IS_STRIKEOUT) - $textDec.=' line-through'; - $textDec=ltrim($textDec); - if($textDec!=='') - $str.='text-decoration:'.$textDec.';'; - if($this->_size!=='') - $str.='font-size:'.$this->_size.';'; - if($this->_name!=='') - $str.='font-family:'.$this->_name.';'; - return $str; - } - public function addAttributesToRender($writer) - { - if($this->_flags===0) - return; - if($this->_flags & self::IS_SET_BOLD) - $writer->addStyleAttribute('font-weight',(($this->_flags & self::IS_BOLD)?'bold':'normal')); - if($this->_flags & self::IS_SET_ITALIC) - $writer->addStyleAttribute('font-style',(($this->_flags & self::IS_ITALIC)?'italic':'normal')); - $textDec=''; - if($this->_flags & self::IS_UNDERLINE) - $textDec.='underline'; - if($this->_flags & self::IS_OVERLINE) - $textDec.=' overline'; - if($this->_flags & self::IS_STRIKEOUT) - $textDec.=' line-through'; - $textDec=ltrim($textDec); - if($textDec!=='') - $writer->addStyleAttribute('text-decoration',$textDec); - if($this->_size!=='') - $writer->addStyleAttribute('font-size',$this->_size); - if($this->_name!=='') - $writer->addStyleAttribute('font-family',$this->_name); - } -} -class TStyle extends TComponent -{ - private $_fields=array(); - private $_font=null; - private $_class=null; - private $_customStyle=null; - private $_displayStyle='Fixed'; - public function __construct($style=null) - { - if($style!==null) - $this->copyFrom($style); - } - public function __clone() - { - if($this->_font!==null) - $this->_font = clone($this->_font); - } - public function getBackColor() - { - return isset($this->_fields['background-color'])?$this->_fields['background-color']:''; - } - public function setBackColor($value) - { - if(trim($value)==='') - unset($this->_fields['background-color']); - else - $this->_fields['background-color']=$value; - } - public function getBorderColor() - { - return isset($this->_fields['border-color'])?$this->_fields['border-color']:''; - } - public function setBorderColor($value) - { - if(trim($value)==='') - unset($this->_fields['border-color']); - else - $this->_fields['border-color']=$value; - } - public function getBorderStyle() - { - return isset($this->_fields['border-style'])?$this->_fields['border-style']:''; - } - public function setBorderStyle($value) - { - if(trim($value)==='') - unset($this->_fields['border-style']); - else - $this->_fields['border-style']=$value; - } - public function getBorderWidth() - { - return isset($this->_fields['border-width'])?$this->_fields['border-width']:''; - } - public function setBorderWidth($value) - { - if(trim($value)==='') - unset($this->_fields['border-width']); - else - $this->_fields['border-width']=$value; - } - public function getCssClass() - { - return $this->_class===null?'':$this->_class; - } - public function hasCssClass() - { - return ($this->_class!==null); - } - public function setCssClass($value) - { - $this->_class=$value; - } - public function getFont() - { - if($this->_font===null) - $this->_font=new TFont; - return $this->_font; - } - public function hasFont() - { - return $this->_font !== null; - } - public function setDisplayStyle($value) - { - $this->_displayStyle = TPropertyValue::ensureEnum($value, 'TDisplayStyle'); - switch($this->_displayStyle) - { - case TDisplayStyle::None: - $this->_fields['display'] = 'none'; - break; - case TDisplayStyle::Dynamic: - $this->_fields['display'] = ''; - break; - case TDisplayStyle::Fixed: - $this->_fields['visibility'] = 'visible'; - break; - case TDisplayStyle::Hidden: - $this->_fields['visibility'] = 'hidden'; - break; - } - } - public function getDisplayStyle() - { - return $this->_displayStyle; - } - public function getForeColor() - { - return isset($this->_fields['color'])?$this->_fields['color']:''; - } - public function setForeColor($value) - { - if(trim($value)==='') - unset($this->_fields['color']); - else - $this->_fields['color']=$value; - } - public function getHeight() - { - return isset($this->_fields['height'])?$this->_fields['height']:''; - } - public function setHeight($value) - { - if(trim($value)==='') - unset($this->_fields['height']); - else - $this->_fields['height']=$value; - } - public function getCustomStyle() - { - return $this->_customStyle===null?'':$this->_customStyle; - } - public function setCustomStyle($value) - { - $this->_customStyle=$value; - } - public function getStyleField($name) - { - return isset($this->_fields[$name])?$this->_fields[$name]:''; - } - public function setStyleField($name,$value) - { - $this->_fields[$name]=$value; - } - public function clearStyleField($name) - { - unset($this->_fields[$name]); - } - public function hasStyleField($name) - { - return isset($this->_fields[$name]); - } - public function getWidth() - { - return isset($this->_fields['width'])?$this->_fields['width']:''; - } - public function setWidth($value) - { - $this->_fields['width']=$value; - } - public function reset() - { - $this->_fields=array(); - $this->_font=null; - $this->_class=null; - $this->_customStyle=null; - } - public function copyFrom($style) - { - if($style instanceof TStyle) - { - $this->_fields=array_merge($this->_fields,$style->_fields); - if($style->_class!==null) - $this->_class=$style->_class; - if($style->_customStyle!==null) - $this->_customStyle=$style->_customStyle; - if($style->_font!==null) - $this->getFont()->copyFrom($style->_font); - } - } - public function mergeWith($style) - { - if($style instanceof TStyle) - { - $this->_fields=array_merge($style->_fields,$this->_fields); - if($this->_class===null) - $this->_class=$style->_class; - if($this->_customStyle===null) - $this->_customStyle=$style->_customStyle; - if($style->_font!==null) - $this->getFont()->mergeWith($style->_font); - } - } - public function addAttributesToRender($writer) - { - if($this->_customStyle!==null) - { - foreach(explode(';',$this->_customStyle) as $style) - { - $arr=explode(':',$style); - if(isset($arr[1]) && trim($arr[0])!=='') - $writer->addStyleAttribute(trim($arr[0]),trim($arr[1])); - } - } - $writer->addStyleAttributes($this->_fields); - if($this->_font!==null) - $this->_font->addAttributesToRender($writer); - if($this->_class!==null) - $writer->addAttribute('class',$this->_class); - } - public function getStyleFields() - { - return $this->_fields; - } -} -class TDisplayStyle extends TEnumerable -{ - const None='None'; - const Dynamic='Dynamic'; - const Fixed='Fixed'; - const Hidden='Hidden'; -} -class TTableStyle extends TStyle -{ - private $_backImageUrl=null; - private $_horizontalAlign=null; - private $_cellPadding=null; - private $_cellSpacing=null; - private $_gridLines=null; - private $_borderCollapse=null; - public function reset() - { - $this->_backImageUrl=null; - $this->_horizontalAlign=null; - $this->_cellPadding=null; - $this->_cellSpacing=null; - $this->_gridLines=null; - $this->_borderCollapse=null; - } - public function copyFrom($style) - { - parent::copyFrom($style); - if($style instanceof TTableStyle) - { - if($style->_backImageUrl!==null) - $this->_backImageUrl=$style->_backImageUrl; - if($style->_horizontalAlign!==null) - $this->_horizontalAlign=$style->_horizontalAlign; - if($style->_cellPadding!==null) - $this->_cellPadding=$style->_cellPadding; - if($style->_cellSpacing!==null) - $this->_cellSpacing=$style->_cellSpacing; - if($style->_gridLines!==null) - $this->_gridLines=$style->_gridLines; - if($style->_borderCollapse!==null) - $this->_borderCollapse=$style->_borderCollapse; - } - } - public function mergeWith($style) - { - parent::mergeWith($style); - if($style instanceof TTableStyle) - { - if($this->_backImageUrl===null && $style->_backImageUrl!==null) - $this->_backImageUrl=$style->_backImageUrl; - if($this->_horizontalAlign===null && $style->_horizontalAlign!==null) - $this->_horizontalAlign=$style->_horizontalAlign; - if($this->_cellPadding===null && $style->_cellPadding!==null) - $this->_cellPadding=$style->_cellPadding; - if($this->_cellSpacing===null && $style->_cellSpacing!==null) - $this->_cellSpacing=$style->_cellSpacing; - if($this->_gridLines===null && $style->_gridLines!==null) - $this->_gridLines=$style->_gridLines; - if($this->_borderCollapse===null && $style->_borderCollapse!==null) - $this->_borderCollapse=$style->_borderCollapse; - } - } - public function addAttributesToRender($writer) - { - if(($url=trim($this->getBackImageUrl()))!=='') - $writer->addStyleAttribute('background-image','url('.$url.')'); - if(($horizontalAlign=$this->getHorizontalAlign())!==THorizontalAlign::NotSet) - $writer->addStyleAttribute('text-align',strtolower($horizontalAlign)); - if(($cellPadding=$this->getCellPadding())>=0) - $writer->addAttribute('cellpadding',"$cellPadding"); - if(($cellSpacing=$this->getCellSpacing())>=0) - $writer->addAttribute('cellspacing',"$cellSpacing"); - if($this->getBorderCollapse()) - $writer->addStyleAttribute('border-collapse','collapse'); - switch($this->getGridLines()) - { - case TTableGridLines::Horizontal : $writer->addAttribute('rules','rows'); break; - case TTableGridLines::Vertical : $writer->addAttribute('rules','cols'); break; - case TTableGridLines::Both : $writer->addAttribute('rules','all'); break; - } - parent::addAttributesToRender($writer); - } - public function getBackImageUrl() - { - return $this->_backImageUrl===null?'':$this->_backImageUrl; - } - public function setBackImageUrl($value) - { - $this->_backImageUrl=$value; - } - public function getHorizontalAlign() - { - return $this->_horizontalAlign===null?THorizontalAlign::NotSet:$this->_horizontalAlign; - } - public function setHorizontalAlign($value) - { - $this->_horizontalAlign=TPropertyValue::ensureEnum($value,'THorizontalAlign'); - } - public function getCellPadding() - { - return $this->_cellPadding===null?-1:$this->_cellPadding; - } - public function setCellPadding($value) - { - if(($this->_cellPadding=TPropertyValue::ensureInteger($value))<-1) - throw new TInvalidDataValueException('tablestyle_cellpadding_invalid'); - } - public function getCellSpacing() - { - return $this->_cellSpacing===null?-1:$this->_cellSpacing; - } - public function setCellSpacing($value) - { - if(($this->_cellSpacing=TPropertyValue::ensureInteger($value))<-1) - throw new TInvalidDataValueException('tablestyle_cellspacing_invalid'); - } - public function getGridLines() - { - return $this->_gridLines===null?TTableGridLines::None:$this->_gridLines; - } - public function setGridLines($value) - { - $this->_gridLines=TPropertyValue::ensureEnum($value,'TTableGridLines'); - } - public function getBorderCollapse() - { - return $this->_borderCollapse===null?false:$this->_borderCollapse; - } - public function setBorderCollapse($value) - { - $this->_borderCollapse=TPropertyValue::ensureBoolean($value); - } -} -class TTableItemStyle extends TStyle -{ - private $_horizontalAlign=null; - private $_verticalAlign=null; - private $_wrap=null; - public function reset() - { - parent::reset(); - $this->_verticalAlign=null; - $this->_horizontalAlign=null; - $this->_wrap=null; - } - public function copyFrom($style) - { - parent::copyFrom($style); - if($style instanceof TTableItemStyle) - { - if($this->_verticalAlign===null && $style->_verticalAlign!==null) - $this->_verticalAlign=$style->_verticalAlign; - if($this->_horizontalAlign===null && $style->_horizontalAlign!==null) - $this->_horizontalAlign=$style->_horizontalAlign; - if($this->_wrap===null && $style->_wrap!==null) - $this->_wrap=$style->_wrap; - } - } - public function mergeWith($style) - { - parent::mergeWith($style); - if($style instanceof TTableItemStyle) - { - if($style->_verticalAlign!==null) - $this->_verticalAlign=$style->_verticalAlign; - if($style->_horizontalAlign!==null) - $this->_horizontalAlign=$style->_horizontalAlign; - if($style->_wrap!==null) - $this->_wrap=$style->_wrap; - } - } - public function addAttributesToRender($writer) - { - if(!$this->getWrap()) - $writer->addStyleAttribute('white-space','nowrap'); - if(($horizontalAlign=$this->getHorizontalAlign())!==THorizontalAlign::NotSet) - $writer->addAttribute('align',strtolower($horizontalAlign)); - if(($verticalAlign=$this->getVerticalAlign())!==TVerticalAlign::NotSet) - $writer->addAttribute('valign',strtolower($verticalAlign)); - parent::addAttributesToRender($writer); - } - public function getHorizontalAlign() - { - return $this->_horizontalAlign===null?THorizontalAlign::NotSet:$this->_horizontalAlign; - } - public function setHorizontalAlign($value) - { - $this->_horizontalAlign=TPropertyValue::ensureEnum($value,'THorizontalAlign'); - } - public function getVerticalAlign() - { - return $this->_verticalAlign===null?TVerticalAlign::NotSet:$this->_verticalAlign; - } - public function setVerticalAlign($value) - { - $this->_verticalAlign=TPropertyValue::ensureEnum($value,'TVerticalAlign'); - } - public function getWrap() - { - return $this->_wrap===null?true:$this->_wrap; - } - public function setWrap($value) - { - $this->_wrap=TPropertyValue::ensureBoolean($value); - } -} -class THorizontalAlign extends TEnumerable -{ - const NotSet='NotSet'; - const Left='Left'; - const Right='Right'; - const Center='Center'; - const Justify='Justify'; -} -class TVerticalAlign extends TEnumerable -{ - const NotSet='NotSet'; - const Top='Top'; - const Bottom='Bottom'; - const Middle='Middle'; -} -class TTableGridLines extends TEnumerable -{ - const None='None'; - const Horizontal='Horizontal'; - const Vertical='Vertical'; - const Both='Both'; -} -class TWebControlAdapter extends TControlAdapter -{ - public function render($writer) - { - $this->renderBeginTag($writer); - $this->renderContents($writer); - $this->renderEndTag($writer); - } - public function renderBeginTag($writer) - { - $this->getControl()->renderBeginTag($writer); - } - public function renderContents($writer) - { - $this->getControl()->renderContents($writer); - } - public function renderEndTag($writer) - { - $this->getControl()->renderEndTag($writer); - } -} -class TWebControl extends TControl implements IStyleable -{ - public function copyBaseAttributes(TWebControl $control) - { - $this->setAccessKey($control->getAccessKey()); - $this->setToolTip($control->getToolTip()); - $this->setTabIndex($control->getTabIndex()); - if(!$control->getEnabled()) - $this->setEnabled(false); - if($control->getHasAttributes()) - $this->getAttributes()->copyFrom($control->getAttributes()); - } - public function getAccessKey() - { - return $this->getViewState('AccessKey',''); - } - public function setAccessKey($value) - { - if(strlen($value)>1) - throw new TInvalidDataValueException('webcontrol_accesskey_invalid',get_class($this),$value); - $this->setViewState('AccessKey',$value,''); - } - public function getBackColor() - { - if($style=$this->getViewState('Style',null)) - return $style->getBackColor(); - else - return ''; - } - public function setBackColor($value) - { - $this->getStyle()->setBackColor($value); - } - public function getBorderColor() - { - if($style=$this->getViewState('Style',null)) - return $style->getBorderColor(); - else - return ''; - } - public function setBorderColor($value) - { - $this->getStyle()->setBorderColor($value); - } - public function getBorderStyle() - { - if($style=$this->getViewState('Style',null)) - return $style->getBorderStyle(); - else - return ''; - } - public function setBorderStyle($value) - { - $this->getStyle()->setBorderStyle($value); - } - public function getBorderWidth() - { - if($style=$this->getViewState('Style',null)) - return $style->getBorderWidth(); - else - return ''; - } - public function setBorderWidth($value) - { - $this->getStyle()->setBorderWidth($value); - } - public function getFont() - { - return $this->getStyle()->getFont(); - } - public function getForeColor() - { - if($style=$this->getViewState('Style',null)) - return $style->getForeColor(); - else - return ''; - } - public function setForeColor($value) - { - $this->getStyle()->setForeColor($value); - } - public function getHeight() - { - if($style=$this->getViewState('Style',null)) - return $style->getHeight(); - else - return ''; - } - public function setDisplay($value) - { - $this->getStyle()->setDisplayStyle($value); - } - public function getDisplay() - { - return $this->getStyle()->getDisplayStyle(); - } - public function setCssClass($value) - { - $this->getStyle()->setCssClass($value); - } - public function getCssClass() - { - if($style=$this->getViewState('Style',null)) - return $style->getCssClass(); - else - return ''; - } - public function setHeight($value) - { - $this->getStyle()->setHeight($value); - } - public function getHasStyle() - { - return $this->getViewState('Style',null)!==null; - } - protected function createStyle() - { - return new TStyle; - } - public function getStyle() - { - if($style=$this->getViewState('Style',null)) - return $style; - else - { - $style=$this->createStyle(); - $this->setViewState('Style',$style,null); - return $style; - } - } - public function setStyle($value) - { - if(is_string($value)) - $this->getStyle()->setCustomStyle($value); - else - throw new TInvalidDataValueException('webcontrol_style_invalid',get_class($this)); - } - public function clearStyle() - { - $this->clearViewState('Style'); - } - public function getTabIndex() - { - return $this->getViewState('TabIndex',0); - } - public function setTabIndex($value) - { - $this->setViewState('TabIndex',TPropertyValue::ensureInteger($value),0); - } - protected function getTagName() - { - return 'span'; - } - public function getToolTip() - { - return $this->getViewState('ToolTip',''); - } - public function setToolTip($value) - { - $this->setViewState('ToolTip',$value,''); - } - public function getWidth() - { - if($style=$this->getViewState('Style',null)) - return $style->getWidth(); - else - return ''; - } - public function setWidth($value) - { - $this->getStyle()->setWidth($value); - } - protected function addAttributesToRender($writer) - { - if($this->getID()!=='') - $writer->addAttribute('id',$this->getClientID()); - if(($accessKey=$this->getAccessKey())!=='') - $writer->addAttribute('accesskey',$accessKey); - if(!$this->getEnabled()) - $writer->addAttribute('disabled','disabled'); - if(($tabIndex=$this->getTabIndex())>0) - $writer->addAttribute('tabindex',"$tabIndex"); - if(($toolTip=$this->getToolTip())!=='') - $writer->addAttribute('title',$toolTip); - if($style=$this->getViewState('Style',null)) - $style->addAttributesToRender($writer); - if($this->getHasAttributes()) - { - foreach($this->getAttributes() as $name=>$value) - $writer->addAttribute($name,$value); - } - } - public function render($writer) - { - $this->renderBeginTag($writer); - $this->renderContents($writer); - $this->renderEndTag($writer); - } - public function renderBeginTag($writer) - { - $this->addAttributesToRender($writer); - $writer->renderBeginTag($this->getTagName()); - } - public function renderContents($writer) - { - parent::renderChildren($writer); - } - public function renderEndTag($writer) - { - $writer->renderEndTag(); - } -} -class TCompositeControl extends TControl implements INamingContainer -{ - protected function initRecursive($namingContainer=null) - { - $this->ensureChildControls(); - parent::initRecursive($namingContainer); - } -} -class TTemplateControl extends TCompositeControl -{ - const EXT_TEMPLATE='.tpl'; - private static $_template=array(); - private $_localTemplate=null; - private $_master=null; - private $_masterClass=''; - private $_contents=array(); - private $_placeholders=array(); - public function getTemplate() - { - if($this->_localTemplate===null) - { - $class=get_class($this); - if(!isset(self::$_template[$class])) - self::$_template[$class]=$this->loadTemplate(); - return self::$_template[$class]; - } - else - return $this->_localTemplate; - } - public function setTemplate($value) - { - $this->_localTemplate=$value; - } - public function getIsSourceTemplateControl() - { - if(($template=$this->getTemplate())!==null) - return $template->getIsSourceTemplate(); - else - return false; - } - public function getTemplateDirectory() - { - if(($template=$this->getTemplate())!==null) - return $template->getContextPath(); - else - return ''; - } - protected function loadTemplate() - { - $template=$this->getService()->getTemplateManager()->getTemplateByClassName(get_class($this)); - return $template; - } - public function createChildControls() - { - if($tpl=$this->getTemplate()) - { - foreach($tpl->getDirective() as $name=>$value) - { - if(is_string($value)) - $this->setSubProperty($name,$value); - else - throw new TConfigurationException('templatecontrol_directive_invalid',get_class($this),$name); - } - $tpl->instantiateIn($this); - } - } - public function registerContent($id,TContent $object) - { - if(isset($this->_contents[$id])) - throw new TConfigurationException('templatecontrol_contentid_duplicated',$id); - else - $this->_contents[$id]=$object; - } - public function registerContentPlaceHolder($id,TContentPlaceHolder $object) - { - if(isset($this->_placeholders[$id])) - throw new TConfigurationException('templatecontrol_placeholderid_duplicated',$id); - else - $this->_placeholders[$id]=$object; - } - public function getMasterClass() - { - return $this->_masterClass; - } - public function setMasterClass($value) - { - $this->_masterClass=$value; - } - public function getMaster() - { - return $this->_master; - } - public function injectContent($id,$content) - { - if(isset($this->_placeholders[$id])) - { - $placeholder=$this->_placeholders[$id]; - $controls=$placeholder->getParent()->getControls(); - $loc=$controls->remove($placeholder); - $controls->insertAt($loc,$content); - } - else - throw new TConfigurationException('templatecontrol_placeholder_inexistent',$id); - } - protected function initRecursive($namingContainer=null) - { - $this->ensureChildControls(); - if($this->_masterClass!=='') - { - $master=Prado::createComponent($this->_masterClass); - if(!($master instanceof TTemplateControl)) - throw new TInvalidDataValueException('templatecontrol_mastercontrol_invalid'); - $this->_master=$master; - $this->getControls()->clear(); - $this->getControls()->add($master); - $master->ensureChildControls(); - foreach($this->_contents as $id=>$content) - $master->injectContent($id,$content); - } - else if(!empty($this->_contents)) - throw new TConfigurationException('templatecontrol_mastercontrol_required',get_class($this)); - parent::initRecursive($namingContainer); - } -} -class TForm extends TControl -{ - public function onInit($param) - { - parent::onInit($param); - $this->getPage()->setForm($this); - } - protected function addAttributesToRender($writer) - { - $writer->addAttribute('id',$this->getClientID()); - $writer->addAttribute('method',$this->getMethod()); - $uri=$this->getRequest()->getRequestURI(); - $writer->addAttribute('action',str_replace('&','&',str_replace('&','&',$uri))); - if(($enctype=$this->getEnctype())!=='') - $writer->addAttribute('enctype',$enctype); - $attributes=$this->getAttributes(); - $attributes->remove('action'); - $writer->addAttributes($attributes); - if(($butt=$this->getDefaultButton())!=='') - { - if(($button=$this->findControl($butt))!==null) - $this->getPage()->getClientScript()->registerDefaultButton($this, $button); - else - throw new TInvalidDataValueException('form_defaultbutton_invalid',$butt); - } - } - public function render($writer) - { - $page=$this->getPage(); - $page->beginFormRender($writer); - $textWriter=new TTextWriter; - $this->renderChildren(new THtmlWriter($textWriter)); - $content=$textWriter->flush(); - $page->endFormRender($writer); - $this->addAttributesToRender($writer); - $writer->renderBeginTag('form'); - $cs=$page->getClientScript(); - if($page->getClientSupportsJavaScript()) - { - $cs->renderHiddenFields($writer); - $cs->renderScriptFiles($writer); - $cs->renderBeginScripts($writer); - $writer->write($content); - $cs->renderEndScripts($writer); - } - else - { - $cs->renderHiddenFields($writer); - $writer->write($content); - } - $writer->renderEndTag(); - } - public function getDefaultButton() - { - return $this->getViewState('DefaultButton',''); - } - public function setDefaultButton($value) - { - $this->setViewState('DefaultButton',$value,''); - } - public function getMethod() - { - return $this->getViewState('Method','post'); - } - public function setMethod($value) - { - $this->setViewState('Method',TPropertyValue::ensureEnum($value,'post','get'),'post'); - } - public function getEnctype() - { - return $this->getViewState('Enctype',''); - } - public function setEnctype($value) - { - $this->setViewState('Enctype',$value,''); - } - public function getName() - { - return $this->getUniqueID(); - } -} -class TClientScriptManager extends TApplicationComponent -{ - const SCRIPT_PATH='Web/Javascripts/source'; - const SCRIPT_LOADER='Web/Javascripts/clientscripts.php'; - private $_page; - private $_hiddenFields=array(); - private $_beginScripts=array(); - private $_endScripts=array(); - private $_scriptFiles=array(); - private $_headScriptFiles=array(); - private $_headScripts=array(); - private $_styleSheetFiles=array(); - private $_styleSheets=array(); - private $_registeredPradoScripts=array(); - private static $_pradoScripts; - private static $_pradoPackages; - public function __construct(TPage $owner) - { - $this->_page=$owner; - } - public function getRequiresHead() - { - return count($this->_styleSheetFiles) || count($this->_styleSheets) - || count($this->_headScriptFiles) || count($this->_headScripts); - } - public function registerPradoScript($name) - { - $this->registerPradoScriptInternal($name); - $params=func_get_args(); - $this->_page->registerCachingAction('Page.ClientScript','registerPradoScript',$params); - } - private function registerPradoScriptInternal($name) - { - if(!isset($this->_registeredPradoScripts[$name])) - { - if(self::$_pradoScripts === null) - { - $packageFile = Prado::getFrameworkPath().DIRECTORY_SEPARATOR.self::SCRIPT_PATH.'/packages.php'; - list($packages,$deps)= include($packageFile); - self::$_pradoScripts = $deps; - self::$_pradoPackages = $packages; - } - if(isset(self::$_pradoScripts[$name])) - $this->_registeredPradoScripts[$name]=true; - else - throw new TInvalidOperationException('csmanager_pradoscript_invalid',$name); - } - } - public function getPradoScriptAssetUrl() - { - $base = Prado::getFrameworkPath().DIRECTORY_SEPARATOR.self::SCRIPT_PATH; - $assets = Prado::getApplication()->getAssetManager(); - return $assets->getPublishedUrl($base); - } - protected function renderPradoScripts($writer) - { - if(($packages=array_keys($this->_registeredPradoScripts))!==array()) - { - if (Prado::getApplication()->getMode()!==TApplicationMode::Debug) - { - $base = Prado::getFrameworkPath().DIRECTORY_SEPARATOR.self::SCRIPT_PATH; - $url = $this->registerJavascriptPackages($base, $packages); - $writer->write(TJavaScript::renderScriptFile($url)); - } - else - { - $base = Prado::getFrameworkPath().DIRECTORY_SEPARATOR.self::SCRIPT_PATH; - list($path,$baseUrl)=$this->getPackagePathUrl($base); - $packagesUrl=array(); - foreach ($packages as $p) - { - foreach (self::$_pradoScripts[$p] as $dep) - { - foreach (self::$_pradoPackages[$dep] as $script) - { - if (!in_array($url=$baseUrl.'/'.$script,$packagesUrl)) - $packagesUrl[]=$url; - } - } - } - $writer->write(TJavaScript::renderScriptFiles($packagesUrl)); - } - } - } - public function registerJavascriptPackages($base, $packages, $debug=null, $gzip=true) - { - list($path,$url) = $this->getPackagePathUrl($base); - $scriptLoaderPath = $path.'/'.basename(self::SCRIPT_LOADER); - $scriptLoaderSrc = Prado::getFrameworkPath().DIRECTORY_SEPARATOR.self::SCRIPT_LOADER; - if(!is_file($scriptLoaderPath)) - { - copy($scriptLoaderSrc, $scriptLoaderPath); - chmod($scriptLoaderPath, PRADO_CHMOD); - } - $url .= '/'.basename(self::SCRIPT_LOADER).'?js='.implode(',', $packages); - if($debug!==false && $this->getApplication()->getMode()===TApplicationMode::Debug) - { - $this->verifyJavascriptPackages($base,$path,$packages); - $url.='&mode=debug'; - } - if($gzip===false) - $url.='&gzip=false'; - return $url; - } - protected function verifyJavascriptPackages($base,$path,$scripts) - { - $file = $path.'/packages.php'; - if(is_file($file)) - { - list($packs,$deps) = include($file); - if(count($missing = array_diff($scripts, array_keys($deps))) > 0) - { - throw new TConfigurationException('csmanager_invalid_packages', - $base.'/packages.php',implode(', ', $missing), implode(', ', array_keys($deps))); - } - } - } - protected function getPackagePathUrl($base) - { - $assets = Prado::getApplication()->getAssetManager(); - if(strpos($base, $assets->getBaseUrl())===false) - { - if(($dir = Prado::getPathOfNameSpace($base)) !== null) { - $base = $dir; - } - return array($assets->getPublishedPath($base), $assets->publishFilePath($base)); - } - else - { - return array($assets->getBasePath().str_replace($assets->getBaseUrl(),'',$base), $base); - } - } - public function getCallbackReference(ICallbackEventHandler $callbackHandler, $options=null) - { - $options = !is_array($options) ? array() : $options; - $class = new TReflectionClass($callbackHandler); - $clientSide = $callbackHandler->getActiveControl()->getClientSide(); - $options = array_merge($options, $clientSide->getOptions()->toArray()); - $optionString = TJavaScript::encode($options); - $this->registerPradoScriptInternal('ajax'); - $id = $callbackHandler->getUniqueID(); - return "new Prado.CallbackRequest('{$id}',{$optionString})"; - } - public function registerCallbackControl($class, $options) - { - $optionString=TJavaScript::encode($options); - $code="new {$class}({$optionString});"; - $this->_endScripts[sprintf('%08X', crc32($code))]=$code; - $this->registerPradoScriptInternal('ajax'); - $params=func_get_args(); - $this->_page->registerCachingAction('Page.ClientScript','registerCallbackControl',$params); - } - public function registerPostBackControl($class,$options) - { - if($class === null) { - return; - } - if(!isset($options['FormID']) && ($form=$this->_page->getForm())!==null) - $options['FormID']=$form->getClientID(); - $optionString=TJavaScript::encode($options); - $code="new {$class}({$optionString});"; - $this->_endScripts[sprintf('%08X', crc32($code))]=$code; - $this->_hiddenFields[TPage::FIELD_POSTBACK_TARGET]=''; - $this->_hiddenFields[TPage::FIELD_POSTBACK_PARAMETER]=''; - $this->registerPradoScriptInternal('prado'); - $params=func_get_args(); - $this->_page->registerCachingAction('Page.ClientScript','registerPostBackControl',$params); - } - public function registerDefaultButton($panel, $button) - { - $panelID=is_string($panel)?$panel:$panel->getUniqueID(); - if(is_string($button)) - $buttonID=$button; - else - { - $button->setIsDefaultButton(true); - $buttonID=$button->getUniqueID(); - } - $options = TJavaScript::encode($this->getDefaultButtonOptions($panelID, $buttonID)); - $code = "new Prado.WebUI.DefaultButton($options);"; - $this->_endScripts['prado:'.$panelID]=$code; - $this->_hiddenFields[TPage::FIELD_POSTBACK_TARGET]=''; - $this->registerPradoScriptInternal('prado'); - $params=array($panelID,$buttonID); - $this->_page->registerCachingAction('Page.ClientScript','registerDefaultButton',$params); - } - protected function getDefaultButtonOptions($panelID, $buttonID) - { - $options['Panel'] = TControl::convertUniqueIdToClientId($panelID); - $options['Target'] = TControl::convertUniqueIdToClientId($buttonID); - $options['EventTarget'] = $buttonID; - $options['Event'] = 'click'; - return $options; - } - public function registerFocusControl($target) - { - $this->registerPradoScriptInternal('effects'); - if($target instanceof TControl) - $target=$target->getClientID(); - $id = TJavaScript::quoteString($target); - $this->_endScripts['prado:focus'] = 'new Effect.ScrollTo("'.$id.'"); Prado.Element.focus("'.$id.'");'; - $params=func_get_args(); - $this->_page->registerCachingAction('Page.ClientScript','registerFocusControl',$params); - } - public function registerStyleSheetFile($key,$url,$media='') - { - if($media==='') - $this->_styleSheetFiles[$key]=$url; - else - $this->_styleSheetFiles[$key]=array($url,$media); - $params=func_get_args(); - $this->_page->registerCachingAction('Page.ClientScript','registerStyleSheetFile',$params); - } - public function registerStyleSheet($key,$css,$media='') - { - $this->_styleSheets[$key]=$css; - $params=func_get_args(); - $this->_page->registerCachingAction('Page.ClientScript','registerStyleSheet',$params); - } - public function registerHeadScriptFile($key,$url) - { - $this->_headScriptFiles[$key]=$url; - $params=func_get_args(); - $this->_page->registerCachingAction('Page.ClientScript','registerHeadScriptFile',$params); - } - public function registerHeadScript($key,$script) - { - $this->_headScripts[$key]=$script; - $params=func_get_args(); - $this->_page->registerCachingAction('Page.ClientScript','registerHeadScript',$params); - } - public function registerScriptFile($key,$url) - { - $this->_scriptFiles[$key]=$url; - $params=func_get_args(); - $this->_page->registerCachingAction('Page.ClientScript','registerScriptFile',$params); - } - public function registerBeginScript($key,$script) - { - $this->_beginScripts[$key]=$script; - $params=func_get_args(); - $this->_page->registerCachingAction('Page.ClientScript','registerBeginScript',$params); - } - public function registerEndScript($key,$script) - { - $this->_endScripts[$key]=$script; - $params=func_get_args(); - $this->_page->registerCachingAction('Page.ClientScript','registerEndScript',$params); - } - public function registerHiddenField($name,$value) - { - $this->_hiddenFields[$name]=$value; - $params=func_get_args(); - $this->_page->registerCachingAction('Page.ClientScript','registerHiddenField',$params); - } - public function isStyleSheetFileRegistered($key) - { - return isset($this->_styleSheetFiles[$key]); - } - public function isStyleSheetRegistered($key) - { - return isset($this->_styleSheets[$key]); - } - public function isHeadScriptFileRegistered($key) - { - return isset($this->_headScriptFiles[$key]); - } - public function isHeadScriptRegistered($key) - { - return isset($this->_headScripts[$key]); - } - public function isScriptFileRegistered($key) - { - return isset($this->_scriptFiles[$key]); - } - public function isBeginScriptRegistered($key) - { - return isset($this->_beginScripts[$key]); - } - public function isEndScriptRegistered($key) - { - return isset($this->_endScripts[$key]); - } - public function hasEndScripts() - { - return count($this->_endScripts) > 0; - } - public function hasBeginScripts() - { - return count($this->_beginScripts) > 0; - } - public function isHiddenFieldRegistered($key) - { - return isset($this->_hiddenFields[$key]); - } - public function renderStyleSheetFiles($writer) - { - $str=''; - foreach($this->_styleSheetFiles as $url) - { - if(is_array($url)) - $str.="<link rel=\"stylesheet\" type=\"text/css\" media=\"{$url[1]}\" href=\"".THttpUtility::htmlEncode($url[0])."\" />\n"; - else - $str.="<link rel=\"stylesheet\" type=\"text/css\" href=\"".THttpUtility::htmlEncode($url)."\" />\n"; - } - $writer->write($str); - } - public function renderStyleSheets($writer) - { - if(count($this->_styleSheets)) - $writer->write("<style type=\"text/css\">\n/*<![CDATA[*/\n".implode("\n",$this->_styleSheets)."\n/*]]>*/\n</style>\n"); - } - public function renderHeadScriptFiles($writer) - { - $writer->write(TJavaScript::renderScriptFiles($this->_headScriptFiles)); - } - public function renderHeadScripts($writer) - { - $writer->write(TJavaScript::renderScriptBlocks($this->_headScripts)); - } - public function renderScriptFiles($writer) - { - $this->renderPradoScripts($writer); - if(!empty($this->_scriptFiles)) - $writer->write(TJavaScript::renderScriptFiles($this->_scriptFiles)); - } - public function renderBeginScripts($writer) - { - $writer->write(TJavaScript::renderScriptBlocks($this->_beginScripts)); - } - public function renderEndScripts($writer) - { - $writer->write(TJavaScript::renderScriptBlocks($this->_endScripts)); - } - public function renderHiddenFields($writer) - { - $str=''; - foreach($this->_hiddenFields as $name=>$value) - { - $id=strtr($name,':','_'); - if(is_array($value)) - { - foreach($value as $v) - $str.='<input type="hidden" name="'.$name.'[]" id="'.$id.'" value="'.THttpUtility::htmlEncode($value)."\" />\n"; - } - else - { - $str.='<input type="hidden" name="'.$name.'" id="'.$id.'" value="'.THttpUtility::htmlEncode($value)."\" />\n"; - } - } - if($str!=='') - $writer->write("<div style=\"visibility:hidden;\">\n".$str."</div>\n"); - } -} -abstract class TClientSideOptions extends TComponent -{ - private $_options; - public function __construct() - { - $this->_options = Prado::createComponent('System.Collections.TMap'); - } - protected function setFunction($name, $code) - { - if(!TJavaScript::isFunction($code)) - $code = TJavaScript::quoteFunction($this->ensureFunction($code)); - $this->setOption($name, $code); - } - protected function getOption($name) - { - return $this->_options->itemAt($name); - } - protected function setOption($name, $value) - { - $this->_options->add($name, $value); - } - public function getOptions() - { - return $this->_options; - } - protected function ensureFunction($javascript) - { - return "function(sender, parameter){ {$javascript} }"; - } -} -class TPage extends TTemplateControl -{ - const FIELD_POSTBACK_TARGET='PRADO_POSTBACK_TARGET'; - const FIELD_POSTBACK_PARAMETER='PRADO_POSTBACK_PARAMETER'; - const FIELD_LASTFOCUS='PRADO_LASTFOCUS'; - const FIELD_PAGESTATE='PRADO_PAGESTATE'; - const FIELD_CALLBACK_TARGET='PRADO_CALLBACK_TARGET'; - const FIELD_CALLBACK_PARAMETER='PRADO_CALLBACK_PARAMETER'; - private static $_systemPostFields=array( - 'PRADO_POSTBACK_TARGET'=>true, - 'PRADO_POSTBACK_PARAMETER'=>true, - 'PRADO_LASTFOCUS'=>true, - 'PRADO_PAGESTATE'=>true, - 'PRADO_CALLBACK_TARGET'=>true, - 'PRADO_CALLBACK_PARAMETER'=>true - ); - private $_form; - private $_head; - private $_validators=array(); - private $_validated=false; - private $_theme; - private $_title; - private $_styleSheet; - private $_clientScript; - private $_postData; - private $_restPostData; - private $_controlsPostDataChanged=array(); - private $_controlsRequiringPostData=array(); - private $_controlsRegisteredForPostData=array(); - private $_postBackEventTarget; - private $_postBackEventParameter; - private $_formRendered=false; - private $_inFormRender=false; - private $_focus; - private $_pagePath=''; - private $_enableStateValidation=true; - private $_enableStateEncryption=false; - private $_statePersisterClass='System.Web.UI.TPageStatePersister'; - private $_statePersister; - private $_cachingStack; - private $_clientState=''; - private $_postDataLoaders=array(); - private $_isLoadingPostData=false; - private $_enableJavaScript=true; - public function __construct() - { - parent::__construct(); - $this->setPage($this); - } - public function run($writer) - { - $this->determinePostBackMode(); - if($this->getIsPostBack()) - { - if($this->getIsCallback()) - $this->processCallbackRequest($writer); - else - $this->processPostBackRequest($writer); - } - else - $this->processNormalRequest($writer); - } - protected function processNormalRequest($writer) - { - $this->onPreInit(null); - $this->initRecursive(); - $this->onInitComplete(null); - $this->onPreLoad(null); - $this->loadRecursive(); - $this->onLoadComplete(null); - $this->preRenderRecursive(); - $this->onPreRenderComplete(null); - $this->savePageState(); - $this->onSaveStateComplete(null); - $this->renderControl($writer); - $this->unloadRecursive(); - } - protected function processPostBackRequest($writer) - { - $this->onPreInit(null); - $this->initRecursive(); - $this->onInitComplete(null); - $this->_restPostData=new TMap; - $this->loadPageState(); - $this->processPostData($this->_postData,true); - $this->onPreLoad(null); - $this->loadRecursive(); - $this->processPostData($this->_restPostData,false); - $this->raiseChangedEvents(); - $this->raisePostBackEvent(); - $this->onLoadComplete(null); - $this->preRenderRecursive(); - $this->onPreRenderComplete(null); - $this->savePageState(); - $this->onSaveStateComplete(null); - $this->renderControl($writer); - $this->unloadRecursive(); - } - protected function processCallbackRequest($writer) - { - Prado::using('System.Web.UI.ActiveControls.TActivePageAdapter'); - $this->setAdapter(new TActivePageAdapter($this)); - if (($g=$this->getApplication()->getGlobalization(false))!==null && - strtoupper($enc=$g->getCharset())!='UTF-8') - foreach ($this->_postData as $k=>$v) - $this->_postData[$k]=iconv('UTF-8',$enc.'//IGNORE',$v); - $this->onPreInit(null); - $this->initRecursive(); - $this->onInitComplete(null); - $this->_restPostData=new TMap; - $this->loadPageState(); - $this->processPostData($this->_postData,true); - $this->onPreLoad(null); - $this->loadRecursive(); - $this->processPostData($this->_restPostData,false); - $this->raiseChangedEvents(); - $this->getAdapter()->processCallbackEvent($writer); - $this->onLoadComplete(null); - $this->preRenderRecursive(); - $this->onPreRenderComplete(null); - $this->savePageState(); - $this->onSaveStateComplete(null); - $this->getAdapter()->renderCallbackResponse($writer); - $this->unloadRecursive(); - } - public function getCallbackClient() - { - if($this->getAdapter() !== null) - return $this->getAdapter()->getCallbackClientHandler(); - else - return new TCallbackClientScript(); - } - public function setCallbackClient($client) - { - $this->getAdapter()->setCallbackClientHandler($client); - } - public function getCallbackEventTarget() - { - return $this->getAdapter()->getCallbackEventTarget(); - } - public function setCallbackEventTarget(TControl $control) - { - $this->getAdapter()->setCallbackEventTarget($control); - } - public function getCallbackEventParameter() - { - return $this->getAdapter()->getCallbackEventParameter(); - } - public function setCallbackEventParameter($value) - { - $this->getAdapter()->setCallbackEventParameter($value); - } - public function registerPostDataLoader($control) - { - $id=is_string($control)?$control:$control->getUniqueID(); - $this->_postDataLoaders[$id] = true; - } - public function getPostDataLoaders() - { - return array_keys($this->_postDataLoaders); - } - public function getForm() - { - return $this->_form; - } - public function setForm(TForm $form) - { - if($this->_form===null) - $this->_form=$form; - else - throw new TInvalidOperationException('page_form_duplicated'); - } - public function getValidators($validationGroup=null) - { - if(!$this->_validators) - $this->_validators=new TList; - if($validationGroup===null) - return $this->_validators; - else - { - $list=new TList; - foreach($this->_validators as $validator) - if($validator->getValidationGroup()===$validationGroup) - $list->add($validator); - return $list; - } - } - public function validate($validationGroup=null) - { - $this->_validated=true; - if($this->_validators && $this->_validators->getCount()) - { - if($validationGroup===null) - { - foreach($this->_validators as $validator) - $validator->validate(); - } - else - { - foreach($this->_validators as $validator) - { - if($validator->getValidationGroup()===$validationGroup) - $validator->validate(); - } - } - } - } - public function getIsValid() - { - if($this->_validated) - { - if($this->_validators && $this->_validators->getCount()) - { - foreach($this->_validators as $validator) - if(!$validator->getIsValid()) - return false; - } - return true; - } - else - throw new TInvalidOperationException('page_isvalid_unknown'); - } - public function getTheme() - { - if(is_string($this->_theme)) - $this->_theme=$this->getService()->getThemeManager()->getTheme($this->_theme); - return $this->_theme; - } - public function setTheme($value) - { - $this->_theme=empty($value)?null:$value; - } - public function getStyleSheetTheme() - { - if(is_string($this->_styleSheet)) - $this->_styleSheet=$this->getService()->getThemeManager()->getTheme($this->_styleSheet); - return $this->_styleSheet; - } - public function setStyleSheetTheme($value) - { - $this->_styleSheet=empty($value)?null:$value; - } - public function applyControlSkin($control) - { - if(($theme=$this->getTheme())!==null) - $theme->applySkin($control); - } - public function applyControlStyleSheet($control) - { - if(($theme=$this->getStyleSheetTheme())!==null) - $theme->applySkin($control); - } - public function getClientScript() - { - if(!$this->_clientScript) - $this->_clientScript=new TClientScriptManager($this); - return $this->_clientScript; - } - public function onPreInit($param) - { - $this->raiseEvent('OnPreInit',$this,$param); - } - public function onInitComplete($param) - { - $this->raiseEvent('OnInitComplete',$this,$param); - } - public function onPreLoad($param) - { - $this->raiseEvent('OnPreLoad',$this,$param); - } - public function onLoadComplete($param) - { - $this->raiseEvent('OnLoadComplete',$this,$param); - } - public function onPreRenderComplete($param) - { - $this->raiseEvent('OnPreRenderComplete',$this,$param); - $cs=$this->getClientScript(); - $theme=$this->getTheme(); - if($theme instanceof ITheme) - { - foreach($theme->getStyleSheetFiles() as $url) - $cs->registerStyleSheetFile($url,$url,$this->getCssMediaType($url)); - foreach($theme->getJavaScriptFiles() as $url) - $cs->registerHeadScriptFile($url,$url); - } - $styleSheet=$this->getStyleSheetTheme(); - if($styleSheet instanceof ITheme) - { - foreach($styleSheet->getStyleSheetFiles() as $url) - $cs->registerStyleSheetFile($url,$url,$this->getCssMediaType($url)); - foreach($styleSheet->getJavaScriptFiles() as $url) - $cs->registerHeadScriptFile($url,$url); - } - if($cs->getRequiresHead() && $this->getHead()===null) - throw new TConfigurationException('page_head_required'); - } - private function getCssMediaType($url) - { - $segs=explode('.',basename($url)); - if(isset($segs[2])) - return $segs[count($segs)-2]; - else - return ''; - } - public function onSaveStateComplete($param) - { - $this->raiseEvent('OnSaveStateComplete',$this,$param); - } - private function determinePostBackMode() - { - $postData=$this->getRequest(); - if($postData->contains(self::FIELD_PAGESTATE) || $postData->contains(self::FIELD_POSTBACK_TARGET)) - $this->_postData=$postData; - } - public function getIsPostBack() - { - return $this->_postData!==null; - } - public function getIsCallback() - { - return $this->getIsPostBack() && $this->getRequest()->contains(self::FIELD_CALLBACK_TARGET); - } - public function saveState() - { - parent::saveState(); - $this->setViewState('ControlsRequiringPostBack',$this->_controlsRegisteredForPostData,array()); - } - public function loadState() - { - parent::loadState(); - $this->_controlsRequiringPostData=$this->getViewState('ControlsRequiringPostBack',array()); - } - protected function loadPageState() - { - $state=$this->getStatePersister()->load(); - $this->loadStateRecursive($state,$this->getEnableViewState()); - } - protected function savePageState() - { - $state=&$this->saveStateRecursive($this->getEnableViewState()); - $this->getStatePersister()->save($state); - } - protected function isSystemPostField($field) - { - return isset(self::$_systemPostFields[$field]); - } - public function registerRequiresPostData($control) - { - $id=is_string($control)?$control:$control->getUniqueID(); - $this->_controlsRegisteredForPostData[$id]=true; - $this->registerPostDataLoader($id); - $params=func_get_args(); - foreach($this->getCachingStack() as $item) - $item->registerAction('Page','registerRequiresPostData',$id); - } - public function getPostBackEventTarget() - { - if($this->_postBackEventTarget===null && $this->_postData!==null) - { - $eventTarget=$this->_postData->itemAt(self::FIELD_POSTBACK_TARGET); - if(!empty($eventTarget)) - $this->_postBackEventTarget=$this->findControl($eventTarget); - } - return $this->_postBackEventTarget; - } - public function setPostBackEventTarget(TControl $control) - { - $this->_postBackEventTarget=$control; - } - public function getPostBackEventParameter() - { - if($this->_postBackEventParameter===null && $this->_postData!==null) - { - if(($this->_postBackEventParameter=$this->_postData->itemAt(self::FIELD_POSTBACK_PARAMETER))===null) - $this->_postBackEventParameter=''; - } - return $this->_postBackEventParameter; - } - public function setPostBackEventParameter($value) - { - $this->_postBackEventParameter=$value; - } - protected function processPostData($postData,$beforeLoad) - { - $this->_isLoadingPostData=true; - if($beforeLoad) - $this->_restPostData=new TMap; - foreach($postData as $key=>$value) - { - if($this->isSystemPostField($key)) - continue; - else if($control=$this->findControl($key)) - { - if($control instanceof IPostBackDataHandler) - { - if($control->loadPostData($key,$postData)) - $this->_controlsPostDataChanged[]=$control; - } - else if($control instanceof IPostBackEventHandler && - empty($this->_postData[self::FIELD_POSTBACK_TARGET])) - { - $this->_postData->add(self::FIELD_POSTBACK_TARGET,$key); - } - unset($this->_controlsRequiringPostData[$key]); - } - else if($beforeLoad) - $this->_restPostData->add($key,$value); - } - foreach($this->_controlsRequiringPostData as $key=>$value) - { - if($control=$this->findControl($key)) - { - if($control instanceof IPostBackDataHandler) - { - if($control->loadPostData($key,$this->_postData)) - $this->_controlsPostDataChanged[]=$control; - } - else - throw new TInvalidDataValueException('page_postbackcontrol_invalid',$key); - unset($this->_controlsRequiringPostData[$key]); - } - } - $this->_isLoadingPostData=false; - } - public function getIsLoadingPostData() - { - return $this->_isLoadingPostData; - } - private function raiseChangedEvents() - { - foreach($this->_controlsPostDataChanged as $control) - $control->raisePostDataChangedEvent(); - } - private function raisePostBackEvent() - { - if(($postBackHandler=$this->getPostBackEventTarget())===null) - $this->validate(); - else if($postBackHandler instanceof IPostBackEventHandler) - $postBackHandler->raisePostBackEvent($this->getPostBackEventParameter()); - } - public function ensureRenderInForm($control) - { - if(!$this->getIsCallback() && !$this->_inFormRender) - throw new TConfigurationException('page_control_outofform',get_class($control),$control->getUniqueID()); - } - public function beginFormRender($writer) - { - if($this->_formRendered) - throw new TConfigurationException('page_form_duplicated'); - $this->_formRendered=true; - $this->_inFormRender=true; - $this->getClientScript()->registerHiddenField(self::FIELD_PAGESTATE,$this->getClientState()); - } - public function endFormRender($writer) - { - if($this->_focus) - { - if(($this->_focus instanceof TControl) && $this->_focus->getVisible(true)) - $focus=$this->_focus->getClientID(); - else - $focus=$this->_focus; - $this->getClientScript()->registerFocusControl($focus); - } - else if($this->_postData && ($lastFocus=$this->_postData->itemAt(self::FIELD_LASTFOCUS))!==null) - $this->getClientScript()->registerFocusControl($lastFocus); - $this->_inFormRender=false; - } - public function setFocus($value) - { - $this->_focus=$value; - } - public function getClientSupportsJavaScript() - { - return $this->_enableJavaScript; - } - public function setClientSupportsJavaScript($value) - { - $this->_enableJavaScript=TPropertyValue::ensureBoolean($value); - } - public function getHead() - { - return $this->_head; - } - public function setHead(THead $value) - { - if($this->_head) - throw new TInvalidOperationException('page_head_duplicated'); - $this->_head=$value; - if($this->_title!==null) - { - $this->_head->setTitle($this->_title); - $this->_title=null; - } - } - public function getTitle() - { - if($this->_head) - return $this->_head->getTitle(); - else - return $this->_title===null ? '' : $this->_title; - } - public function setTitle($value) - { - if($this->_head) - $this->_head->setTitle($value); - else - $this->_title=$value; - } - public function getClientState() - { - return $this->_clientState; - } - public function setClientState($state) - { - $this->_clientState=$state; - } - public function getRequestClientState() - { - return $this->getRequest()->itemAt(self::FIELD_PAGESTATE); - } - public function getStatePersisterClass() - { - return $this->_statePersisterClass; - } - public function setStatePersisterClass($value) - { - $this->_statePersisterClass=$value; - } - public function getStatePersister() - { - if($this->_statePersister===null) - { - $this->_statePersister=Prado::createComponent($this->_statePersisterClass); - if(!($this->_statePersister instanceof IPageStatePersister)) - throw new TInvalidDataTypeException('page_statepersister_invalid'); - $this->_statePersister->setPage($this); - } - return $this->_statePersister; - } - public function getEnableStateValidation() - { - return $this->_enableStateValidation; - } - public function setEnableStateValidation($value) - { - $this->_enableStateValidation=TPropertyValue::ensureBoolean($value); - } - public function getEnableStateEncryption() - { - return $this->_enableStateEncryption; - } - public function setEnableStateEncryption($value) - { - $this->_enableStateEncryption=TPropertyValue::ensureBoolean($value); - } - public function getPagePath() - { - return $this->_pagePath; - } - public function setPagePath($value) - { - $this->_pagePath=$value; - } - public function registerCachingAction($context,$funcName,$funcParams) - { - if($this->_cachingStack) - { - foreach($this->_cachingStack as $cache) - $cache->registerAction($context,$funcName,$funcParams); - } - } - public function getCachingStack() - { - if(!$this->_cachingStack) - $this->_cachingStack=new TStack; - return $this->_cachingStack; - } -} -interface IPageStatePersister -{ - public function getPage(); - public function setPage(TPage $page); - public function save($state); - public function load(); -} -class TPageStateFormatter -{ - public static function serialize($page,$data) - { - $sm=$page->getApplication()->getSecurityManager(); - if($page->getEnableStateValidation()) - $str=$sm->hashData(Prado::serialize($data)); - else - $str=Prado::serialize($data); - if(extension_loaded('zlib')) - $str=gzcompress($str); - if($page->getEnableStateEncryption()) - $str=$sm->encrypt($str); - return base64_encode($str); - } - public static function unserialize($page,$data) - { - $str=base64_decode($data); - if($str==='') - return null; - if($str!==false) - { - $sm=$page->getApplication()->getSecurityManager(); - if($page->getEnableStateEncryption()) - $str=$sm->decrypt($str); - if(extension_loaded('zlib')) - $str=@gzuncompress($str); - if($page->getEnableStateValidation()) - { - if(($str=$sm->validateData($str))!==false) - return Prado::unserialize($str); - } - else - return $str; - } - return null; - } -} -class TOutputCache extends TControl implements INamingContainer -{ - const CACHE_ID_PREFIX='prado:outputcache'; - private $_cacheModuleID=''; - private $_dataCached=false; - private $_cacheAvailable=false; - private $_cacheChecked=false; - private $_cacheKey=null; - private $_duration=60; - private $_cache=null; - private $_contents; - private $_state; - private $_actions=array(); - private $_varyByParam=''; - private $_keyPrefix=''; - private $_varyBySession=false; - private $_cachePostBack=false; - private $_cacheTime=0; - public function getAllowChildControls() - { - $this->determineCacheability(); - return !$this->_dataCached; - } - private function determineCacheability() - { - if(!$this->_cacheChecked) - { - $this->_cacheChecked=true; - if($this->_duration>0 && ($this->_cachePostBack || !$this->getPage()->getIsPostBack())) - { - if($this->_cacheModuleID!=='') - { - $this->_cache=$this->getApplication()->getModule($this->_cacheModuleID); - if(!($this->_cache instanceof ICache)) - throw new TConfigurationException('outputcache_cachemoduleid_invalid',$this->_cacheModuleID); - } - else - $this->_cache=$this->getApplication()->getCache(); - if($this->_cache!==null) - { - $this->_cacheAvailable=true; - $data=$this->_cache->get($this->getCacheKey()); - if(is_array($data)) - { - $param=new TOutputCacheCheckDependencyEventParameter; - $param->setCacheTime(isset($data[3])?$data[3]:0); - $this->onCheckDependency($param); - $this->_dataCached=$param->getIsValid(); - } - else - $this->_dataCached=false; - if($this->_dataCached) - list($this->_contents,$this->_state,$this->_actions,$this->_cacheTime)=$data; - } - } - } - } - protected function initRecursive($namingContainer=null) - { - if($this->_cacheAvailable && !$this->_dataCached) - { - $stack=$this->getPage()->getCachingStack(); - $stack->push($this); - parent::initRecursive($namingContainer); - $stack->pop(); - } - else - parent::initRecursive($namingContainer); - } - protected function loadRecursive() - { - if($this->_cacheAvailable && !$this->_dataCached) - { - $stack=$this->getPage()->getCachingStack(); - $stack->push($this); - parent::loadRecursive(); - $stack->pop(); - } - else - { - if($this->_dataCached) - $this->performActions(); - parent::loadRecursive(); - } - } - private function performActions() - { - $page=$this->getPage(); - $cs=$page->getClientScript(); - foreach($this->_actions as $action) - { - if($action[0]==='Page.ClientScript') - call_user_func_array(array($cs,$action[1]),$action[2]); - else if($action[0]==='Page') - call_user_func_array(array($page,$action[1]),$action[2]); - else - call_user_func_array(array($this->getSubProperty($action[0]),$action[1]),$action[2]); - } - } - protected function preRenderRecursive() - { - if($this->_cacheAvailable && !$this->_dataCached) - { - $stack=$this->getPage()->getCachingStack(); - $stack->push($this); - parent::preRenderRecursive(); - $stack->pop(); - } - else - parent::preRenderRecursive(); - } - protected function loadStateRecursive(&$state,$needViewState=true) - { - $st=unserialize($state); - parent::loadStateRecursive($st,$needViewState); - } - protected function &saveStateRecursive($needViewState=true) - { - if($this->_dataCached) - return $this->_state; - else - { - $st=parent::saveStateRecursive($needViewState); - $this->_state=serialize($st); - return $this->_state; - } - } - public function registerAction($context,$funcName,$funcParams) - { - $this->_actions[]=array($context,$funcName,$funcParams); - } - private function getCacheKey() - { - if($this->_cacheKey===null) - $this->_cacheKey=$this->calculateCacheKey(); - return $this->_cacheKey; - } - protected function calculateCacheKey() - { - $key=$this->getBaseCacheKey(); - if($this->_varyBySession) - $key.=$this->getSession()->getSessionID(); - if($this->_varyByParam!=='') - { - $params=array(); - $request=$this->getRequest(); - foreach(explode(',',$this->_varyByParam) as $name) - { - $name=trim($name); - $params[$name]=$request->itemAt($name); - } - $key.=serialize($params); - } - $param=new TOutputCacheCalculateKeyEventParameter; - $this->onCalculateKey($param); - $key.=$param->getCacheKey(); - return $key; - } - protected function getBaseCacheKey() - { - return self::CACHE_ID_PREFIX.$this->_keyPrefix.$this->getPage()->getPagePath().$this->getUniqueID(); - } - public function getCacheModuleID() - { - return $this->_cacheModuleID; - } - public function setCacheModuleID($value) - { - $this->_cacheModuleID=$value; - } - public function setCacheKeyPrefix($value) - { - $this->_keyPrefix=$value; - } - public function getCacheTime() - { - return $this->_cacheTime; - } - protected function getCacheDependency() - { - return null; - } - public function getContentCached() - { - return $this->_dataCached; - } - public function getDuration() - { - return $this->_duration; - } - public function setDuration($value) - { - if(($value=TPropertyValue::ensureInteger($value))<0) - throw new TInvalidDataValueException('outputcache_duration_invalid',get_class($this)); - $this->_duration=$value; - } - public function getVaryByParam() - { - return $this->_varyByParam; - } - public function setVaryByParam($value) - { - $this->_varyByParam=trim($value); - } - public function getVaryBySession() - { - return $this->_varyBySession; - } - public function setVaryBySession($value) - { - $this->_varyBySession=TPropertyValue::ensureBoolean($value); - } - public function getCachingPostBack() - { - return $this->_cachePostBack; - } - public function setCachingPostBack($value) - { - $this->_cachePostBack=TPropertyValue::ensureBoolean($value); - } - public function onCheckDependency($param) - { - $this->raiseEvent('OnCheckDependency',$this,$param); - } - public function onCalculateKey($param) - { - $this->raiseEvent('OnCalculateKey',$this,$param); - } - public function render($writer) - { - if($this->_dataCached) - $writer->write($this->_contents); - else if($this->_cacheAvailable) - { - $textWriter=new TTextWriter; - $stack=$this->getPage()->getCachingStack(); - $stack->push($this); - parent::render(new THtmlWriter($textWriter)); - $stack->pop(); - $content=$textWriter->flush(); - $data=array($content,$this->_state,$this->_actions,time()); - $this->_cache->set($this->getCacheKey(),$data,$this->getDuration(),$this->getCacheDependency()); - $writer->write($content); - } - else - parent::render($writer); - } -} -class TOutputCacheCheckDependencyEventParameter extends TEventParameter -{ - private $_isValid=true; - private $_cacheTime=0; - public function getIsValid() - { - return $this->_isValid; - } - public function setIsValid($value) - { - $this->_isValid=TPropertyValue::ensureBoolean($value); - } - public function getCacheTime() - { - return $this->_cacheTime; - } - public function setCacheTime($value) - { - $this->_cacheTime=TPropertyValue::ensureInteger($value); - } -} -class TOutputCacheCalculateKeyEventParameter extends TEventParameter -{ - private $_cacheKey=''; - public function getCacheKey() - { - return $this->_cacheKey; - } - public function setCacheKey($value) - { - $this->_cacheKey=TPropertyValue::ensureString($value); - } -} -class TTemplateManager extends TModule -{ - const TEMPLATE_FILE_EXT='.tpl'; - const TEMPLATE_CACHE_PREFIX='prado:template:'; - public function init($config) - { - $this->getService()->setTemplateManager($this); - } - public function getTemplateByClassName($className) - { - $class=new ReflectionClass($className); - $tplFile=dirname($class->getFileName()).DIRECTORY_SEPARATOR.$className.self::TEMPLATE_FILE_EXT; - return $this->getTemplateByFileName($tplFile); - } - public function getTemplateByFileName($fileName) - { - if(($fileName=$this->getLocalizedTemplate($fileName))!==null) - { - if(($cache=$this->getApplication()->getCache())===null) - return new TTemplate(file_get_contents($fileName),dirname($fileName),$fileName); - else - { - $array=$cache->get(self::TEMPLATE_CACHE_PREFIX.$fileName); - if(is_array($array)) - { - list($template,$timestamps)=$array; - if($this->getApplication()->getMode()===TApplicationMode::Performance) - return $template; - $cacheValid=true; - foreach($timestamps as $tplFile=>$timestamp) - { - if(!is_file($tplFile) || filemtime($tplFile)>$timestamp) - { - $cacheValid=false; - break; - } - } - if($cacheValid) - return $template; - } - $template=new TTemplate(file_get_contents($fileName),dirname($fileName),$fileName); - $includedFiles=$template->getIncludedFiles(); - $timestamps=array(); - $timestamps[$fileName]=filemtime($fileName); - foreach($includedFiles as $includedFile) - $timestamps[$includedFile]=filemtime($includedFile); - $cache->set(self::TEMPLATE_CACHE_PREFIX.$fileName,array($template,$timestamps)); - return $template; - } - } - else - return null; - } - protected function getLocalizedTemplate($filename) - { - if(($app=$this->getApplication()->getGlobalization(false))===null) - return is_file($filename)?$filename:null; - foreach($app->getLocalizedResource($filename) as $file) - { - if(($file=realpath($file))!==false && is_file($file)) - return $file; - } - return null; - } -} -class TTemplate extends TApplicationComponent implements ITemplate -{ - const REGEX_RULES='/<!--.*?--!>|<!---.*?--->|<\/?com:([\w\.]+)((?:\s*[\w\.]+\s*=\s*\'.*?\'|\s*[\w\.]+\s*=\s*".*?"|\s*[\w\.]+\s*=\s*<%.*?%>)*)\s*\/?>|<\/?prop:([\w\.]+)\s*>|<%@\s*((?:\s*[\w\.]+\s*=\s*\'.*?\'|\s*[\w\.]+\s*=\s*".*?")*)\s*%>|<%[%#~\/\\$=\\[](.*?)%>|<prop:([\w\.]+)((?:\s*[\w\.]+\s*=\s*\'.*?\'|\s*[\w\.]+\s*=\s*".*?"|\s*[\w\.]+\s*=\s*<%.*?%>)*)\s*\/>/msS'; - const CONFIG_DATABIND=0; - const CONFIG_EXPRESSION=1; - const CONFIG_ASSET=2; - const CONFIG_PARAMETER=3; - const CONFIG_LOCALIZATION=4; - const CONFIG_TEMPLATE=5; - private $_tpl=array(); - private $_directive=array(); - private $_contextPath; - private $_tplFile=null; - private $_startingLine=0; - private $_content; - private $_sourceTemplate=true; - private $_hashCode=''; - private $_tplControl=null; - private $_includedFiles=array(); - private $_includeAtLine=array(); - private $_includeLines=array(); - public function __construct($template,$contextPath,$tplFile=null,$startingLine=0,$sourceTemplate=true) - { - $this->_sourceTemplate=$sourceTemplate; - $this->_contextPath=$contextPath; - $this->_tplFile=$tplFile; - $this->_startingLine=$startingLine; - $this->_content=$template; - $this->_hashCode=md5($template); - $this->parse($template); - $this->_content=null; - } - public function getTemplateFile() - { - return $this->_tplFile; - } - public function getIsSourceTemplate() - { - return $this->_sourceTemplate; - } - public function getContextPath() - { - return $this->_contextPath; - } - public function getDirective() - { - return $this->_directive; - } - public function getHashCode() - { - return $this->_hashCode; - } - public function &getItems() - { - return $this->_tpl; - } - public function instantiateIn($tplControl,$parentControl=null) - { - $this->_tplControl=$tplControl; - if($parentControl===null) - $parentControl=$tplControl; - if(($page=$tplControl->getPage())===null) - $page=$this->getService()->getRequestedPage(); - $controls=array(); - $directChildren=array(); - foreach($this->_tpl as $key=>$object) - { - if($object[0]===-1) - $parent=$parentControl; - else if(isset($controls[$object[0]])) - $parent=$controls[$object[0]]; - else - continue; - if(isset($object[2])) - { - $component=Prado::createComponent($object[1]); - $properties=&$object[2]; - if($component instanceof TControl) - { - if($component instanceof TOutputCache) - $component->setCacheKeyPrefix($this->_hashCode.$key); - $component->setTemplateControl($tplControl); - if(isset($properties['id'])) - { - if(is_array($properties['id'])) - $properties['id']=$component->evaluateExpression($properties['id'][1]); - $tplControl->registerObject($properties['id'],$component); - } - if(isset($properties['skinid'])) - { - if(is_array($properties['skinid'])) - $component->setSkinID($component->evaluateExpression($properties['skinid'][1])); - else - $component->setSkinID($properties['skinid']); - unset($properties['skinid']); - } - $component->trackViewState(false); - $component->applyStyleSheetSkin($page); - foreach($properties as $name=>$value) - $this->configureControl($component,$name,$value); - $component->trackViewState(true); - if($parent===$parentControl) - $directChildren[]=$component; - else - $component->createdOnTemplate($parent); - if($component->getAllowChildControls()) - $controls[$key]=$component; - } - else if($component instanceof TComponent) - { - $controls[$key]=$component; - if(isset($properties['id'])) - { - if(is_array($properties['id'])) - $properties['id']=$component->evaluateExpression($properties['id'][1]); - $tplControl->registerObject($properties['id'],$component); - if(!$component->hasProperty('id')) - unset($properties['id']); - } - foreach($properties as $name=>$value) - $this->configureComponent($component,$name,$value); - if($parent===$parentControl) - $directChildren[]=$component; - else - $component->createdOnTemplate($parent); - } - } - else - { - if($object[1] instanceof TCompositeLiteral) - { - $o=clone $object[1]; - $o->setContainer($tplControl); - if($parent===$parentControl) - $directChildren[]=$o; - else - $parent->addParsedObject($o); - } - else - { - if($parent===$parentControl) - $directChildren[]=$object[1]; - else - $parent->addParsedObject($object[1]); - } - } - } - foreach($directChildren as $control) - { - if($control instanceof TComponent) - $control->createdOnTemplate($parentControl); - else - $parentControl->addParsedObject($control); - } - } - protected function configureControl($control,$name,$value) - { - if(strncasecmp($name,'on',2)===0) - $this->configureEvent($control,$name,$value,$control); - else if(($pos=strrpos($name,'.'))===false) - $this->configureProperty($control,$name,$value); - else - $this->configureSubProperty($control,$name,$value); - } - protected function configureComponent($component,$name,$value) - { - if(strpos($name,'.')===false) - $this->configureProperty($component,$name,$value); - else - $this->configureSubProperty($component,$name,$value); - } - protected function configureEvent($control,$name,$value,$contextControl) - { - if(strpos($value,'.')===false) - $control->attachEventHandler($name,array($contextControl,'TemplateControl.'.$value)); - else - $control->attachEventHandler($name,array($contextControl,$value)); - } - protected function configureProperty($component,$name,$value) - { - if(is_array($value)) - { - switch($value[0]) - { - case self::CONFIG_DATABIND: - $component->bindProperty($name,$value[1]); - break; - case self::CONFIG_EXPRESSION: - if($component instanceof TControl) - $component->autoBindProperty($name,$value[1]); - else - { - $setter='set'.$name; - $component->$setter($this->_tplControl->evaluateExpression($value[1])); - } - break; - case self::CONFIG_TEMPLATE: - $setter='set'.$name; - $component->$setter($value[1]); - break; - case self::CONFIG_ASSET: - $setter='set'.$name; - $url=$this->publishFilePath($this->_contextPath.DIRECTORY_SEPARATOR.$value[1]); - $component->$setter($url); - break; - case self::CONFIG_PARAMETER: - $setter='set'.$name; - $component->$setter($this->getApplication()->getParameters()->itemAt($value[1])); - break; - case self::CONFIG_LOCALIZATION: - $setter='set'.$name; - $component->$setter(Prado::localize($value[1])); - break; - default: - throw new TConfigurationException('template_tag_unexpected',$name,$value[1]); - break; - } - } - else - { - $setter='set'.$name; - $component->$setter($value); - } - } - protected function configureSubProperty($component,$name,$value) - { - if(is_array($value)) - { - switch($value[0]) - { - case self::CONFIG_DATABIND: - $component->bindProperty($name,$value[1]); - break; - case self::CONFIG_EXPRESSION: - if($component instanceof TControl) - $component->autoBindProperty($name,$value[1]); - else - $component->setSubProperty($name,$this->_tplControl->evaluateExpression($value[1])); - break; - case self::CONFIG_TEMPLATE: - $component->setSubProperty($name,$value[1]); - break; - case self::CONFIG_ASSET: - $url=$this->publishFilePath($this->_contextPath.DIRECTORY_SEPARATOR.$value[1]); - $component->setSubProperty($name,$url); - break; - case self::CONFIG_PARAMETER: - $component->setSubProperty($name,$this->getApplication()->getParameters()->itemAt($value[1])); - break; - case self::CONFIG_LOCALIZATION: - $component->setSubProperty($name,Prado::localize($value[1])); - break; - default: - throw new TConfigurationException('template_tag_unexpected',$name,$value[1]); - break; - } - } - else - $component->setSubProperty($name,$value); - } - protected function parse($input) - { - $input=$this->preprocess($input); - $tpl=&$this->_tpl; - $n=preg_match_all(self::REGEX_RULES,$input,$matches,PREG_SET_ORDER|PREG_OFFSET_CAPTURE); - $expectPropEnd=false; - $textStart=0; - $stack=array(); - $container=-1; - $matchEnd=0; - $c=0; - $this->_directive=null; - try - { - for($i=0;$i<$n;++$i) - { - $match=&$matches[$i]; - $str=$match[0][0]; - $matchStart=$match[0][1]; - $matchEnd=$matchStart+strlen($str)-1; - if(strpos($str,'<com:')===0) - { - if($expectPropEnd) - continue; - if($matchStart>$textStart) - $tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart)); - $textStart=$matchEnd+1; - $type=$match[1][0]; - $attributes=$this->parseAttributes($match[2][0],$match[2][1]); - $this->validateAttributes($type,$attributes); - $tpl[$c++]=array($container,$type,$attributes); - if($str[strlen($str)-2]!=='/') - { - $stack[] = $type; - $container=$c-1; - } - } - else if(strpos($str,'</com:')===0) - { - if($expectPropEnd) - continue; - if($matchStart>$textStart) - $tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart)); - $textStart=$matchEnd+1; - $type=$match[1][0]; - if(empty($stack)) - throw new TConfigurationException('template_closingtag_unexpected',"</com:$type>"); - $name=array_pop($stack); - if($name!==$type) - { - $tag=$name[0]==='@' ? '</prop:'.substr($name,1).'>' : "</com:$name>"; - throw new TConfigurationException('template_closingtag_expected',$tag); - } - $container=$tpl[$container][0]; - } - else if(strpos($str,'<%@')===0) - { - if($expectPropEnd) - continue; - if($matchStart>$textStart) - $tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart)); - $textStart=$matchEnd+1; - if(isset($tpl[0]) || $this->_directive!==null) - throw new TConfigurationException('template_directive_nonunique'); - $this->_directive=$this->parseAttributes($match[4][0],$match[4][1]); - } - else if(strpos($str,'<%')===0) - { - if($expectPropEnd) - continue; - if($matchStart>$textStart) - $tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart)); - $textStart=$matchEnd+1; - $literal=trim($match[5][0]); - if($str[2]==='=') - $tpl[$c++]=array($container,array(TCompositeLiteral::TYPE_EXPRESSION,$literal)); - else if($str[2]==='%') - $tpl[$c++]=array($container,array(TCompositeLiteral::TYPE_STATEMENTS,$literal)); - else if($str[2]==='#') - $tpl[$c++]=array($container,array(TCompositeLiteral::TYPE_DATABINDING,$literal)); - else if($str[2]==='$') - $tpl[$c++]=array($container,array(TCompositeLiteral::TYPE_EXPRESSION,"\$this->getApplication()->getParameters()->itemAt('$literal')")); - else if($str[2]==='~') - $tpl[$c++]=array($container,array(TCompositeLiteral::TYPE_EXPRESSION,"\$this->publishFilePath('$this->_contextPath/$literal')")); - else if($str[2]==='/') - $tpl[$c++]=array($container,array(TCompositeLiteral::TYPE_EXPRESSION,"dirname(\$this->getApplication()->getRequest()->getApplicationUrl()).'/$literal'")); - else if($str[2]==='[') - { - $literal=strtr(trim(substr($literal,0,strlen($literal)-1)),array("'"=>"\'","\\"=>"\\\\")); - $tpl[$c++]=array($container,array(TCompositeLiteral::TYPE_EXPRESSION,"Prado::localize('$literal')")); - } - } - else if(strpos($str,'<prop:')===0) - { - if(strrpos($str,'/>')===strlen($str)-2) - { - if($expectPropEnd) - continue; - if($matchStart>$textStart) - $tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart)); - $textStart=$matchEnd+1; - $prop=strtolower($match[6][0]); - $attrs=$this->parseAttributes($match[7][0],$match[7][1]); - $attributes=array(); - foreach($attrs as $name=>$value) - $attributes[$prop.'.'.$name]=$value; - $type=$tpl[$container][1]; - $this->validateAttributes($type,$attributes); - foreach($attributes as $name=>$value) - { - if(isset($tpl[$container][2][$name])) - throw new TConfigurationException('template_property_duplicated',$name); - $tpl[$container][2][$name]=$value; - } - } - else - { - $prop=strtolower($match[3][0]); - $stack[] = '@'.$prop; - if(!$expectPropEnd) - { - if($matchStart>$textStart) - $tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart)); - $textStart=$matchEnd+1; - $expectPropEnd=true; - } - } - } - else if(strpos($str,'</prop:')===0) - { - $prop=strtolower($match[3][0]); - if(empty($stack)) - throw new TConfigurationException('template_closingtag_unexpected',"</prop:$prop>"); - $name=array_pop($stack); - if($name!=='@'.$prop) - { - $tag=$name[0]==='@' ? '</prop:'.substr($name,1).'>' : "</com:$name>"; - throw new TConfigurationException('template_closingtag_expected',$tag); - } - if(($last=count($stack))<1 || $stack[$last-1][0]!=='@') - { - if($matchStart>$textStart) - { - $value=substr($input,$textStart,$matchStart-$textStart); - if(substr($prop,-8,8)==='template') - $value=$this->parseTemplateProperty($value,$textStart); - else - $value=$this->parseAttribute($value); - if($container>=0) - { - $type=$tpl[$container][1]; - $this->validateAttributes($type,array($prop=>$value)); - if(isset($tpl[$container][2][$prop])) - throw new TConfigurationException('template_property_duplicated',$prop); - $tpl[$container][2][$prop]=$value; - } - else - $this->_directive[$prop]=$value; - $textStart=$matchEnd+1; - } - $expectPropEnd=false; - } - } - else if(strpos($str,'<!--')===0) - { - if($expectPropEnd) - throw new TConfigurationException('template_comments_forbidden'); - if($matchStart>$textStart) - $tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart)); - $textStart=$matchEnd+1; - } - else - throw new TConfigurationException('template_matching_unexpected',$match); - } - if(!empty($stack)) - { - $name=array_pop($stack); - $tag=$name[0]==='@' ? '</prop:'.substr($name,1).'>' : "</com:$name>"; - throw new TConfigurationException('template_closingtag_expected',$tag); - } - if($textStart<strlen($input)) - $tpl[$c++]=array($container,substr($input,$textStart)); - } - catch(Exception $e) - { - if(($e instanceof TException) && ($e instanceof TTemplateException)) - throw $e; - if($matchEnd===0) - $line=$this->_startingLine+1; - else - $line=$this->_startingLine+count(explode("\n",substr($input,0,$matchEnd+1))); - $this->handleException($e,$line,$input); - } - if($this->_directive===null) - $this->_directive=array(); - $objects=array(); - $parent=null; - $merged=array(); - foreach($tpl as $id=>$object) - { - if(isset($object[2]) || $object[0]!==$parent) - { - if($parent!==null) - { - if(count($merged[1])===1 && is_string($merged[1][0])) - $objects[$id-1]=array($merged[0],$merged[1][0]); - else - $objects[$id-1]=array($merged[0],new TCompositeLiteral($merged[1])); - } - if(isset($object[2])) - { - $parent=null; - $objects[$id]=$object; - } - else - { - $parent=$object[0]; - $merged=array($parent,array($object[1])); - } - } - else - $merged[1][]=$object[1]; - } - if($parent!==null) - { - if(count($merged[1])===1 && is_string($merged[1][0])) - $objects[$id]=array($merged[0],$merged[1][0]); - else - $objects[$id]=array($merged[0],new TCompositeLiteral($merged[1])); - } - $tpl=$objects; - return $objects; - } - protected function parseAttributes($str,$offset) - { - if($str==='') - return array(); - $pattern='/([\w\.]+)\s*=\s*(\'.*?\'|".*?"|<%.*?%>)/msS'; - $attributes=array(); - $n=preg_match_all($pattern,$str,$matches,PREG_SET_ORDER|PREG_OFFSET_CAPTURE); - for($i=0;$i<$n;++$i) - { - $match=&$matches[$i]; - $name=strtolower($match[1][0]); - if(isset($attributes[$name])) - throw new TConfigurationException('template_property_duplicated',$name); - $value=$match[2][0]; - if(substr($name,-8,8)==='template') - { - if($value[0]==='\'' || $value[0]==='"') - $attributes[$name]=$this->parseTemplateProperty(substr($value,1,strlen($value)-2),$match[2][1]+1); - else - $attributes[$name]=$this->parseTemplateProperty($value,$match[2][1]); - } - else - { - if($value[0]==='\'' || $value[0]==='"') - $attributes[$name]=$this->parseAttribute(substr($value,1,strlen($value)-2)); - else - $attributes[$name]=$this->parseAttribute($value); - } - } - return $attributes; - } - protected function parseTemplateProperty($content,$offset) - { - $line=$this->_startingLine+count(explode("\n",substr($this->_content,0,$offset)))-1; - return array(self::CONFIG_TEMPLATE,new TTemplate($content,$this->_contextPath,$this->_tplFile,$line,false)); - } - protected function parseAttribute($value) - { - if(($n=preg_match_all('/<%[#=].*?%>/msS',$value,$matches,PREG_OFFSET_CAPTURE))>0) - { - $isDataBind=false; - $textStart=0; - $expr=''; - for($i=0;$i<$n;++$i) - { - $match=$matches[0][$i]; - $token=$match[0]; - $offset=$match[1]; - $length=strlen($token); - if($token[2]==='#') - $isDataBind=true; - if($offset>$textStart) - $expr.=".'".strtr(substr($value,$textStart,$offset-$textStart),array("'"=>"\\'","\\"=>"\\\\"))."'"; - $expr.='.('.substr($token,3,$length-5).')'; - $textStart=$offset+$length; - } - $length=strlen($value); - if($length>$textStart) - $expr.=".'".strtr(substr($value,$textStart,$length-$textStart),array("'"=>"\\'","\\"=>"\\\\"))."'"; - if($isDataBind) - return array(self::CONFIG_DATABIND,ltrim($expr,'.')); - else - return array(self::CONFIG_EXPRESSION,ltrim($expr,'.')); - } - else if(preg_match('/\\s*(<%~.*?%>|<%\\$.*?%>|<%\\[.*?\\]%>)\\s*/msS',$value,$matches) && $matches[0]===$value) - { - $value=$matches[1]; - if($value[2]==='~') - return array(self::CONFIG_ASSET,trim(substr($value,3,strlen($value)-5))); - else if($value[2]==='[') - return array(self::CONFIG_LOCALIZATION,trim(substr($value,3,strlen($value)-6))); - else if($value[2]==='$') - return array(self::CONFIG_PARAMETER,trim(substr($value,3,strlen($value)-5))); - } - else - return $value; - } - protected function validateAttributes($type,$attributes) - { - Prado::using($type); - if(($pos=strrpos($type,'.'))!==false) - $className=substr($type,$pos+1); - else - $className=$type; - $class=new TReflectionClass($className); - if(is_subclass_of($className,'TControl') || $className==='TControl') - { - foreach($attributes as $name=>$att) - { - if(($pos=strpos($name,'.'))!==false) - { - $subname=substr($name,0,$pos); - if(!$class->hasMethod('get'.$subname)) - throw new TConfigurationException('template_property_unknown',$type,$subname); - } - else if(strncasecmp($name,'on',2)===0) - { - if(!$class->hasMethod($name)) - throw new TConfigurationException('template_event_unknown',$type,$name); - else if(!is_string($att)) - throw new TConfigurationException('template_eventhandler_invalid',$type,$name); - } - else - { - if(!$class->hasMethod('set'.$name)) - { - if($class->hasMethod('get'.$name)) - throw new TConfigurationException('template_property_readonly',$type,$name); - else - throw new TConfigurationException('template_property_unknown',$type,$name); - } - else if(is_array($att) && $att[0]!==self::CONFIG_EXPRESSION) - { - if(strcasecmp($name,'id')===0) - throw new TConfigurationException('template_controlid_invalid',$type); - else if(strcasecmp($name,'skinid')===0) - throw new TConfigurationException('template_controlskinid_invalid',$type); - } - } - } - } - else if(is_subclass_of($className,'TComponent') || $className==='TComponent') - { - foreach($attributes as $name=>$att) - { - if(is_array($att) && ($att[0]===self::CONFIG_DATABIND)) - throw new TConfigurationException('template_databind_forbidden',$type,$name); - if(($pos=strpos($name,'.'))!==false) - { - $subname=substr($name,0,$pos); - if(!$class->hasMethod('get'.$subname)) - throw new TConfigurationException('template_property_unknown',$type,$subname); - } - else if(strncasecmp($name,'on',2)===0) - throw new TConfigurationException('template_event_forbidden',$type,$name); - else - { - if(strcasecmp($name,'id')!==0 && !$class->hasMethod('set'.$name)) - { - if($class->hasMethod('get'.$name)) - throw new TConfigurationException('template_property_readonly',$type,$name); - else - throw new TConfigurationException('template_property_unknown',$type,$name); - } - } - } - } - else - throw new TConfigurationException('template_component_required',$type); - } - public function getIncludedFiles() - { - return $this->_includedFiles; - } - protected function handleException($e,$line,$input=null) - { - $srcFile=$this->_tplFile; - if(($n=count($this->_includedFiles))>0) - { - for($i=$n-1;$i>=0;--$i) - { - if($this->_includeAtLine[$i]<=$line) - { - if($line<$this->_includeAtLine[$i]+$this->_includeLines[$i]) - { - $line=$line-$this->_includeAtLine[$i]+1; - $srcFile=$this->_includedFiles[$i]; - break; - } - else - $line=$line-$this->_includeLines[$i]+1; - } - } - } - $exception=new TTemplateException('template_format_invalid',$e->getMessage()); - $exception->setLineNumber($line); - if(!empty($srcFile)) - $exception->setTemplateFile($srcFile); - else - $exception->setTemplateSource($input); - throw $exception; - } - protected function preprocess($input) - { - if($n=preg_match_all('/<%include(.*?)%>/',$input,$matches,PREG_SET_ORDER|PREG_OFFSET_CAPTURE)) - { - for($i=0;$i<$n;++$i) - { - $filePath=Prado::getPathOfNamespace(trim($matches[$i][1][0]),TTemplateManager::TEMPLATE_FILE_EXT); - if($filePath!==null && is_file($filePath)) - $this->_includedFiles[]=$filePath; - else - { - $errorLine=count(explode("\n",substr($input,0,$matches[$i][0][1]+1))); - $this->handleException(new TConfigurationException('template_include_invalid',trim($matches[$i][1][0])),$errorLine,$input); - } - } - $base=0; - for($i=0;$i<$n;++$i) - { - $ext=file_get_contents($this->_includedFiles[$i]); - $length=strlen($matches[$i][0][0]); - $offset=$base+$matches[$i][0][1]; - $this->_includeAtLine[$i]=count(explode("\n",substr($input,0,$offset))); - $this->_includeLines[$i]=count(explode("\n",$ext)); - $input=substr_replace($input,$ext,$offset,$length); - $base+=strlen($ext)-$length; - } - } - return $input; - } -} -class TThemeManager extends TModule -{ - const DEFAULT_BASEPATH='themes'; - private $_initialized=false; - private $_basePath=null; - private $_baseUrl=null; - public function init($config) - { - $this->_initialized=true; - $service=$this->getService(); - if($service instanceof TPageService) - $service->setThemeManager($this); - else - throw new TConfigurationException('thememanager_service_unavailable'); - } - public function getTheme($name) - { - $themePath=$this->getBasePath().DIRECTORY_SEPARATOR.$name; - $themeUrl=rtrim($this->getBaseUrl(),'/').'/'.$name; - return new TTheme($themePath,$themeUrl); - } - public function getAvailableThemes() - { - $themes=array(); - $basePath=$this->getBasePath(); - $folder=@opendir($basePath); - while($file=@readdir($folder)) - { - if($file!=='.' && $file!=='..' && $file!=='.svn' && is_dir($basePath.DIRECTORY_SEPARATOR.$file)) - $themes[]=$file; - } - closedir($folder); - return $themes; - } - public function getBasePath() - { - if($this->_basePath===null) - { - $this->_basePath=dirname($this->getRequest()->getApplicationFilePath()).DIRECTORY_SEPARATOR.self::DEFAULT_BASEPATH; - if(($basePath=realpath($this->_basePath))===false || !is_dir($basePath)) - throw new TConfigurationException('thememanager_basepath_invalid2',$this->_basePath); - $this->_basePath=$basePath; - } - return $this->_basePath; - } - public function setBasePath($value) - { - if($this->_initialized) - throw new TInvalidOperationException('thememanager_basepath_unchangeable'); - else - { - $this->_basePath=Prado::getPathOfNamespace($value); - if($this->_basePath===null || !is_dir($this->_basePath)) - throw new TInvalidDataValueException('thememanager_basepath_invalid',$value); - } - } - public function getBaseUrl() - { - if($this->_baseUrl===null) - { - $appPath=dirname($this->getRequest()->getApplicationFilePath()); - $basePath=$this->getBasePath(); - if(strpos($basePath,$appPath)===false) - throw new TConfigurationException('thememanager_baseurl_required'); - $appUrl=rtrim(dirname($this->getRequest()->getApplicationUrl()),'/\\'); - $this->_baseUrl=$appUrl.strtr(substr($basePath,strlen($appPath)),'\\','/'); - } - return $this->_baseUrl; - } - public function setBaseUrl($value) - { - $this->_baseUrl=rtrim($value,'/'); - } -} -class TTheme extends TApplicationComponent implements ITheme -{ - const THEME_CACHE_PREFIX='prado:theme:'; - const SKIN_FILE_EXT='.skin'; - private $_themePath; - private $_themeUrl; - private $_skins=null; - private $_name=''; - private $_cssFiles=array(); - private $_jsFiles=array(); - public function __construct($themePath,$themeUrl) - { - $this->_themeUrl=$themeUrl; - $this->_themePath=realpath($themePath); - $this->_name=basename($themePath); - $cacheValid=false; - if(($cache=$this->getApplication()->getCache())!==null) - { - $array=$cache->get(self::THEME_CACHE_PREFIX.$themePath); - if(is_array($array)) - { - list($skins,$cssFiles,$jsFiles,$timestamp)=$array; - if($this->getApplication()->getMode()!==TApplicationMode::Performance) - { - if(($dir=opendir($themePath))===false) - throw new TIOException('theme_path_inexistent',$themePath); - $cacheValid=true; - while(($file=readdir($dir))!==false) - { - if($file==='.' || $file==='..') - continue; - else if(basename($file,'.css')!==$file) - $this->_cssFiles[]=$themeUrl.'/'.$file; - else if(basename($file,'.js')!==$file) - $this->_jsFiles[]=$themeUrl.'/'.$file; - else if(basename($file,self::SKIN_FILE_EXT)!==$file && filemtime($themePath.DIRECTORY_SEPARATOR.$file)>$timestamp) - { - $cacheValid=false; - break; - } - } - closedir($dir); - if($cacheValid) - $this->_skins=$skins; - } - else - { - $cacheValid=true; - $this->_cssFiles=$cssFiles; - $this->_jsFiles=$jsFiles; - $this->_skins=$skins; - } - } - } - if(!$cacheValid) - { - $this->_cssFiles=array(); - $this->_jsFiles=array(); - $this->_skins=array(); - if(($dir=opendir($themePath))===false) - throw new TIOException('theme_path_inexistent',$themePath); - while(($file=readdir($dir))!==false) - { - if($file==='.' || $file==='..') - continue; - else if(basename($file,'.css')!==$file) - $this->_cssFiles[]=$themeUrl.'/'.$file; - else if(basename($file,'.js')!==$file) - $this->_jsFiles[]=$themeUrl.'/'.$file; - else if(basename($file,self::SKIN_FILE_EXT)!==$file) - { - $template=new TTemplate(file_get_contents($themePath.'/'.$file),$themePath,$themePath.'/'.$file); - foreach($template->getItems() as $skin) - { - if(!isset($skin[2])) - continue; - else if($skin[0]!==-1) - throw new TConfigurationException('theme_control_nested',$skin[1],dirname($themePath)); - $type=$skin[1]; - $id=isset($skin[2]['skinid'])?$skin[2]['skinid']:0; - unset($skin[2]['skinid']); - if(isset($this->_skins[$type][$id])) - throw new TConfigurationException('theme_skinid_duplicated',$type,$id,dirname($themePath)); - $this->_skins[$type][$id]=$skin[2]; - } - } - } - closedir($dir); - sort($this->_cssFiles); - sort($this->_jsFiles); - if($cache!==null) - $cache->set(self::THEME_CACHE_PREFIX.$themePath,array($this->_skins,$this->_cssFiles,$this->_jsFiles,time())); - } - } - public function getName() - { - return $this->_name; - } - protected function setName($value) - { - $this->_name = $value; - } - public function getBaseUrl() - { - return $this->_themeUrl; - } - protected function setBaseUrl($value) - { - $this->_themeUrl=rtrim($value,'/'); - } - public function getBasePath() - { - return $this->_themePath; - } - protected function setBasePath($value) - { - $this->_themePath=$value; - } - public function getSkins() - { - return $this->_skins; - } - protected function setSkins($value) - { - $this->_skins = $value; - } - public function applySkin($control) - { - $type=get_class($control); - if(($id=$control->getSkinID())==='') - $id=0; - if(isset($this->_skins[$type][$id])) - { - foreach($this->_skins[$type][$id] as $name=>$value) - { - if(is_array($value)) - { - switch($value[0]) - { - case TTemplate::CONFIG_EXPRESSION: - $value=$this->evaluateExpression($value[1]); - break; - case TTemplate::CONFIG_ASSET: - $value=$this->_themeUrl.'/'.ltrim($value[1],'/'); - break; - case TTemplate::CONFIG_DATABIND: - $control->bindProperty($name,$value[1]); - break; - case TTemplate::CONFIG_PARAMETER: - $control->setSubProperty($name,$this->getApplication()->getParameters()->itemAt($value[1])); - break; - case TTemplate::CONFIG_TEMPLATE: - $control->setSubProperty($name,$value[1]); - break; - case TTemplate::CONFIG_LOCALIZATION: - $control->setSubProperty($name,Prado::localize($value[1])); - break; - default: - throw new TConfigurationException('theme_tag_unexpected',$name,$value[0]); - break; - } - } - if(!is_array($value)) - { - if(strpos($name,'.')===false) - { - if($control->hasProperty($name)) - { - if($control->canSetProperty($name)) - { - $setter='set'.$name; - $control->$setter($value); - } - else - throw new TConfigurationException('theme_property_readonly',$type,$name); - } - else - throw new TConfigurationException('theme_property_undefined',$type,$name); - } - else - $control->setSubProperty($name,$value); - } - } - return true; - } - else - return false; - } - public function getStyleSheetFiles() - { - return $this->_cssFiles; - } - protected function setStyleSheetFiles($value) - { - $this->_cssFiles=$value; - } - public function getJavaScriptFiles() - { - return $this->_jsFiles; - } - protected function setJavaScriptFiles($value) - { - $this->_jsFiles=$value; - } -} -class TPageService extends TService -{ - const CONFIG_FILE='config.xml'; - const DEFAULT_BASEPATH='pages'; - const CONFIG_CACHE_PREFIX='prado:pageservice:'; - const PAGE_FILE_EXT='.page'; - private $_basePath=null; - private $_basePageClass='TPage'; - private $_defaultPage='Home'; - private $_pagePath=null; - private $_page=null; - private $_properties=array(); - private $_initialized=false; - private $_themeManager=null; - private $_templateManager=null; - public function init($config) - { - $pageConfig=$this->loadPageConfig($config); - $this->initPageContext($pageConfig); - $this->_initialized=true; - } - protected function initPageContext($pageConfig) - { - $application=$this->getApplication(); - foreach($pageConfig->getApplicationConfigurations() as $appConfig) - $application->applyConfiguration($appConfig); - $this->applyConfiguration($pageConfig); - } - protected function applyConfiguration($config) - { - $this->_properties=array_merge($this->_properties, $config->getProperties()); - $this->getApplication()->getAuthorizationRules()->mergeWith($config->getRules()); - $pagePath=$this->getRequestedPagePath(); - foreach($config->getExternalConfigurations() as $filePath=>$params) - { - list($configPagePath,$condition)=$params; - if($condition!==true) - $condition=$this->evaluateExpression($condition); - if($condition) - { - if(($path=Prado::getPathOfNamespace($filePath,TApplication::CONFIG_FILE_EXT))===null || !is_file($path)) - throw new TConfigurationException('pageservice_includefile_invalid',$filePath); - $c=new TPageConfiguration($pagePath); - $c->loadFromFile($path,$configPagePath); - $this->applyConfiguration($c); - } - } - } - protected function determineRequestedPagePath() - { - $pagePath=$this->getRequest()->getServiceParameter(); - if(empty($pagePath)) - $pagePath=$this->getDefaultPage(); - return $pagePath; - } - protected function loadPageConfig($config) - { - $application=$this->getApplication(); - $pagePath=$this->getRequestedPagePath(); - if(($cache=$application->getCache())===null) - { - $pageConfig=new TPageConfiguration($pagePath); - if($config!==null) - $pageConfig->loadPageConfigurationFromXml($config,$application->getBasePath(),''); - $pageConfig->loadFromFiles($this->getBasePath()); - } - else - { - $configCached=true; - $currentTimestamp=array(); - $arr=$cache->get(self::CONFIG_CACHE_PREFIX.$this->getID().$pagePath); - if(is_array($arr)) - { - list($pageConfig,$timestamps)=$arr; - if($application->getMode()!==TApplicationMode::Performance) - { - foreach($timestamps as $fileName=>$timestamp) - { - if($fileName===0) - { - $appConfigFile=$application->getConfigurationFile(); - $currentTimestamp[0]=$appConfigFile===null?0:@filemtime($appConfigFile); - if($currentTimestamp[0]>$timestamp || ($timestamp>0 && !$currentTimestamp[0])) - $configCached=false; - } - else - { - $currentTimestamp[$fileName]=@filemtime($fileName); - if($currentTimestamp[$fileName]>$timestamp || ($timestamp>0 && !$currentTimestamp[$fileName])) - $configCached=false; - } - } - } - } - else - { - $configCached=false; - $paths=explode('.',$pagePath); - $configPath=$this->getBasePath(); - foreach($paths as $path) - { - $configFile=$configPath.DIRECTORY_SEPARATOR.self::CONFIG_FILE; - $currentTimestamp[$configFile]=@filemtime($configFile); - $configPath.=DIRECTORY_SEPARATOR.$path; - } - $appConfigFile=$application->getConfigurationFile(); - $currentTimestamp[0]=$appConfigFile===null?0:@filemtime($appConfigFile); - } - if(!$configCached) - { - $pageConfig=new TPageConfiguration($pagePath); - if($config!==null) - $pageConfig->loadPageConfigurationFromXml($config,$application->getBasePath(),''); - $pageConfig->loadFromFiles($this->getBasePath()); - $cache->set(self::CONFIG_CACHE_PREFIX.$this->getID().$pagePath,array($pageConfig,$currentTimestamp)); - } - } - return $pageConfig; - } - public function getTemplateManager() - { - if(!$this->_templateManager) - { - $this->_templateManager=new TTemplateManager; - $this->_templateManager->init(null); - } - return $this->_templateManager; - } - public function setTemplateManager(TTemplateManager $value) - { - $this->_templateManager=$value; - } - public function getThemeManager() - { - if(!$this->_themeManager) - { - $this->_themeManager=new TThemeManager; - $this->_themeManager->init(null); - } - return $this->_themeManager; - } - public function setThemeManager(TThemeManager $value) - { - $this->_themeManager=$value; - } - public function getRequestedPagePath() - { - if($this->_pagePath===null) - { - $this->_pagePath=strtr($this->determineRequestedPagePath(),'/\\','..'); - if(empty($this->_pagePath)) - throw new THttpException(404,'pageservice_page_required'); - } - return $this->_pagePath; - } - public function getRequestedPage() - { - return $this->_page; - } - public function getDefaultPage() - { - return $this->_defaultPage; - } - public function setDefaultPage($value) - { - if($this->_initialized) - throw new TInvalidOperationException('pageservice_defaultpage_unchangeable'); - else - $this->_defaultPage=$value; - } - public function getDefaultPageUrl() - { - return $this->constructUrl($this->getDefaultPage()); - } - public function getBasePath() - { - if($this->_basePath===null) - { - $basePath=$this->getApplication()->getBasePath().DIRECTORY_SEPARATOR.self::DEFAULT_BASEPATH; - if(($this->_basePath=realpath($basePath))===false || !is_dir($this->_basePath)) - throw new TConfigurationException('pageservice_basepath_invalid',$basePath); - } - return $this->_basePath; - } - public function setBasePath($value) - { - if($this->_initialized) - throw new TInvalidOperationException('pageservice_basepath_unchangeable'); - else if(($path=Prado::getPathOfNamespace($value))===null || !is_dir($path)) - throw new TConfigurationException('pageservice_basepath_invalid',$value); - $this->_basePath=realpath($path); - } - public function setBasePageClass($value) - { - $this->_basePageClass=$value; - } - public function getBasePageClass() - { - return $this->_basePageClass; - } - public function run() - { - $this->_page=$this->createPage($this->getRequestedPagePath()); - $this->runPage($this->_page,$this->_properties); - } - protected function createPage($pagePath) - { - $path=$this->getBasePath().DIRECTORY_SEPARATOR.strtr($pagePath,'.',DIRECTORY_SEPARATOR); - $hasTemplateFile=is_file($path.self::PAGE_FILE_EXT); - $hasClassFile=is_file($path.Prado::CLASS_FILE_EXT); - if(!$hasTemplateFile && !$hasClassFile) - throw new THttpException(404,'pageservice_page_unknown',$pagePath); - if($hasClassFile) - { - $className=basename($path); - if(!class_exists($className,false)) - include_once($path.Prado::CLASS_FILE_EXT); - } - else - { - $className=$this->getBasePageClass(); - Prado::using($className); - if(($pos=strrpos($className,'.'))!==false) - $className=substr($className,$pos+1); - } - if(!class_exists($className,false) || ($className!=='TPage' && !is_subclass_of($className,'TPage'))) - throw new THttpException(404,'pageservice_page_unknown',$pagePath); - $page=new $className; - $page->setPagePath($pagePath); - if($hasTemplateFile) - $page->setTemplate($this->getTemplateManager()->getTemplateByFileName($path.self::PAGE_FILE_EXT)); - return $page; - } - protected function runPage($page,$properties) - { - foreach($properties as $name=>$value) - $page->setSubProperty($name,$value); - $page->run($this->getResponse()->createHtmlWriter()); - } - public function constructUrl($pagePath,$getParams=null,$encodeAmpersand=true,$encodeGetItems=true) - { - return $this->getRequest()->constructUrl($this->getID(),$pagePath,$getParams,$encodeAmpersand,$encodeGetItems); - } -} -class TPageConfiguration extends TComponent -{ - private $_appConfigs=array(); - private $_properties=array(); - private $_rules=array(); - private $_includes=array(); - private $_pagePath=''; - public function __construct($pagePath) - { - $this->_pagePath=$pagePath; - } - public function getExternalConfigurations() - { - return $this->_includes; - } - public function getProperties() - { - return $this->_properties; - } - public function getRules() - { - return $this->_rules; - } - public function getApplicationConfigurations() - { - return $this->_appConfigs; - } - public function loadFromFiles($basePath) - { - $paths=explode('.',$this->_pagePath); - $page=array_pop($paths); - $path=$basePath; - $configPagePath=''; - foreach($paths as $p) - { - $this->loadFromFile($path.DIRECTORY_SEPARATOR.TPageService::CONFIG_FILE,$configPagePath); - $path.=DIRECTORY_SEPARATOR.$p; - if($configPagePath==='') - $configPagePath=$p; - else - $configPagePath.='.'.$p; - } - $this->loadFromFile($path.DIRECTORY_SEPARATOR.TPageService::CONFIG_FILE,$configPagePath); - $this->_rules=new TAuthorizationRuleCollection($this->_rules); - } - public function loadFromFile($fname,$configPagePath) - { - if(empty($fname) || !is_file($fname)) - return; - $dom=new TXmlDocument; - if($dom->loadFromFile($fname)) - $this->loadFromXml($dom,dirname($fname),$configPagePath); - else - throw new TConfigurationException('pageserviceconf_file_invalid',$fname); - } - public function loadFromXml($dom,$configPath,$configPagePath) - { - $this->loadApplicationConfigurationFromXml($dom,$configPath); - $this->loadPageConfigurationFromXml($dom,$configPath,$configPagePath); - } - public function loadApplicationConfigurationFromXml($dom,$configPath) - { - $appConfig=new TApplicationConfiguration; - $appConfig->loadFromXml($dom,$configPath); - $this->_appConfigs[]=$appConfig; - } - public function loadPageConfigurationFromXml($dom,$configPath,$configPagePath) - { - if(($authorizationNode=$dom->getElementByTagName('authorization'))!==null) - { - $rules=array(); - foreach($authorizationNode->getElements() as $node) - { - $patterns=$node->getAttribute('pages'); - $ruleApplies=false; - if(empty($patterns) || trim($patterns)==='*') - $ruleApplies=true; - else - { - foreach(explode(',',$patterns) as $pattern) - { - if(($pattern=trim($pattern))!=='') - { - if($configPagePath!=='') - $pattern=$configPagePath.'.'.$pattern; - if(strcasecmp($pattern,$this->_pagePath)===0) - { - $ruleApplies=true; - break; - } - if($pattern[strlen($pattern)-1]==='*') - { - if(strncasecmp($this->_pagePath,$pattern,strlen($pattern)-1)===0) - { - $ruleApplies=true; - break; - } - } - } - } - } - if($ruleApplies) - $rules[]=new TAuthorizationRule($node->getTagName(),$node->getAttribute('users'),$node->getAttribute('roles'),$node->getAttribute('verb'),$node->getAttribute('ips')); - } - $this->_rules=array_merge($rules,$this->_rules); - } - if(($pagesNode=$dom->getElementByTagName('pages'))!==null) - { - $this->_properties=array_merge($this->_properties,$pagesNode->getAttributes()->toArray()); - foreach($pagesNode->getElementsByTagName('page') as $node) - { - $properties=$node->getAttributes(); - $id=$properties->remove('id'); - if(empty($id)) - throw new TConfigurationException('pageserviceconf_page_invalid',$configPath); - $matching=false; - $id=($configPagePath==='')?$id:$configPagePath.'.'.$id; - if(strcasecmp($id,$this->_pagePath)===0) - $matching=true; - else if($id[strlen($id)-1]==='*') - $matching=strncasecmp($this->_pagePath,$id,strlen($id)-1)===0; - if($matching) - $this->_properties=array_merge($this->_properties,$properties->toArray()); - } - } - foreach($dom->getElementsByTagName('include') as $node) - { - if(($when=$node->getAttribute('when'))===null) - $when=true; - if(($filePath=$node->getAttribute('file'))===null) - throw new TConfigurationException('pageserviceconf_includefile_required'); - if(isset($this->_includes[$filePath])) - $this->_includes[$filePath]=array($configPagePath,'('.$this->_includes[$filePath][1].') || ('.$when.')'); - else - $this->_includes[$filePath]=array($configPagePath,$when); - } - } -} -class TAssetManager extends TModule -{ - const DEFAULT_BASEPATH='assets'; - private $_basePath=null; - private $_baseUrl=null; - private $_checkTimestamp=false; - private $_application; - private $_published=array(); - private $_initialized=false; - public function init($config) - { - $application=$this->getApplication(); - if($this->_basePath===null) - $this->_basePath=dirname($application->getRequest()->getApplicationFilePath()).DIRECTORY_SEPARATOR.self::DEFAULT_BASEPATH; - if(!is_writable($this->_basePath) || !is_dir($this->_basePath)) - throw new TConfigurationException('assetmanager_basepath_invalid',$this->_basePath); - if($this->_baseUrl===null) - $this->_baseUrl=rtrim(dirname($application->getRequest()->getApplicationUrl()),'/\\').'/'.self::DEFAULT_BASEPATH; - $application->setAssetManager($this); - $this->_initialized=true; - } - public function getBasePath() - { - return $this->_basePath; - } - public function setBasePath($value) - { - if($this->_initialized) - throw new TInvalidOperationException('assetmanager_basepath_unchangeable'); - else - { - $this->_basePath=Prado::getPathOfNamespace($value); - if($this->_basePath===null || !is_dir($this->_basePath) || !is_writable($this->_basePath)) - throw new TInvalidDataValueException('assetmanager_basepath_invalid',$value); - } - } - public function getBaseUrl() - { - return $this->_baseUrl; - } - public function setBaseUrl($value) - { - if($this->_initialized) - throw new TInvalidOperationException('assetmanager_baseurl_unchangeable'); - else - $this->_baseUrl=rtrim($value,'/'); - } - public function publishFilePath($path,$checkTimestamp=false) - { - if(isset($this->_published[$path])) - return $this->_published[$path]; - else if(empty($path) || ($fullpath=realpath($path))===false) - throw new TInvalidDataValueException('assetmanager_filepath_invalid',$path); - else if(is_file($fullpath)) - { - $dir=$this->hash(dirname($fullpath)); - $fileName=basename($fullpath); - $dst=$this->_basePath.DIRECTORY_SEPARATOR.$dir; - if(!is_file($dst.DIRECTORY_SEPARATOR.$fileName) || $checkTimestamp || $this->getApplication()->getMode()!==TApplicationMode::Performance) - $this->copyFile($fullpath,$dst); - return $this->_published[$path]=$this->_baseUrl.'/'.$dir.'/'.$fileName; - } - else - { - $dir=$this->hash($fullpath); - if(!is_dir($this->_basePath.DIRECTORY_SEPARATOR.$dir) || $checkTimestamp || $this->getApplication()->getMode()!==TApplicationMode::Performance) - { - $this->copyDirectory($fullpath,$this->_basePath.DIRECTORY_SEPARATOR.$dir); - } - return $this->_published[$path]=$this->_baseUrl.'/'.$dir; - } - } - public function getPublishedPath($path) - { - $path=realpath($path); - if(is_file($path)) - return $this->_basePath.DIRECTORY_SEPARATOR.$this->hash(dirname($path)).DIRECTORY_SEPARATOR.basename($path); - else - return $this->_basePath.DIRECTORY_SEPARATOR.$this->hash($path); - } - public function getPublishedUrl($path) - { - $path=realpath($path); - if(is_file($path)) - return $this->_baseUrl.'/'.$this->hash(dirname($path)).'/'.basename($path); - else - return $this->_baseUrl.'/'.$this->hash($path); - } - protected function hash($dir) - { - return sprintf('%x',crc32($dir.Prado::getVersion())); - } - protected function copyFile($src,$dst) - { - if(!is_dir($dst)) - { - @mkdir($dst); - @chmod($dst, PRADO_CHMOD); - } - $dstFile=$dst.DIRECTORY_SEPARATOR.basename($src); - if(@filemtime($dstFile)<@filemtime($src)) - { - @copy($src,$dstFile); - } - } - public function copyDirectory($src,$dst) - { - if(!is_dir($dst)) - { - @mkdir($dst); - @chmod($dst, PRADO_CHMOD); - } - if($folder=@opendir($src)) - { - while($file=@readdir($folder)) - { - if($file==='.' || $file==='..' || $file==='.svn') - continue; - else if(is_file($src.DIRECTORY_SEPARATOR.$file)) - { - if(@filemtime($dst.DIRECTORY_SEPARATOR.$file)<@filemtime($src.DIRECTORY_SEPARATOR.$file)) - { - @copy($src.DIRECTORY_SEPARATOR.$file,$dst.DIRECTORY_SEPARATOR.$file); - @chmod($dst.DIRECTORY_SEPARATOR.$file, PRADO_CHMOD); - } - } - else - $this->copyDirectory($src.DIRECTORY_SEPARATOR.$file,$dst.DIRECTORY_SEPARATOR.$file); - } - closedir($folder); - } else { - throw new TInvalidDataValueException('assetmanager_source_directory_invalid', $src); - } - } - public function publishTarFile($tarfile, $md5sum, $checkTimestamp=false) - { - if(isset($this->_published[$md5sum])) - return $this->_published[$md5sum]; - else if(($fullpath=realpath($md5sum))===false || !is_file($fullpath)) - throw new TInvalidDataValueException('assetmanager_tarchecksum_invalid',$md5sum); - else - { - $dir=$this->hash(dirname($fullpath)); - $fileName=basename($fullpath); - $dst=$this->_basePath.DIRECTORY_SEPARATOR.$dir; - if(!is_file($dst.DIRECTORY_SEPARATOR.$fileName) || $checkTimestamp || $this->getApplication()->getMode()!==TApplicationMode::Performance) - { - if(@filemtime($dst.DIRECTORY_SEPARATOR.$fileName)<@filemtime($fullpath)) - { - $this->copyFile($fullpath,$dst); - $this->deployTarFile($tarfile,$dst); - } - } - return $this->_published[$md5sum]=$this->_baseUrl.'/'.$dir; - } - } - protected function deployTarFile($path,$destination) - { - if(($fullpath=realpath($path))===false || !is_file($fullpath)) - throw new TIOException('assetmanager_tarfile_invalid',$path); - else - { - Prado::using('System.IO.TTarFileExtractor'); - $tar = new TTarFileExtractor($fullpath); - return $tar->extract($destination); - } - } -} -class TGlobalization extends TModule -{ - private $_defaultCharset = 'UTF-8'; - private $_defaultCulture = 'en'; - private $_charset=null; - private $_culture=null; - private $_translation; - public function init($xml) - { - if($this->_charset===null) - $this->_charset=$this->getDefaultCharset(); - if($this->_culture===null) - $this->_culture=$this->getDefaultCulture(); - if($xml!==null) - { - $translation = $xml->getElementByTagName('translation'); - if($translation) - $this->setTranslationConfiguration($translation->getAttributes()); - } - $this->getApplication()->setGlobalization($this); - } - public function getDefaultCulture() - { - return $this->_defaultCulture; - } - public function setDefaultCulture($culture) - { - $this->_defaultCulture = str_replace('-','_',$culture); - } - public function getDefaultCharset() - { - return $this->_defaultCharset; - } - public function setDefaultCharset($charset) - { - $this->_defaultCharset = $charset; - } - public function getCulture() - { - return $this->_culture; - } - public function setCulture($culture) - { - $this->_culture = str_replace('-','_',$culture); - } - public function getCharset() - { - return $this->_charset; - } - public function setCharset($charset) - { - $this->_charset = $charset; - } - public function getTranslationConfiguration() - { - return $this->_translation; - } - protected function setTranslationConfiguration(TMap $config) - { - if($config['type'] == 'XLIFF' || $config['type'] == 'gettext') - { - if($config['source']) - { - $config['source'] = Prado::getPathOfNamespace($config['source']); - if(!is_dir($config['source'])) - { - if(@mkdir($config['source'])===false) - throw new TConfigurationException('globalization_source_path_failed', - $config['source']); - chmod($config['source'], PRADO_CHMOD); - } - } - else - { - throw new TConfigurationException("invalid source dir '{$config['source']}'"); - } - } - if($config['cache']) - { - $config['cache'] = $this->getApplication()->getRunTimePath().'/i18n'; - if(!is_dir($config['cache'])) - { - if(@mkdir($config['cache'])===false) - throw new TConfigurationException('globalization_cache_path_failed', - $config['cache']); - chmod($config['cache'], PRADO_CHMOD); - } - } - $this->_translation = $config; - } - public function getTranslationCatalogue() - { - return $this->_translation['catalogue']; - } - public function setTranslationCatalogue($value) - { - $this->_translation['catalogue'] = $value; - } - public function getCultureVariants($culture=null) - { - if($culture===null) $culture = $this->getCulture(); - $variants = explode('_', $culture); - $result = array(); - for(; count($variants) > 0; array_pop($variants)) - $result[] = implode('_', $variants); - return $result; - } - public function getLocalizedResource($file,$culture=null) - { - $files = array(); - $variants = $this->getCultureVariants($culture); - $path = pathinfo($file); - foreach($variants as $variant) - $files[] = $path['dirname'].DIRECTORY_SEPARATOR.$variant.DIRECTORY_SEPARATOR.$path['basename']; - $filename = substr($path['basename'],0,strrpos($path['basename'],'.')); - foreach($variants as $variant) - $files[] = $path['dirname'].DIRECTORY_SEPARATOR.$filename.'.'.$variant.'.'.$path['extension']; - $files[] = $file; - return $files; - } -} -class TApplication extends TComponent -{ - const STATE_OFF='Off'; - const STATE_DEBUG='Debug'; - const STATE_NORMAL='Normal'; - const STATE_PERFORMANCE='Performance'; - const PAGE_SERVICE_ID='page'; - const CONFIG_FILE='application.xml'; - const CONFIG_FILE_EXT='.xml'; - const RUNTIME_PATH='runtime'; - const CONFIGCACHE_FILE='config.cache'; - const GLOBAL_FILE='global.cache'; - private static $_steps=array( - 'onBeginRequest', - 'onLoadState', - 'onLoadStateComplete', - 'onAuthentication', - 'onAuthenticationComplete', - 'onAuthorization', - 'onAuthorizationComplete', - 'onPreRunService', - 'runService', - 'onSaveState', - 'onSaveStateComplete', - 'onPreFlushOutput', - 'flushOutput' - ); - private $_id; - private $_uniqueID; - private $_requestCompleted=false; - private $_step; - private $_services; - private $_service; - private $_modules=array(); - private $_parameters; - private $_configFile; - private $_basePath; - private $_runtimePath; - private $_stateChanged=false; - private $_globals=array(); - private $_cacheFile; - private $_errorHandler; - private $_request; - private $_response; - private $_session; - private $_cache; - private $_statePersister; - private $_user; - private $_globalization; - private $_security; - private $_assetManager; - private $_authRules; - private $_mode=TApplicationMode::Debug; - private $_pageServiceID = self::PAGE_SERVICE_ID; - public function __construct($basePath='protected',$cacheConfig=true) - { - Prado::setApplication($this); - $this->resolvePaths($basePath); - if($cacheConfig) - $this->_cacheFile=$this->_runtimePath.DIRECTORY_SEPARATOR.self::CONFIGCACHE_FILE; - $this->_uniqueID=md5($this->_runtimePath); - $this->_parameters=new TMap; - $this->_services=array($this->getPageServiceID()=>array('TPageService',array(),null)); - Prado::setPathOfAlias('Application',$this->_basePath); - } - protected function resolvePaths($basePath) - { - 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; - else if(is_file($basePath)) - { - $configFile=$basePath; - $basePath=dirname($configFile); - } - else - $configFile=null; - $runtimePath=$basePath.DIRECTORY_SEPARATOR.self::RUNTIME_PATH; - if(is_writable($runtimePath)) - { - if($configFile!==null) - { - $runtimePath.=DIRECTORY_SEPARATOR.basename($configFile).'-'.Prado::getVersion(); - if(!is_dir($runtimePath)) - { - if(@mkdir($runtimePath)===false) - throw new TConfigurationException('application_runtimepath_failed',$runtimePath); - @chmod($runtimePath, PRADO_CHMOD); } - $this->setConfigurationFile($configFile); - } - $this->setBasePath($basePath); - $this->setRuntimePath($runtimePath); - } - else - throw new TConfigurationException('application_runtimepath_invalid',$runtimePath); - } - public function run() - { - try - { - $this->initApplication(); - $n=count(self::$_steps); - $this->_step=0; - $this->_requestCompleted=false; - while($this->_step<$n) - { - if($this->_mode===self::STATE_OFF) - throw new THttpException(503,'application_unavailable'); - if($this->_requestCompleted) - break; - $method=self::$_steps[$this->_step]; - $this->$method(); - $this->_step++; - } - } - catch(Exception $e) - { - $this->onError($e); - } - $this->onEndRequest(); - } - public function completeRequest() - { - $this->_requestCompleted=true; - } - public function getRequestCompleted() - { - return $this->_requestCompleted; - } - public function getGlobalState($key,$defaultValue=null) - { - return isset($this->_globals[$key])?$this->_globals[$key]:$defaultValue; - } - public function setGlobalState($key,$value,$defaultValue=null) - { - $this->_stateChanged=true; - if($value===$defaultValue) - unset($this->_globals[$key]); - else - $this->_globals[$key]=$value; - } - public function clearGlobalState($key) - { - $this->_stateChanged=true; - unset($this->_globals[$key]); - } - protected function loadGlobals() - { - $this->_globals=$this->getApplicationStatePersister()->load(); - } - protected function saveGlobals() - { - if($this->_stateChanged) - { - $this->_stateChanged=false; - $this->getApplicationStatePersister()->save($this->_globals); - } - } - public function getID() - { - return $this->_id; - } - public function setID($value) - { - $this->_id=$value; - } - public function getPageServiceID() - { - return $this->_pageServiceID; - } - public function setPageServiceID($value) - { - $this->_pageServiceID=$value; - } - public function getUniqueID() - { - return $this->_uniqueID; - } - public function getMode() - { - return $this->_mode; - } - public function setMode($value) - { - $this->_mode=TPropertyValue::ensureEnum($value,'TApplicationMode'); - } - public function getBasePath() - { - return $this->_basePath; - } - public function setBasePath($value) - { - $this->_basePath=$value; - } - public function getConfigurationFile() - { - return $this->_configFile; - } - public function setConfigurationFile($value) - { - $this->_configFile=$value; - } - public function getRuntimePath() - { - return $this->_runtimePath; - } - public function setRuntimePath($value) - { - $this->_runtimePath=$value; - if($this->_cacheFile) - $this->_cacheFile=$this->_runtimePath.DIRECTORY_SEPARATOR.self::CONFIGCACHE_FILE; - $this->_uniqueID=md5($this->_runtimePath); - } - public function getService() - { - return $this->_service; - } - public function setService($value) - { - $this->_service=$value; - } - public function setModule($id,IModule $module) - { - if(isset($this->_modules[$id])) - throw new TConfigurationException('application_moduleid_duplicated',$id); - else - $this->_modules[$id]=$module; - } - public function getModule($id) - { - return isset($this->_modules[$id])?$this->_modules[$id]:null; - } - public function getModules() - { - return $this->_modules; - } - public function getParameters() - { - return $this->_parameters; - } - public function getRequest() - { - if(!$this->_request) - { - $this->_request=new THttpRequest; - $this->_request->init(null); - } - return $this->_request; - } - public function setRequest(THttpRequest $request) - { - $this->_request=$request; - } - public function getResponse() - { - if(!$this->_response) - { - $this->_response=new THttpResponse; - $this->_response->init(null); - } - return $this->_response; - } - public function setResponse(THttpResponse $response) - { - $this->_response=$response; - } - public function getSession() - { - if(!$this->_session) - { - $this->_session=new THttpSession; - $this->_session->init(null); - } - return $this->_session; - } - public function setSession(THttpSession $session) - { - $this->_session=$session; - } - public function getErrorHandler() - { - if(!$this->_errorHandler) - { - $this->_errorHandler=new TErrorHandler; - $this->_errorHandler->init(null); - } - return $this->_errorHandler; - } - public function setErrorHandler(TErrorHandler $handler) - { - $this->_errorHandler=$handler; - } - public function getSecurityManager() - { - if(!$this->_security) - { - $this->_security=new TSecurityManager; - $this->_security->init(null); - } - return $this->_security; - } - public function setSecurityManager(TSecurityManager $sm) - { - $this->_security=$sm; - } - public function getAssetManager() - { - if(!$this->_assetManager) - { - $this->_assetManager=new TAssetManager; - $this->_assetManager->init(null); - } - return $this->_assetManager; - } - public function setAssetManager(TAssetManager $value) - { - $this->_assetManager=$value; - } - public function getApplicationStatePersister() - { - if(!$this->_statePersister) - { - $this->_statePersister=new TApplicationStatePersister; - $this->_statePersister->init(null); - } - return $this->_statePersister; - } - public function setApplicationStatePersister(IStatePersister $persister) - { - $this->_statePersister=$persister; - } - public function getCache() - { - return $this->_cache; - } - public function setCache(ICache $cache) - { - $this->_cache=$cache; - } - public function getUser() - { - return $this->_user; - } - public function setUser(IUser $user) - { - $this->_user=$user; - } - public function getGlobalization($createIfNotExists=true) - { - if($this->_globalization===null && $createIfNotExists) - $this->_globalization=new TGlobalization; - return $this->_globalization; - } - public function setGlobalization(TGlobalization $glob) - { - $this->_globalization=$glob; - } - public function getAuthorizationRules() - { - if($this->_authRules===null) - $this->_authRules=new TAuthorizationRuleCollection; - return $this->_authRules; - } - public function applyConfiguration($config,$withinService=false) - { - if($config->getIsEmpty()) - return; - foreach($config->getAliases() as $alias=>$path) - Prado::setPathOfAlias($alias,$path); - foreach($config->getUsings() as $using) - Prado::using($using); - if(!$withinService) - { - foreach($config->getProperties() as $name=>$value) - $this->setSubProperty($name,$value); - } - if(empty($this->_services)) - $this->_services=array($this->getPageServiceID()=>array('TPageService',array(),null)); - foreach($config->getParameters() as $id=>$parameter) - { - if(is_array($parameter)) - { - $component=Prado::createComponent($parameter[0]); - foreach($parameter[1] as $name=>$value) - $component->setSubProperty($name,$value); - $this->_parameters->add($id,$component); - } - else - $this->_parameters->add($id,$parameter); - } - $modules=array(); - foreach($config->getModules() as $id=>$moduleConfig) - { - list($moduleClass, $initProperties, $configElement)=$moduleConfig; - $module=Prado::createComponent($moduleClass); - if(!is_string($id)) - { - $id='_module'.count($this->_modules); - $initProperties['id']=$id; - } - $this->setModule($id,$module); - foreach($initProperties as $name=>$value) - $module->setSubProperty($name,$value); - $modules[]=array($module,$configElement); - } - foreach($modules as $module) - $module[0]->init($module[1]); - foreach($config->getServices() as $serviceID=>$serviceConfig) - $this->_services[$serviceID]=$serviceConfig; - foreach($config->getExternalConfigurations() as $filePath=>$condition) - { - if($condition!==true) - $condition=$this->evaluateExpression($condition); - if($condition) - { - if(($path=Prado::getPathOfNamespace($filePath,self::CONFIG_FILE_EXT))===null || !is_file($path)) - throw new TConfigurationException('application_includefile_invalid',$filePath); - $c=new TApplicationConfiguration; - $c->loadFromFile($path); - $this->applyConfiguration($c,$withinService); - } - } - } - protected function initApplication() - { - if($this->_configFile!==null) - { - if($this->_cacheFile===null || @filemtime($this->_cacheFile)<filemtime($this->_configFile)) - { - $config=new TApplicationConfiguration; - $config->loadFromFile($this->_configFile); - if($this->_cacheFile!==null) - file_put_contents($this->_cacheFile,Prado::serialize($config),LOCK_EX); - } - else - $config=Prado::unserialize(file_get_contents($this->_cacheFile)); - $this->applyConfiguration($config,false); - } - if(($serviceID=$this->getRequest()->resolveRequest(array_keys($this->_services)))===null) - $serviceID=$this->getPageServiceID(); - $this->startService($serviceID); - } - public function startService($serviceID) - { - if(isset($this->_services[$serviceID])) - { - list($serviceClass,$initProperties,$configElement)=$this->_services[$serviceID]; - $service=Prado::createComponent($serviceClass); - if(!($service instanceof IService)) - throw new THttpException(500,'application_service_invalid',$serviceClass); - if(!$service->getEnabled()) - throw new THttpException(500,'application_service_unavailable',$serviceClass); - $service->setID($serviceID); - $this->setService($service); - foreach($initProperties as $name=>$value) - $service->setSubProperty($name,$value); - if($configElement!==null) - { - $config=new TApplicationConfiguration; - $config->loadFromXml($configElement,$this->getBasePath()); - $this->applyConfiguration($config,true); - } - $service->init($configElement); - } - else - throw new THttpException(500,'application_service_unknown',$serviceID); - } - public function onError($param) - { - Prado::log($param->getMessage(),TLogger::ERROR,'System.TApplication'); - $this->raiseEvent('OnError',$this,$param); - $this->getErrorHandler()->handleError($this,$param); - } - public function onBeginRequest() - { - $this->raiseEvent('OnBeginRequest',$this,null); - } - public function onAuthentication() - { - $this->raiseEvent('OnAuthentication',$this,null); - } - public function onAuthenticationComplete() - { - $this->raiseEvent('OnAuthenticationComplete',$this,null); - } - public function onAuthorization() - { - $this->raiseEvent('OnAuthorization',$this,null); - } - public function onAuthorizationComplete() - { - $this->raiseEvent('OnAuthorizationComplete',$this,null); - } - public function onLoadState() - { - $this->loadGlobals(); - $this->raiseEvent('OnLoadState',$this,null); - } - public function onLoadStateComplete() - { - $this->raiseEvent('OnLoadStateComplete',$this,null); - } - public function onPreRunService() - { - $this->raiseEvent('OnPreRunService',$this,null); - } - public function runService() - { - if($this->_service) - $this->_service->run(); - } - public function onSaveState() - { - $this->raiseEvent('OnSaveState',$this,null); - $this->saveGlobals(); - } - public function onSaveStateComplete() - { - $this->raiseEvent('OnSaveStateComplete',$this,null); - } - public function onPreFlushOutput() - { - $this->raiseEvent('OnPreFlushOutput',$this,null); - } - public function flushOutput() - { - $this->getResponse()->flush(); - } - public function onEndRequest() - { - $this->saveGlobals(); $this->raiseEvent('OnEndRequest',$this,null); - } -} -class TApplicationMode extends TEnumerable -{ - const Off='Off'; - const Debug='Debug'; - const Normal='Normal'; - const Performance='Performance'; -} -class TApplicationConfiguration extends TComponent -{ - private $_properties=array(); - private $_usings=array(); - private $_aliases=array(); - private $_modules=array(); - private $_services=array(); - private $_parameters=array(); - private $_includes=array(); - private $_empty=true; - public function loadFromFile($fname) - { - $dom=new TXmlDocument; - $dom->loadFromFile($fname); - $this->loadFromXml($dom,dirname($fname)); - } - public function getIsEmpty() - { - return $this->_empty; - } - public function loadFromXml($dom,$configPath) - { - foreach($dom->getAttributes() as $name=>$value) - { - $this->_properties[$name]=$value; - $this->_empty=false; - } - foreach($dom->getElements() as $element) - { - switch($element->getTagName()) - { - case 'paths': - $this->loadPathsXml($element,$configPath); - break; - case 'modules': - $this->loadModulesXml($element,$configPath); - break; - case 'services': - $this->loadServicesXml($element,$configPath); - break; - case 'parameters': - $this->loadParametersXml($element,$configPath); - break; - case 'include': - $this->loadExternalXml($element,$configPath); - break; - default: - break; - } - } - } - protected function loadPathsXml($pathsNode,$configPath) - { - foreach($pathsNode->getElements() as $element) - { - switch($element->getTagName()) - { - case 'alias': - { - if(($id=$element->getAttribute('id'))!==null && ($path=$element->getAttribute('path'))!==null) - { - $path=str_replace('\\','/',$path); - if(preg_match('/^\\/|.:\\/|.:\\\\/',$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; - } - else - throw new TConfigurationException('appconfig_alias_invalid'); - $this->_empty=false; - break; - } - case 'using': - { - if(($namespace=$element->getAttribute('namespace'))!==null) - $this->_usings[]=$namespace; - else - throw new TConfigurationException('appconfig_using_invalid'); - $this->_empty=false; - break; - } - default: - throw new TConfigurationException('appconfig_paths_invalid',$tagName); - } - } - } - protected function loadModulesXml($modulesNode,$configPath) - { - foreach($modulesNode->getElements() as $element) - { - if($element->getTagName()==='module') - { - $properties=$element->getAttributes(); - $id=$properties->itemAt('id'); - $type=$properties->remove('class'); - if($type===null) - throw new TConfigurationException('appconfig_moduletype_required',$id); - $element->setParent(null); - if($id===null) - $this->_modules[]=array($type,$properties->toArray(),$element); - else - $this->_modules[$id]=array($type,$properties->toArray(),$element); - $this->_empty=false; - } - else - throw new TConfigurationException('appconfig_modules_invalid',$element->getTagName()); - } - } - protected function loadServicesXml($servicesNode,$configPath) - { - foreach($servicesNode->getElements() as $element) - { - if($element->getTagName()==='service') - { - $properties=$element->getAttributes(); - if(($id=$properties->itemAt('id'))===null) - throw new TConfigurationException('appconfig_serviceid_required'); - if(($type=$properties->remove('class'))===null) - throw new TConfigurationException('appconfig_servicetype_required',$id); - $element->setParent(null); - $this->_services[$id]=array($type,$properties->toArray(),$element); - $this->_empty=false; - } - else - throw new TConfigurationException('appconfig_services_invalid',$element->getTagName()); - } - } - protected function loadParametersXml($parametersNode,$configPath) - { - foreach($parametersNode->getElements() as $element) - { - if($element->getTagName()==='parameter') - { - $properties=$element->getAttributes(); - if(($id=$properties->remove('id'))===null) - throw new TConfigurationException('appconfig_parameterid_required'); - if(($type=$properties->remove('class'))===null) - { - if(($value=$properties->remove('value'))===null) - $this->_parameters[$id]=$element; - else - $this->_parameters[$id]=$value; - } - else - $this->_parameters[$id]=array($type,$properties->toArray()); - $this->_empty=false; - } - else - throw new TConfigurationException('appconfig_parameters_invalid',$element->getTagName()); - } - } - protected function loadExternalXml($includeNode,$configPath) - { - if(($when=$includeNode->getAttribute('when'))===null) - $when=true; - if(($filePath=$includeNode->getAttribute('file'))===null) - throw new TConfigurationException('appconfig_includefile_required'); - if(isset($this->_includes[$filePath])) - $this->_includes[$filePath]='('.$this->_includes[$filePath].') || ('.$when.')'; - else - $this->_includes[$filePath]=$when; - $this->_empty=false; - } - public function getProperties() - { - return $this->_properties; - } - public function getAliases() - { - return $this->_aliases; - } - public function getUsings() - { - return $this->_usings; - } - public function getModules() - { - return $this->_modules; - } - public function getServices() - { - return $this->_services; - } - public function getParameters() - { - return $this->_parameters; - } - public function getExternalConfigurations() - { - return $this->_includes; - } -} -class TApplicationStatePersister extends TModule implements IStatePersister -{ - const CACHE_NAME='prado:appstate'; - public function init($config) - { - $this->getApplication()->setApplicationStatePersister($this); - } - protected function getStateFilePath() - { - return $this->getApplication()->getRuntimePath().'/global.cache'; - } - public function load() - { - if(($cache=$this->getApplication()->getCache())!==null && ($value=$cache->get(self::CACHE_NAME))!==false) - return unserialize($value); - else - { - if(($content=@file_get_contents($this->getStateFilePath()))!==false) - return unserialize($content); - else - return null; - } - } - public function save($state) - { - $content=serialize($state); - $saveFile=true; - if(($cache=$this->getApplication()->getCache())!==null) - { - if($cache->get(self::CACHE_NAME)===$content) - $saveFile=false; - else - $cache->set(self::CACHE_NAME,$content); - } - if($saveFile) - { - $fileName=$this->getStateFilePath(); - file_put_contents($fileName,$content,LOCK_EX); - } - } -} -class TShellApplication extends TApplication -{ - public function run() - { - $this->initApplication(); - } -} -?>
\ No newline at end of file |