summaryrefslogtreecommitdiff
path: root/framework/pradolite.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/pradolite.php')
-rw-r--r--framework/pradolite.php9489
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(
- '>'=>'&gt;',
- '<'=>'&lt;',
- '&'=>'&amp;',
- '"'=>'&quot;',
- "\r"=>'&#xD;',
- "\t"=>'&#x9;',
- "\n"=>'&#xA;'));
- }
-}
-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('<'=>'&lt;','>'=>'&gt;','"'=>'&quot;');
- private static $_decodeTable=array('&lt;'=>'<','&gt;'=>'>','&quot;'=>'"');
- 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?'&amp;':'&';
- $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?'&amp;':'&')) . 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('&amp;','&',$url), true, $this->_status);
- else
- header('Location: '.str_replace('&amp;','&',$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('&','&amp;',str_replace('&amp;','&',$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.='&amp;mode=debug';
- }
- if($gzip===false)
- $url.='&amp;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