diff options
Diffstat (limited to 'framework/pradolite.php')
-rw-r--r-- | framework/pradolite.php | 27450 |
1 files changed, 13749 insertions, 13701 deletions
diff --git a/framework/pradolite.php b/framework/pradolite.php index 18d998e0..2558e7ce 100644 --- a/framework/pradolite.php +++ b/framework/pradolite.php @@ -1,770 +1,973 @@ <?php -class TComponent +class TComponent
{ private $_e=array(); -public function __construct() - { - } -public function __destruct() - { - } -public function __get($name) - { - $getter='get'.$name; - if(method_exists($this,$getter)) - { - return $this->$getter(); - } - else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name)) - { - $name=strtolower($name); - if(!isset($this->_e[$name])) - $this->_e[$name]=new TList; - return $this->_e[$name]; - } - else - { - throw new TInvalidOperationException('component_property_undefined',get_class($this),$name); - } - } -public function __set($name,$value) - { - $setter='set'.$name; - if(method_exists($this,$setter)) - { - $this->$setter($value); - } - else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name)) - { - $this->attachEventHandler($name,$value); - } - else if(method_exists($this,'get'.$name)) - { - throw new TInvalidOperationException('component_property_readonly',get_class($this),$name); - } - else - { - throw new TInvalidOperationException('component_property_undefined',get_class($this),$name); - } - } -public function hasProperty($name) - { - return method_exists($this,'get'.$name) || method_exists($this,'set'.$name); - } -public function canGetProperty($name) - { - return method_exists($this,'get'.$name); - } -public function canSetProperty($name) - { - return method_exists($this,'set'.$name); - } -public function getSubProperty($path) - { - $object=$this; - foreach(explode('.',$path) as $property) - $object=$object->$property; - return $object; - } -public function setSubProperty($path,$value) - { - $object=$this; - if(($pos=strrpos($path,'.'))===false) - $property=$path; - else - { - $object=$this->getSubProperty(substr($path,0,$pos)); - $property=substr($path,$pos+1); - } - $object->$property=$value; - } -public function hasEvent($name) - { - return strncasecmp($name,'on',2)===0 && method_exists($this,$name); - } -public function hasEventHandler($name) - { - $name=strtolower($name); - return isset($this->_e[$name]) && $this->_e[$name]->getCount()>0; - } -public function getEventHandlers($name) - { - if(strncasecmp($name,'on',2)===0 && method_exists($this,$name)) - { - $name=strtolower($name); - if(!isset($this->_e[$name])) - $this->_e[$name]=new TList; - return $this->_e[$name]; - } - else - throw new TInvalidOperationException('component_event_undefined',get_class($this),$name); - } -public function attachEventHandler($name,$handler) - { - $this->getEventHandlers($name)->add($handler); - } -public function detachEventHandler($name,$handler) - { - if($this->hasEventHandler($name)) - { - try - { - $this->getEventHandlers($name)->remove($handler); - return true; - } - catch(Exception $e) - { - } - } - return false; - } -public function raiseEvent($name,$sender,$param) - { - $name=strtolower($name); - if(isset($this->_e[$name])) - { - foreach($this->_e[$name] as $handler) - { - if(is_string($handler)) - { - call_user_func($handler,$sender,$param); - } - else if(is_callable($handler,true)) - { - list($object,$method)=$handler; - if(is_string($object)) call_user_func($handler,$sender,$param); - else - { - if(($pos=strrpos($method,'.'))!==false) - { - $object=$this->getSubProperty(substr($method,0,$pos)); - $method=substr($method,$pos+1); - } - $object->$method($sender,$param); - } - } - else - throw new TInvalidDataValueException('component_eventhandler_invalid',get_class($this),$name); - } - } - else if(!$this->hasEvent($name)) - throw new TInvalidOperationException('component_event_undefined',get_class($this),$name); - } -public function evaluateExpression($expression) - { - try - { - if(eval("\$result=$expression;")===false) - throw new Exception(''); - return $result; - } - catch(Exception $e) - { - throw new TInvalidOperationException('component_expression_invalid',get_class($this),$expression,$e->getMessage()); - } - } -public function evaluateStatements($statements) - { - try - { - ob_start(); - if(eval($statements)===false) - throw new Exception(''); - $content=ob_get_contents(); - ob_end_clean(); - return $content; - } - catch(Exception $e) - { - throw new TInvalidOperationException('component_statements_invalid',get_class($this),$statements,$e->getMessage()); - } - } -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(); - } -} -class TPropertyValue -{ -public static function ensureBoolean($value) - { - if (is_string($value)) - return strcasecmp($value,'true')==0 || $value!=0; - else - return (boolean)$value; - } -public static function ensureString($value) - { - if (is_bool($value)) - return $value?'true':'false'; - else - return (string)$value; - } -public static function ensureInteger($value) - { - return (integer)$value; - } -public static function ensureFloat($value) - { - return (float)$value; - } -public static function ensureArray($value) - { - if(is_string($value)) - { - $trimmed = trim($value); - $len = strlen($value); - if ($len >= 2 && $trimmed[0] == '(' && $trimmed[$len-1] == ')') - { - eval('$array=array'.$trimmed.';'); - return $array; - } - else - return $len>0?array($value):array(); - } - else - return (array)$value; - } -public static function ensureObject($value) - { - return (object)$value; - } -public static function ensureEnum($value,$enums) - { - if(!is_array($enums)) - { - $enums=func_get_args(); - array_shift($enums); - } - if(in_array($value,$enums,true)) - return $value; - else - throw new TInvalidDataValueException('propertyvalue_enumvalue_invalid',$value,implode(' | ',$enums)); - } -} -class TEventParameter extends TComponent -{ -} -?><?php -class TException extends Exception -{ - private $_errorCode=''; -public function __construct($errorMessage) - { - $this->_errorCode=$errorMessage; - $args=func_get_args(); - $args[0]=$this->translateErrorMessage($errorMessage); - $str=call_user_func_array('sprintf',$args); - parent::__construct($str); - } -protected function translateErrorMessage($key) - { - $lang=Prado::getPreferredLanguage(); - $msgFile=Prado::getFrameworkPath().'/Exceptions/messages-'.$lang.'.txt'; - if(!is_file($msgFile)) - $msgFile=Prado::getFrameworkPath().'/Exceptions/messages.txt'; - if(($entries=@file($msgFile))===false) - return $key; - else - { - foreach($entries as $entry) - { - @list($code,$message)=explode('=',$entry,2); - if(trim($code)===$key) - return trim($message); - } - return $key; - } - } -public function getErrorCode() - { - return $this->_errorCode; - } -public function getErrorMessage() - { - return $this->getMessage(); - } -} -class TSystemException extends TException -{ -} -class TApplicationException extends TException -{ -} -class TInvalidOperationException extends TSystemException -{ -} -class TInvalidDataTypeException extends TSystemException -{ -} -class TInvalidDataValueException extends TSystemException -{ -} -class TInvalidDataFormatException extends TSystemException -{ -} -class TConfigurationException extends TSystemException -{ -} -class TIOException extends TSystemException -{ -} -class TDBException extends TSystemException -{ -} -class TSecurityException extends TSystemException -{ -} -class TNotSupportedException extends TSystemException -{ -} -class TTemplateParsingException extends TSystemException -{ -} -class TTemplateRuntimeException extends TSystemException -{ -} -class TPhpErrorException extends TException -{ - public function __construct($errno,$errstr,$errfile,$errline) - { - static $errorTypes=array( - E_ERROR => "Error", - E_WARNING => "Warning", - E_PARSE => "Parsing Error", - E_NOTICE => "Notice", - E_CORE_ERROR => "Core Error", - E_CORE_WARNING => "Core Warning", - E_COMPILE_ERROR => "Compile Error", - E_COMPILE_WARNING => "Compile Warning", - E_USER_ERROR => "User Error", - E_USER_WARNING => "User Warning", - E_USER_NOTICE => "User Notice", - E_STRICT => "Runtime Notice" - ); - $errorType=isset($errorTypes[$errno])?$errorTypes[$errno]:'Unknown Error'; - parent::__construct("[$errorType] $errstr (@line $errline in file $errfile)."); - } -} -class THttpException extends TException -{ - private $_statusCode; -public function __construct($statusCode,$errorMessage) - { - $args=func_get_args(); - array_shift($args); - call_user_func_array(array('TException', '__construct'), $args); - $this->_statusCode=TPropertyValue::ensureInteger($statusCode); - } -public function getStatusCode() - { - return $this->_statusCode; - } -} -?><?php -class TList extends TComponent implements IteratorAggregate,ArrayAccess +public function __construct()
+{
+} +public function __destruct()
+{
+} +public function __get($name)
+{
+$getter='get'.$name;
+if(method_exists($this,$getter))
+{
+return $this->$getter();
+}
+else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
+{
+$name=strtolower($name);
+if(!isset($this->_e[$name]))
+$this->_e[$name]=new TList;
+return $this->_e[$name];
+}
+else
+{
+throw new TInvalidOperationException('component_property_undefined',get_class($this),$name);
+}
+} +public function __set($name,$value)
+{
+$setter='set'.$name;
+if(method_exists($this,$setter))
+{
+$this->$setter($value);
+}
+else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
+{
+$this->attachEventHandler($name,$value);
+}
+else if(method_exists($this,'get'.$name))
+{
+throw new TInvalidOperationException('component_property_readonly',get_class($this),$name);
+}
+else
+{
+throw new TInvalidOperationException('component_property_undefined',get_class($this),$name);
+}
+} +public function hasProperty($name)
+{
+return method_exists($this,'get'.$name) || method_exists($this,'set'.$name);
+} +public function canGetProperty($name)
+{
+return method_exists($this,'get'.$name);
+} +public function canSetProperty($name)
+{
+return method_exists($this,'set'.$name);
+} +public function getSubProperty($path)
+{
+$object=$this;
+foreach(explode('.',$path) as $property)
+$object=$object->$property;
+return $object;
+} +public function setSubProperty($path,$value)
+{
+$object=$this;
+if(($pos=strrpos($path,'.'))===false)
+$property=$path;
+else
+{
+$object=$this->getSubProperty(substr($path,0,$pos));
+$property=substr($path,$pos+1);
+}
+$object->$property=$value;
+} +public function hasEvent($name)
+{
+return strncasecmp($name,'on',2)===0 && method_exists($this,$name);
+} +public function hasEventHandler($name)
+{
+$name=strtolower($name);
+return isset($this->_e[$name]) && $this->_e[$name]->getCount()>0;
+} +public function getEventHandlers($name)
+{
+if(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
+{
+$name=strtolower($name);
+if(!isset($this->_e[$name]))
+$this->_e[$name]=new TList;
+return $this->_e[$name];
+}
+else
+throw new TInvalidOperationException('component_event_undefined',get_class($this),$name);
+} +public function attachEventHandler($name,$handler)
+{
+$this->getEventHandlers($name)->add($handler);
+} +public function detachEventHandler($name,$handler)
+{
+if($this->hasEventHandler($name))
+{
+try
+{
+$this->getEventHandlers($name)->remove($handler);
+return true;
+}
+catch(Exception $e)
+{
+}
+}
+return false;
+} +public function raiseEvent($name,$sender,$param)
+{
+$name=strtolower($name);
+if(isset($this->_e[$name]))
+{
+foreach($this->_e[$name] as $handler)
+{
+if(is_string($handler))
+{
+call_user_func($handler,$sender,$param);
+}
+else if(is_callable($handler,true))
+{
+list($object,$method)=$handler;
+if(is_string($object)) call_user_func($handler,$sender,$param);
+else
+{
+if(($pos=strrpos($method,'.'))!==false)
+{
+$object=$this->getSubProperty(substr($method,0,$pos));
+$method=substr($method,$pos+1);
+}
+$object->$method($sender,$param);
+}
+}
+else
+throw new TInvalidDataValueException('component_eventhandler_invalid',get_class($this),$name);
+}
+}
+else if(!$this->hasEvent($name))
+throw new TInvalidOperationException('component_event_undefined',get_class($this),$name);
+} +public function evaluateExpression($expression)
+{
+try
+{
+if(eval("\$result=$expression;")===false)
+throw new Exception('');
+return $result;
+}
+catch(Exception $e)
+{
+throw new TInvalidOperationException('component_expression_invalid',get_class($this),$expression,$e->getMessage());
+}
+} +public function evaluateStatements($statements)
+{
+try
+{
+ob_start();
+if(eval($statements)===false)
+throw new Exception('');
+$content=ob_get_contents();
+ob_end_clean();
+return $content;
+}
+catch(Exception $e)
+{
+throw new TInvalidOperationException('component_statements_invalid',get_class($this),$statements,$e->getMessage());
+}
+} +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();
+}
+} +class TPropertyValue
+{ +public static function ensureBoolean($value)
+{
+if (is_string($value))
+return strcasecmp($value,'true')==0 || $value!=0;
+else
+return (boolean)$value;
+} +public static function ensureString($value)
+{
+if (is_bool($value))
+return $value?'true':'false';
+else
+return (string)$value;
+} +public static function ensureInteger($value)
+{
+return (integer)$value;
+} +public static function ensureFloat($value)
+{
+return (float)$value;
+} +public static function ensureArray($value)
+{
+if(is_string($value))
+{
+$trimmed = trim($value);
+$len = strlen($value);
+if ($len >= 2 && $trimmed[0] == '(' && $trimmed[$len-1] == ')')
+{
+eval('$array=array'.$trimmed.';');
+return $array;
+}
+else
+return $len>0?array($value):array();
+}
+else
+return (array)$value;
+} +public static function ensureObject($value)
+{
+return (object)$value;
+} +public static function ensureEnum($value,$enums)
+{
+if(!is_array($enums))
+{
+$enums=func_get_args();
+array_shift($enums);
+}
+if(in_array($value,$enums,true))
+return $value;
+else
+throw new TInvalidDataValueException('propertyvalue_enumvalue_invalid',$value,implode(' | ',$enums));
+}
+} +class TEventParameter extends TComponent
+{
+} + +class TException extends Exception
+{
+private $_errorCode=''; +public function __construct($errorMessage)
+{
+$this->_errorCode=$errorMessage;
+$args=func_get_args();
+$args[0]=$this->translateErrorMessage($errorMessage);
+$str=call_user_func_array('sprintf',$args);
+parent::__construct($str);
+} +protected function translateErrorMessage($key)
+{
+$lang=Prado::getPreferredLanguage();
+$msgFile=Prado::getFrameworkPath().'/Exceptions/messages-'.$lang.'.txt';
+if(!is_file($msgFile))
+$msgFile=Prado::getFrameworkPath().'/Exceptions/messages.txt';
+if(($entries=@file($msgFile))===false)
+return $key;
+else
+{
+foreach($entries as $entry)
+{
+@list($code,$message)=explode('=',$entry,2);
+if(trim($code)===$key)
+return trim($message);
+}
+return $key;
+}
+} +public function getErrorCode()
+{
+return $this->_errorCode;
+} +public function getErrorMessage()
+{
+return $this->getMessage();
+}
+} +class TSystemException extends TException
+{
+} +class TApplicationException extends TException
+{
+} +class TInvalidOperationException extends TSystemException
+{
+} +class TInvalidDataTypeException extends TSystemException
+{
+} +class TInvalidDataValueException extends TSystemException
+{
+} +class TInvalidDataFormatException extends TSystemException
+{
+} +class TConfigurationException extends TSystemException
+{
+} +class TIOException extends TSystemException
+{
+} +class TDBException extends TSystemException
+{
+} +class TSecurityException extends TSystemException
+{
+} +class TNotSupportedException extends TSystemException
+{
+} +class TPhpErrorException extends TSystemException
+{
+public function __construct($errno,$errstr,$errfile,$errline)
+{
+static $errorTypes=array(
+E_ERROR => "Error",
+E_WARNING => "Warning",
+E_PARSE => "Parsing Error",
+E_NOTICE => "Notice",
+E_CORE_ERROR => "Core Error",
+E_CORE_WARNING => "Core Warning",
+E_COMPILE_ERROR => "Compile Error",
+E_COMPILE_WARNING => "Compile Warning",
+E_USER_ERROR => "User Error",
+E_USER_WARNING => "User Warning",
+E_USER_NOTICE => "User Notice",
+E_STRICT => "Runtime Notice"
+);
+$errorType=isset($errorTypes[$errno])?$errorTypes[$errno]:'Unknown Error';
+parent::__construct("[$errorType] $errstr (@line $errline in file $errfile).");
+}
+} +class THttpException extends TSystemException
+{
+private $_statusCode; +public function __construct($statusCode,$errorMessage)
+{
+$args=func_get_args();
+array_shift($args);
+call_user_func_array(array('TException', '__construct'), $args);
+$this->_statusCode=TPropertyValue::ensureInteger($statusCode);
+} +public function getStatusCode()
+{
+return $this->_statusCode;
+}
+} + +class TList extends TComponent implements IteratorAggregate,ArrayAccess
{ private $_d=array(); private $_c=0; -public function __construct($data=null) - { - parent::__construct(); - if($data!==null) - $this->copyFrom($data); - } -public function getIterator() - { - return new TListIterator($this->_d); - } -public function getCount() - { - return $this->_c; - } -public function itemAt($index) - { - if(isset($this->_d[$index])) - return $this->_d[$index]; - else - throw new TInvalidDataValueException('list_index_invalid',$index); - } -public function add($item) - { - if($this->canAddItem($item)) - { - $this->_d[$this->_c++]=$item; - $this->addedItem($item); - } - else - throw new TInvalidOperationException('list_addition_disallowed'); - } -public function insert($index,$item) - { - if($this->canAddItem($item)) - { - if($index===$this->_c) - $this->add($item); - else if($index>=0 && $index<$this->_c) - { - array_splice($this->_d,$index,0,array($item)); - $this->_c++; - $this->addedItem($item); - } - else - throw new TInvalidDataValueException('list_index_invalid',$index); - } - else - throw new TInvalidOperationException('list_addition_disallowed'); -} -public function remove($item) - { - if(($index=$this->indexOf($item))>=0) - { - if($this->canRemoveItem($item)) - $this->removeAt($index); - else - throw new TInvalidOperationException('list_item_unremovable'); - } - else - throw new TInvalidDataValueException('list_item_inexistent'); - } -public function removeAt($index) - { - if(isset($this->_d[$index])) - { - $item=$this->_d[$index]; - if($this->canRemoveItem($item)) - { - if($index===$this->_c-1) - unset($this->_d[$index]); - else - array_splice($this->_d,$index,1); - $this->_c--; - $this->removedItem($item); - return $item; - } - else - throw new TInvalidOperationException('list_item_unremovable'); - } - else - throw new TInvalidDataValueException('list_index_invalid',$index); - } -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 isset($this->_d[$offset]); - } -public function offsetGet($offset) - { - if(isset($this->_d[$offset])) - return $this->_d[$offset]; - else - throw new TInvalidDataValueException('list_index_invalid',$offset); - } -public function offsetSet($offset,$item) - { - if($offset===null || $offset===$this->_c) - $this->add($item); - else - { - $this->removeAt($offset); - $this->insert($offset,$item); - } - } -public function offsetUnset($offset) - { - $this->removeAt($offset); - } -protected function addedItem($item) - { - } -protected function removedItem($item) - { - } -protected function canAddItem($item) - { - return true; - } -protected function canRemoveItem($item) - { - return true; - } -} -class TListIterator implements Iterator +public function __construct($data=null)
+{
+parent::__construct();
+if($data!==null)
+$this->copyFrom($data);
+} +public function getIterator()
+{
+return new TListIterator($this->_d);
+} +public function getCount()
+{
+return $this->_c;
+} +public function itemAt($index)
+{
+if(isset($this->_d[$index]))
+return $this->_d[$index];
+else
+throw new TInvalidDataValueException('list_index_invalid',$index);
+} +public function add($item)
+{
+$this->insertAt($this->_c,$item);
+} +public function insertAt($index,$item)
+{
+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);
+} +public function remove($item)
+{
+if(($index=$this->indexOf($item))>=0)
+$this->removeAt($index);
+else
+throw new TInvalidDataValueException('list_item_inexistent');
+} +public function removeAt($index)
+{
+if(isset($this->_d[$index]))
+{
+$item=$this->_d[$index];
+if($index===$this->_c-1)
+unset($this->_d[$index]);
+else
+array_splice($this->_d,$index,1);
+$this->_c--;
+return $item;
+}
+else
+throw new TInvalidDataValueException('list_index_invalid',$index);
+} +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 isset($this->_d[$offset]);
+} +public function offsetGet($offset)
+{
+if(isset($this->_d[$offset]))
+return $this->_d[$offset];
+else
+throw new TInvalidDataValueException('list_index_invalid',$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; -public function __construct(&$data) - { - $this->_d=&$data; - $this->_i=0; - } -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 isset($this->_d[$this->_i]); - } -} -?><?php -class TMap extends TComponent implements IteratorAggregate,ArrayAccess +public function __construct(&$data)
+{
+$this->_d=&$data;
+$this->_i=0;
+} +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 isset($this->_d[$this->_i]);
+}
+} + +class TMap extends TComponent implements IteratorAggregate,ArrayAccess
{ private $_d=array(); -public function __construct($data=null) - { - parent::__construct(); - if($data!==null) - $this->copyFrom($data); - } -public function getIterator() - { - return new TMapIterator($this->_d); - } -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->canAddItem($key,$value)) - { - if(isset($this->_d[$key])) - $this->remove($key); - $this->_d[$key]=$value; - $this->addedItem($key,$value); - } - else - throw new TInvalidOperationException('map_addition_disallowed'); - } -public function remove($key) - { - if(isset($this->_d[$key])) - { - $value=$this->_d[$key]; - if($this->canRemoveItem($key,$value)) - { - unset($this->_d[$key]); - $this->removedItem($key,$value); - return $value; - } - else - throw new TInvalidOperationException('map_item_unremovable'); - } - else - return null; - } -public function clear() - { - foreach(array_keys($this->_d) as $key) - $this->remove($key); - } -public function contains($key) - { - return isset($this->_d[$key]); - } -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 isset($this->_d[$offset]) ? $this->_d[$offset] : null; - } -public function offsetSet($offset,$item) - { - $this->add($offset,$item); - } -public function offsetUnset($offset) - { - $this->remove($offset); - } -protected function addedItem($key,$item) - { - } -protected function removedItem($key,$item) - { - } -protected function canAddItem($key,$item) - { - return true; - } -protected function canRemoveItem($key,$item) - { - return true; - } -} -class TMapIterator implements Iterator +public function __construct($data=null)
+{
+parent::__construct();
+if($data!==null)
+$this->copyFrom($data);
+} +public function getIterator()
+{
+return new TMapIterator($this->_d);
+} +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(isset($this->_d[$key]))
+$this->remove($key);
+$this->_d[$key]=$value;
+} +public function remove($key)
+{
+if(isset($this->_d[$key]))
+{
+$value=$this->_d[$key];
+unset($this->_d[$key]);
+return $value;
+}
+else
+return null;
+} +public function clear()
+{
+foreach(array_keys($this->_d) as $key)
+$this->remove($key);
+} +public function contains($key)
+{
+return isset($this->_d[$key]);
+} +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() - { - do - { - $this->_key=next($this->_keys); - } - while(!isset($this->_d[$this->_key]) && $this->_key!==false); - } -public function valid() - { - return $this->_key!==false; - } -} -?><?php +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()
+{
+do
+{
+$this->_key=next($this->_keys);
+}
+while(!isset($this->_d[$this->_key]) && $this->_key!==false);
+} +public function valid()
+{
+return $this->_key!==false;
+}
+}
+ +class TAttributeCollection extends TMap
+{ +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 itemAt($key)
+{
+return parent::itemAt(strtolower($key));
+} +public function add($key,$value)
+{
+parent::add(strtolower($key),$value);
+} +public function remove($key)
+{
+return parent::remove(strtolower($key));
+} +public function contains($key)
+{
+return parent::contains(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 TPagedDataSource extends TComponent implements IteratorAggregate
+{ +private $_dataSource=null; +private $_pageSize=10; +private $_currentPageIndex=0; +private $_allowPaging=false; +private $_allowCustomPaging=false; +private $_virtualCount=0; +public function getDataSource()
+{
+return $this->_dataSource;
+} +public function setDataSource($value)
+{
+if(!($value instanceof TMap) && !($value instanceof TList))
+{
+if(is_array($value))
+$value=new TMap($value);
+else if($value instanceof Traversable)
+$value=new TList($value);
+else if($value!==null)
+throw new TInvalidDataTypeException('pageddatasource_datasource_invalid');
+}
+$this->_dataSource=$value;
+} +public function getPageSize()
+{
+return $this->_pageSize;
+} +public function setPageSize($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))>0)
+$this->_pageSize=$value;
+else
+throw new TInvalidDataValueException('pageddatasource_pagesize_invalid');
+} +public function getCurrentPageIndex()
+{
+return $this->_currentPageIndex;
+} +public function setCurrentPageIndex($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))<0)
+$value=0;
+$this->_currentPageIndex=$value;
+} +public function getAllowPaging()
+{
+return $this->_allowPaging;
+} +public function setAllowPaging($value)
+{
+$this->_allowPaging=TPropertyValue::ensureBoolean($value);
+} +public function getAllowCustomPaging()
+{
+return $this->_allowCustomPaging;
+} +public function setAllowCustomPaging($value)
+{
+$this->_allowCustomPaging=TPropertyValue::ensureBoolean($value);
+} +public function getVirtualCount()
+{
+return $this->_virtualCount;
+} +public function setVirtualCount($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))>=0)
+$this->_virtualCount=$value;
+else
+throw new TInvalidDataValueException('pageddatasource_virtualcount_invalid');
+} +public function getCount()
+{
+if($this->_dataSource===null)
+return 0;
+if(!$this->_allowPaging)
+return $this->getDataSourceCount();
+if(!$this->_allowCustomPaging && $this->getIsLastPage())
+return $this->getDataSourceCount()-$this->getFirstIndexInPage();
+return $this->_pageSize;
+} +public function getPageCount()
+{
+if($this->_dataSource===null)
+return 0;
+$count=$this->getDataSourceCount();
+if(!$this->_allowPaging || $count<=0)
+return 1;
+return (int)(($count+$this->_pageSize-1)/$this->_pageSize);
+} +public function getIsFirstPage()
+{
+if($this->_allowPaging)
+return $this->_currentPageIndex===0;
+else
+return true;
+} +public function getIsLastPage()
+{
+if($this->_allowPaging)
+return $this->_currentPageIndex===$this->getPageCount()-1;
+else
+return true;
+} +public function getFirstIndexInPage()
+{
+if($this->_dataSource!==null && $this->_allowPaging && !$this->_allowCustomPaging)
+return $this->_currentPageIndex*$this->_pageSize;
+else
+return 0;
+} +public function getDataSourceCount()
+{
+if($this->_dataSource===null)
+return 0;
+else if($this->_allowCustomPaging)
+return $this->_virtualCount;
+else
+return $this->_dataSource->getCount();
+} +public function getIterator()
+{
+if($this->_dataSource instanceof TList)
+return new TPagedListIterator($this->_dataSource,$this->getFirstIndexInPage(),$this->getCount());
+else if($this->_dataSource instanceof TMap)
+return new TPagedMapIterator($this->_dataSource,$this->getFirstIndexInPage(),$this->getCount());
+else
+return null;
+}
+} +class TPagedListIterator implements Iterator
+{
+private $_list;
+private $_startIndex;
+private $_count;
+private $_index; +public function __construct(TList $list,$startIndex,$count)
+{
+$this->_list=$list;
+$this->_index=0;
+$this->_startIndex=$startIndex;
+if($startIndex+$count>$list->getCount())
+$this->_count=$list->getCount()-$startIndex;
+else
+$this->_count=$count;
+} +public function rewind()
+{
+$this->_index=0;
+} +public function key()
+{
+return $this->_index;
+} +public function current()
+{
+return $this->_list->itemAt($this->_startIndex+$this->_index);
+} +public function next()
+{
+$this->_index++;
+} +public function valid()
+{
+return $this->_index<$this->_count;
+}
+} +class TPagedMapIterator implements Iterator
+{
+private $_map;
+private $_startIndex;
+private $_count;
+private $_index;
+private $_iterator; +public function __construct(TMap $map,$startIndex,$count)
+{
+$this->_map=$map;
+$this->_index=0;
+$this->_startIndex=$startIndex;
+if($startIndex+$count>$map->getCount())
+$this->_count=$map->getCount()-$startIndex;
+else
+$this->_count=$count;
+$this->_iterator=$map->getIterator();
+} +public function rewind()
+{
+$this->_iterator->rewind();
+for($i=0;$i<$this->_startIndex;++$i)
+$this->_iterator->next();
+$this->_index=0;
+} +public function key()
+{
+return $this->_iterator->key();
+} +public function current()
+{
+return $this->_iterator->current();
+} +public function next()
+{
+$this->_index++;
+$this->_iterator->next();
+} +public function valid()
+{
+return $this->_index<$this->_count;
+}
+} + +class TDummyDataSource extends TComponent implements IteratorAggregate
+{
+private $_count; +public function __construct($count)
+{
+$this->_count=$count;
+} +public function getCount()
+{
+return $this->_count;
+} +public function getIterator()
+{
+return new TDummyDataSourceIterator($this->_count);
+}
+} +class TDummyDataSourceIterator implements Iterator
+{
+private $_index;
+private $_count; +public function __construct($count)
+{
+$this->_count=$count;
+$this->_index=0;
+} +public function rewind()
+{
+$this->_index=0;
+} +public function key()
+{
+return $this->_index;
+} +public function current()
+{
+return null;
+} +public function next()
+{
+$this->_index++;
+} +public function valid()
+{
+return $this->_index<$this->_count;
+}
+} -class TAttributeCollection extends TMap -{ -public function __get($name) - { - $name=strtolower($name); - return $this->contains($name)?$this->itemAt($name):parent::__get($name); - } -public function __set($name,$value) - { - $this->add(strtolower($name),$value); - } -public function hasProperty($name) - { - $name=strtolower($name); - return $this->contains($name) || parent::hasProperty($name); - } -public function canGetProperty($name) - { - $name=strtolower($name); - return $this->contains($name) || parent::canGetProperty($name); - } -public function canSetProperty($name) - { - return true; - } -} -?><?php class TXmlElement extends TComponent { private $_parent=null; @@ -773,366 +976,363 @@ private $_value; private $_elements=null; private $_attributes=null; public function __construct($tagName) - { - parent::__construct(); - $this->setTagName($tagName); - } +{ +parent::__construct(); +$this->setTagName($tagName); +} public function getParent() - { - return $this->_parent; - } +{ +return $this->_parent; +} public function setParent($parent) - { - $this->_parent=$parent; - } +{ +$this->_parent=$parent; +} public function getTagName() - { - return $this->_tagName; - } +{ +return $this->_tagName; +} public function setTagName($tagName) - { - $this->_tagName=$tagName; - } +{ +$this->_tagName=$tagName; +} public function getValue() - { - return $this->_value; - } +{ +return $this->_value; +} public function setValue($value) - { - $this->_value=$value; - } +{ +$this->_value=$value; +} public function getHasElement() - { - return $this->_elements!==null && $this->_elements->getCount()>0; - } +{ +return $this->_elements!==null && $this->_elements->getCount()>0; +} public function getHasAttribute() - { - return $this->_attributes!==null && $this->_attributes->getCount()>0; - } +{ +return $this->_attributes!==null && $this->_attributes->getCount()>0; +} public function getAttribute($name) - { - if($this->_attributes!==null) - return $this->_attributes->itemAt($name); - else - return null; - } +{ +if($this->_attributes!==null) +return $this->_attributes->itemAt($name); +else +return null; +} public function getElements() - { - if(!$this->_elements) - $this->_elements=new TXmlElementList($this); - return $this->_elements; - } +{ +if(!$this->_elements) +$this->_elements=new TXmlElementList($this); +return $this->_elements; +} public function getAttributes() - { - if(!$this->_attributes) - $this->_attributes=new TMap; - return $this->_attributes; - } +{ +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; - } +{ +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; - } +{ +$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) - $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($this->getValue()!=='') - { - return $prefix."<{$this->_tagName}$attr>{$this->_value}</{$this->_tagName}>"; - } - else - return $prefix."<{$this->_tagName}$attr />"; - } +{ +$attr=''; +if($this->_attributes!==null) +{ +foreach($this->_attributes as $name=>$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($this->getValue()!=='') +{ +return $prefix."<{$this->_tagName}$attr>{$this->_value}</{$this->_tagName}>"; +} +else +return $prefix."<{$this->_tagName}$attr />"; +} } class TXmlDocument extends TXmlElement { private $_version; private $_encoding; public function __construct($version='1.0',$encoding='') - { - parent::__construct(''); - $this->setversion($version); - $this->setEncoding($encoding); - } +{ +parent::__construct(''); +$this->setversion($version); +$this->setEncoding($encoding); +} public function getVersion() - { - return $this->_version; - } +{ +return $this->_version; +} public function setVersion($version) - { - $this->_version=$version; - } +{ +$this->_version=$version; +} public function getEncoding() - { - return $this->_encoding; - } +{ +return $this->_encoding; +} public function setEncoding($encoding) - { - $this->_encoding=$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); - } +{ +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; +{ +$doc=new DOMDocument(); +if($doc->loadXML($string)===false) +return false; $this->setEncoding($doc->encoding); - $this->setVersion($doc->version); +$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(); - foreach($element->attributes as $name=>$attr) - $attributes->add($name,$attr->value); - foreach($element->childNodes as $child) - { - if($child instanceof DOMElement) - $elements->add($this->buildElement($child)); - } +$this->setTagName($element->tagName); +$this->setValue($element->nodeValue); +$elements=$this->getElements(); +$attributes=$this->getAttributes(); +$elements->clear(); +$attributes->clear(); +foreach($element->attributes as $name=>$attr) +$attributes->add($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); - } +{ +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); - } +{ +$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); +} private function buildElement($node) - { - $element=new TXmlElement($node->tagName); - $element->setValue($node->nodeValue); - foreach($node->attributes as $name=>$attr) - $element->getAttributes()->add($name,$attr->value); - foreach($node->childNodes as $child) - { - if($child instanceof DOMElement) - $element->getElements()->add($this->buildElement($child)); - } - return $element; - } +{ +$element=new TXmlElement($node->tagName); +$element->setValue($node->nodeValue); +foreach($node->attributes as $name=>$attr) +$element->getAttributes()->add($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) - { - parent::__construct(); - $this->_o=$owner; - } +{ +parent::__construct(); +$this->_o=$owner; +} protected function getOwner() - { - return $this->_o; - } -protected function addedItem($item) - { - if($item->getParent()!==null) - $item->getParent()->getElements()->remove($item); - $item->setParent($this->_o); - } -protected function removedItem($item) - { - $item->setParent(null); - } -protected function canAddItem($item) - { - return ($item instanceof TXmlElement); - } -} -?><?php -class THttpUtility -{ - private static $_entityTable=null; -public static function htmlEncode($s) - { - return htmlspecialchars($s); - } -public static function htmlDecode($s) - { - if(!self::$_entityTable) - self::buildEntityTable(); - return strtr($s,self::$_entityTable); - } -private static function buildEntityTable() - { - self::$_entityTable=array_flip(get_html_translation_table(HTML_ENTITIES,ENT_QUOTES)); - } -public static function quoteJavaScriptString($js,$forUrl=false) - { - if($forUrl) - return strtr($js,array('%'=>'%25',"\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\')); - else - return strtr($js,array("\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\')); - } -public static function trimJavaScriptString($js) - { - if($js!=='' && $js!==null) - { - $js=trim($js); - if(($pos=strpos($js,'javascript:'))===0) - $js=substr($js,11); - $js=rtrim($js,';').';'; - } - return $js; - } -} -?><?php -interface ICache +{ +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 THttpUtility
+{
+private static $_entityTable=null; +public static function htmlEncode($s)
+{
+return htmlspecialchars($s);
+} +public static function htmlDecode($s)
+{
+if(!self::$_entityTable)
+self::buildEntityTable();
+return strtr($s,self::$_entityTable);
+} +private static function buildEntityTable()
+{
+self::$_entityTable=array_flip(get_html_translation_table(HTML_ENTITIES,ENT_QUOTES));
+} +public static function quoteJavaScriptString($js,$forUrl=false)
+{
+if($forUrl)
+return strtr($js,array('%'=>'%25',"\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\'));
+else
+return strtr($js,array("\t"=>'\t',"\n"=>'\n',"\r"=>'\r','"'=>'\"','\''=>'\\\'','\\'=>'\\\\'));
+} +public static function trimJavaScriptString($js)
+{
+if($js!=='' && $js!==null)
+{
+$js=trim($js);
+if(($pos=strpos($js,'javascript:'))===0)
+$js=substr($js,11);
+$js=rtrim($js,';').';';
+}
+return $js;
+}
+} + +interface ICache
{ public function get($id); public function set($id,$value,$expire=0); public function add($id,$value,$expire=0); public function replace($id,$value,$expire=0); public function delete($id); -public function flush(); +public function flush();
} -interface IDependency +interface IDependency
{ } -class TTimeDependency -{ +class TTimeDependency
+{
} -class TFileDependency -{ +class TFileDependency
+{
} -class TDirectoryDependency -{ +class TDirectoryDependency
+{
} -?><?php -class TLogger extends TComponent -{ -const DEBUG=0x01; - const INFO=0x02; - const NOTICE=0x04; - const WARNING=0x08; - const ERROR=0x10; - const ALERT=0x20; - const FATAL=0x40; + +class TLogger extends TComponent
+{ +const DEBUG=0x01;
+const INFO=0x02;
+const NOTICE=0x04;
+const WARNING=0x08;
+const ERROR=0x10;
+const ALERT=0x20;
+const FATAL=0x40; private $_logs=array(); private $_levels; private $_categories; -public function log($message,$level,$category='Uncategorized') - { - $this->_logs[]=array($message,$level,$category,microtime(true)); - } -public function getLogs($levels=null,$categories=null) - { - $this->_levels=$levels; - $this->_categories=$categories; - if(empty($levels) && empty($categories)) - return $this->_logs; - else if(empty($levels)) - return array_values(array_filter(array_filter($this->_logs,array($this,'filterByCategories')))); - else if(empty($categories)) - return array_values(array_filter(array_filter($this->_logs,array($this,'filterByLevels')))); - else - { - $ret=array_values(array_filter(array_filter($this->_logs,array($this,'filterByLevels')))); - return array_values(array_filter(array_filter($ret,array($this,'filterByCategories')))); - } - } -private function filterByCategories($value) - { - foreach($this->_categories as $category) - { - if($value[2]===$category || strpos($value[2],$category.'.')===0) - return $value; - } - return false; - } -private function filterByLevels($value) - { - if($value[1] & $this->_levels) - return $value; - else - return false; - } -} -?><?php -define('PRADO_DIR',dirname(__FILE__)); - - - - - - - +public function log($message,$level,$category='Uncategorized')
+{
+$this->_logs[]=array($message,$level,$category,microtime(true));
+} +public function getLogs($levels=null,$categories=null)
+{
+$this->_levels=$levels;
+$this->_categories=$categories;
+if(empty($levels) && empty($categories))
+return $this->_logs;
+else if(empty($levels))
+return array_values(array_filter(array_filter($this->_logs,array($this,'filterByCategories'))));
+else if(empty($categories))
+return array_values(array_filter(array_filter($this->_logs,array($this,'filterByLevels'))));
+else
+{
+$ret=array_values(array_filter(array_filter($this->_logs,array($this,'filterByLevels'))));
+return array_values(array_filter(array_filter($ret,array($this,'filterByCategories'))));
+}
+} +private function filterByCategories($value)
+{
+foreach($this->_categories as $category)
+{
+if($value[2]===$category || strpos($value[2],$category.'.')===0)
+return $value;
+}
+return false;
+} +private function filterByLevels($value)
+{
+if($value[1] & $this->_levels)
+return $value;
+else
+return false;
+}
+} -interface IModule +define('PRADO_DIR',dirname(__FILE__)); +interface IModule
{ public function init($config); public function getID(); -public function setID($id); +public function setID($id);
} -interface IService +interface IService
{ public function init($config); public function getID(); public function setID($id); -public function run(); +public function run();
} -interface ITextWriter +interface ITextWriter
{ public function write($str); -public function flush(); +public function flush();
} -interface ITheme +interface ITheme
{ -public function apply($control); +public function applySkin($control);
} -interface ITemplate +interface ITemplate
{ -public function instantiateIn($parent); +public function instantiateIn($parent);
} -interface IUser +interface IUser
{ public function getName(); public function setName($value); @@ -1142,353 +1342,370 @@ public function getRoles(); public function setRoles($value); public function isInRole($role); public function saveToString(); -public function loadFromString($string); +public function loadFromString($string);
} -interface IStatePersister +interface IStatePersister
{ public function load(); -public function save($state); +public function save($state);
} -abstract class TModule extends TComponent implements IModule +abstract class TModule extends TComponent 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 TComponent implements IService +public function init($config)
+{
+} +public function getID()
+{
+return $this->_id;
+} +public function setID($value)
+{
+$this->_id=$value;
+}
+} +abstract class TService extends TComponent implements IService
{ private $_id; -public function init($config) - { - } -public function getID() - { - return $this->_id; - } -public function setID($value) - { - $this->_id=$value; - } -public function run() - { - } -} -class PradoBase +public function init($config)
+{
+} +public function getID()
+{
+return $this->_id;
+} +public function setID($value)
+{
+$this->_id=$value;
+} +public function run()
+{
+}
+} +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.0b'; - } -public static function poweredByPrado() - { - return '<a title="Powered by PRADO" href="http://www.pradosoft.com/"><img src="http://www.pradosoft.com/images/powered.gif" 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) - { - if(isset(self::$_usings[$namespace]) || class_exists($namespace,false)) - return; - if(($pos=strrpos($namespace,'.'))===false) { - include_once($namespace.self::CLASS_FILE_EXT); - if(!class_exists($namespace,false)) - throw new TInvalidOperationException('prado_component_unknown',$namespace); - } - else if(($path=self::getPathOfNamespace($namespace,self::CLASS_FILE_EXT))!==null) - { - $className=substr($namespace,$pos+1); - if($className==='*') { - if(is_dir($path)) - { - self::$_usings[$namespace]=$path; - set_include_path(get_include_path().PATH_SEPARATOR.$path); - } - else - throw new TInvalidDataValueException('prado_using_invalid',$namespace); - } - else { - if(is_file($path)) - { - self::$_usings[$namespace]=$path; - if(!class_exists($className,false)) - include_once($path); - } - else - throw new TInvalidDataValueException('prado_using_invalid',$namespace); - } - } - 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.'/'.implode('/',$segs),'/').(($file==='*')?'':'/'.$file.$ext); - else - return null; - } - } -public static function getPathOfAlias($alias) - { - return isset(self::$_aliases[$alias])?self::$_aliases[$alias]:null; - } -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) - echo '(...)'; - else - echo '()'; - echo "\n"; - } - echo '</pre>'; - exit(1); - } -public static function getUserLanguages() - { - static $languages=null; - if($languages===null) - { - $languages=array(); - foreach(explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']) as $language) - { - $array=split(';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()==='Performance') - return; - if(!self::$_application || self::$_application->getMode()==='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; - } -} -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 TDate extends TComponent -{ -} -?><?php +public static function getVersion()
+{
+return '3.0b';
+} +public static function poweredByPrado()
+{
+return '<a title="Powered by PRADO" href="http://www.pradosoft.com/"><img src="http://www.pradosoft.com/images/powered.gif" 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)
+{
+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(!class_exists($namespace,false))
+throw new TInvalidOperationException('prado_component_unknown',$namespace);
+else
+throw $e;
+}
+}
+else if(($path=self::getPathOfNamespace($namespace,self::CLASS_FILE_EXT))!==null)
+{
+$className=substr($namespace,$pos+1);
+if($className==='*') {
+if(is_dir($path))
+{
+self::$_usings[$namespace]=$path;
+set_include_path(get_include_path().PATH_SEPARATOR.$path);
+}
+else
+throw new TInvalidDataValueException('prado_using_invalid',$namespace);
+}
+else {
+if(is_file($path))
+{
+self::$_usings[$namespace]=$path;
+if(!class_exists($className,false))
+{
+try
+{
+include_once($path);
+}
+catch(Exception $e)
+{
+if(!class_exists($className,false))
+throw new TInvalidOperationException('prado_component_unknown',$className);
+else
+throw $e;
+}
+}
+}
+else
+throw new TInvalidDataValueException('prado_using_invalid',$namespace);
+}
+}
+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.'/'.implode('/',$segs),'/').(($file==='*')?'':'/'.$file.$ext);
+else
+return null;
+}
+} +public static function getPathOfAlias($alias)
+{
+return isset(self::$_aliases[$alias])?self::$_aliases[$alias]:null;
+} +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)
+echo '(...)';
+else
+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=split(';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()===TApplication::STATE_PERFORMANCE)
+return;
+if(!self::$_application || self::$_application->getMode()===TApplication::STATE_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;
+}
+} +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 TDate extends TComponent
+{
+}
-if(!class_exists('Prado',false)) -{ - class Prado extends PradoBase - { - } -} -if(!function_exists('__autoload')) -{ - function __autoload($className) - { - include_once($className.Prado::CLASS_FILE_EXT); - if(!class_exists($className,false)) - Prado::fatalError("Class file for '$className' cannot be found."); - } +if(!class_exists('Prado',false))
+{
+class Prado extends PradoBase
+{
+}
+} +if(!function_exists('__autoload'))
+{
+function __autoload($className)
+{
+include_once($className.Prado::CLASS_FILE_EXT);
+if(!class_exists($className,false))
+Prado::fatalError("Class file for '$className' cannot be found.");
+}
} set_error_handler(array('Prado','phpErrorHandler'),error_reporting()); set_exception_handler(array('Prado','exceptionHandler')); -?><?php - - - - - - class TApplication extends TComponent { const STATE_OFF='Off'; - const STATE_DEBUG='Debug'; - const STATE_NORMAL='Normal'; - const STATE_PERFORMANCE='Performance'; +const STATE_DEBUG='Debug'; +const STATE_NORMAL='Normal'; +const STATE_PERFORMANCE='Performance'; const PAGE_SERVICE_ID='page'; const CONFIG_FILE='application.xml'; const RUNTIME_PATH='runtime'; const CONFIGCACHE_FILE='config.cache'; const GLOBAL_FILE='global.cache'; private static $_steps=array( - 'BeginRequest', - 'Authentication', - 'PostAuthentication', - 'Authorization', - 'PostAuthorization', - 'LoadState', - 'PostLoadState', - 'PreRunService', - 'RunService', - 'PostRunService', - 'SaveState', - 'PostSaveState', - 'EndRequest' - ); +'BeginRequest', +'Authentication', +'PostAuthentication', +'Authorization', +'PostAuthorization', +'LoadState', +'PostLoadState', +'PreRunService', +'RunService', +'PostRunService', +'SaveState', +'PostSaveState', +'EndRequest' +); private $_id; private $_uniqueID; private $_requestCompleted=false; @@ -1514,381 +1731,380 @@ private $_globalization=null; private $_authRules=null; private $_mode='Debug'; public function __construct($basePath='protected',$cacheConfig=true) - { - parent::__construct(); +{ +parent::__construct(); Prado::setApplication($this); if(($this->_basePath=realpath($basePath))===false || !is_dir($this->_basePath)) - throw new TConfigurationException('application_basepath_invalid',$basePath); - $configFile=$this->_basePath.'/'.self::CONFIG_FILE; - $this->_configFile=is_file($configFile) ? $configFile : null; - $this->_runtimePath=$this->_basePath.'/'.self::RUNTIME_PATH; - if(!is_dir($this->_runtimePath) || !is_writable($this->_runtimePath)) - throw new TConfigurationException('application_runtimepath_invalid',$this->_runtimePath); +throw new TConfigurationException('application_basepath_invalid',$basePath); +$configFile=$this->_basePath.'/'.self::CONFIG_FILE; +$this->_configFile=is_file($configFile) ? $configFile : null; +$this->_runtimePath=$this->_basePath.'/'.self::RUNTIME_PATH; +if(!is_dir($this->_runtimePath) || !is_writable($this->_runtimePath)) +throw new TConfigurationException('application_runtimepath_invalid',$this->_runtimePath); $this->_cacheFile=$cacheConfig ? $this->_runtimePath.'/'.self::CONFIGCACHE_FILE : null; $this->_uniqueID=md5($this->_basePath); - } +} 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_service_unavailable'); - $method='on'.self::$_steps[$this->_step]; +{ +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_service_unavailable'); +$method='on'.self::$_steps[$this->_step]; - $this->$method($this); - if($this->_requestCompleted && $this->_step<$n-1) - $this->_step=$n-1; - else - $this->_step++; - } - } - catch(Exception $e) - { - $this->onError($e); - } - } +$this->$method($this); +if($this->_requestCompleted && $this->_step<$n-1) +$this->_step=$n-1; +else +$this->_step++; +} +} +catch(Exception $e) +{ +$this->onError($e); +} +} public function completeRequest() - { - $this->_requestCompleted=true; - } +{ +$this->_requestCompleted=true; +} public function getGlobalState($key,$defaultValue=null) - { - return isset($this->_globals[$key])?$this->_globals[$key]:$defaultValue; - } +{ +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; - } +{ +$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]); - } +{ +$this->_stateChanged=true; +unset($this->_globals[$key]); +} protected function loadGlobals() - { - $this->_globals=$this->getApplicationStatePersister()->load(); - } +{ +$this->_globals=$this->getApplicationStatePersister()->load(); +} protected function saveGlobals() - { - if(!$this->_stateChanged) - return; - $this->getApplicationStatePersister()->save($this->_globals); - } +{ +if(!$this->_stateChanged) +return; +$this->getApplicationStatePersister()->save($this->_globals); +} public function getID() - { - return $this->_id; - } +{ +return $this->_id; +} public function setID($value) - { - $this->_id=$value; - } +{ +$this->_id=$value; +} public function getUniqueID() - { - return $this->_uniqueID; - } +{ +return $this->_uniqueID; +} public function getMode() - { - return $this->_mode; - } +{ +return $this->_mode; +} public function setMode($value) - { - $this->_mode=TPropertyValue::ensureEnum($value,array(self::STATE_OFF,self::STATE_DEBUG,self::STATE_NORMAL,self::STATE_PERFORMANCE)); - } +{ +$this->_mode=TPropertyValue::ensureEnum($value,array(self::STATE_OFF,self::STATE_DEBUG,self::STATE_NORMAL,self::STATE_PERFORMANCE)); +} public function getBasePath() - { - return $this->_basePath; - } +{ +return $this->_basePath; +} public function getConfigurationFile() - { - return $this->_configFile; - } +{ +return $this->_configFile; +} public function getRuntimePath() - { - return $this->_runtimePath; - } +{ +return $this->_runtimePath; +} public function getService() - { - return $this->_service; - } +{ +return $this->_service; +} public function setModule($id,IModule $module) - { - if(isset($this->_modules[$id])) - throw new TConfigurationException('application_moduleid_duplicated',$id); - else - $this->_modules[$id]=$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; - } +{ +return isset($this->_modules[$id])?$this->_modules[$id]:null; +} public function getModules() - { - return $this->_modules; - } +{ +return $this->_modules; +} public function getParameters() - { - return $this->_parameters; - } +{ +return $this->_parameters; +} public function getPageService() - { - if(!$this->_pageService) - { - $this->_pageService=new TPageService; - $this->_pageService->init(null); - } - return $this->_pageService; - } +{ +if(!$this->_pageService) +{ +$this->_pageService=new TPageService; +$this->_pageService->init(null); +} +return $this->_pageService; +} public function setPageService(TPageService $service) - { - $this->_pageService=$service; - } +{ +$this->_pageService=$service; +} public function getRequest() - { - if(!$this->_request) - { - $this->_request=new THttpRequest; - $this->_request->init(null); - } - return $this->_request; - } +{ +if(!$this->_request) +{ +$this->_request=new THttpRequest; +$this->_request->init(null); +} +return $this->_request; +} public function setRequest(THttpRequest $request) - { - $this->_request=$request; - } +{ +$this->_request=$request; +} public function getResponse() - { - if(!$this->_response) - { - $this->_response=new THttpResponse; - $this->_response->init(null); - } - return $this->_response; - } +{ +if(!$this->_response) +{ +$this->_response=new THttpResponse; +$this->_response->init(null); +} +return $this->_response; +} public function setResponse(THttpResponse $response) - { - $this->_response=$response; - } +{ +$this->_response=$response; +} public function getSession() - { - if(!$this->_session) - { - $this->_session=new THttpSession; - $this->_session->init(null); - } - return $this->_session; - } +{ +if(!$this->_session) +{ +$this->_session=new THttpSession; +$this->_session->init(null); +} +return $this->_session; +} public function setSession(THttpSession $session) - { - $this->_session=$session; - } +{ +$this->_session=$session; +} public function getErrorHandler() - { - if(!$this->_errorHandler) - { - $this->_errorHandler=new TErrorHandler; - $this->_errorHandler->init(null); - } - return $this->_errorHandler; - } +{ +if(!$this->_errorHandler) +{ +$this->_errorHandler=new TErrorHandler; +$this->_errorHandler->init(null); +} +return $this->_errorHandler; +} public function setErrorHandler(TErrorHandler $handler) - { - $this->_errorHandler=$handler; - } +{ +$this->_errorHandler=$handler; +} public function getApplicationStatePersister() - { - if(!$this->_statePersister) - { - $this->_statePersister=new TApplicationStatePersister; - $this->_statePersister->init(null); - } - return $this->_statePersister; - } +{ +if(!$this->_statePersister) +{ +$this->_statePersister=new TApplicationStatePersister; +$this->_statePersister->init(null); +} +return $this->_statePersister; +} public function setApplicationStatePersister(IStatePersister $persister) - { - $this->_statePersister=$persister; - } +{ +$this->_statePersister=$persister; +} public function getCache() - { - return $this->_cache; - } +{ +return $this->_cache; +} public function setCache(ICache $cache) - { - $this->_cache=$cache; - } +{ +$this->_cache=$cache; +} public function getUser() - { - return $this->_user; - } +{ +return $this->_user; +} public function setUser(IUser $user) - { - $this->_user=$user; - } +{ +$this->_user=$user; +} public function getGlobalization() - { - return $this->_globalization; - } +{ +return $this->_globalization; +} public function setGlobalization(TGlobalization $handler) - { - $this->_globalization = $handler; - } +{ +$this->_globalization = $handler; +} public function getAuthorizationRules() - { - if($this->_authRules===null) - $this->_authRules=new TAuthorizationRuleCollection; - return $this->_authRules; - } +{ +if($this->_authRules===null) +$this->_authRules=new TAuthorizationRuleCollection; +return $this->_authRules; +} protected function initApplication() - { +{ Prado::setPathOfAlias('Application',$this->_basePath); if($this->_configFile===null) - { - $this->getRequest()->setAvailableServices(array(self::PAGE_SERVICE_ID)); - $this->_service=$this->getPageService(); - return; - } +{ +$this->getRequest()->setAvailableServices(array(self::PAGE_SERVICE_ID)); +$this->_service=$this->getPageService(); +return; +} if($this->_cacheFile===null || @filemtime($this->_cacheFile)<filemtime($this->_configFile)) - { - $config=new TApplicationConfiguration; - $config->loadFromFile($this->_configFile); - if($this->_cacheFile!==null) - { - if(($fp=fopen($this->_cacheFile,'wb'))!==false) - { - fputs($fp,Prado::serialize($config)); - fclose($fp); - } - else - syslog(LOG_WARNING, 'Prado application config cache file "'.$this->_cacheFile.'" cannot be created.'); - } - } - else - { - $config=Prado::unserialize(file_get_contents($this->_cacheFile)); - } +{ +$config=new TApplicationConfiguration; +$config->loadFromFile($this->_configFile); +if($this->_cacheFile!==null) +{ +if(($fp=fopen($this->_cacheFile,'wb'))!==false) +{ +fputs($fp,Prado::serialize($config)); +fclose($fp); +} +else +syslog(LOG_WARNING, 'Prado application config cache file "'.$this->_cacheFile.'" cannot be created.'); +} +} +else +{ +$config=Prado::unserialize(file_get_contents($this->_cacheFile)); +} foreach($config->getAliases() as $alias=>$path) - Prado::setPathOfAlias($alias,$path); - foreach($config->getUsings() as $using) - Prado::using($using); +Prado::setPathOfAlias($alias,$path); +foreach($config->getUsings() as $using) +Prado::using($using); foreach($config->getProperties() as $name=>$value) - $this->setSubProperty($name,$value); +$this->setSubProperty($name,$value); $this->_parameters=new TMap; - foreach($config->getParameters() as $id=>$parameter) - { - if(is_string($parameter)) - $this->_parameters->add($id,$parameter); - else - { - $component=Prado::createComponent($parameter[0]); - foreach($parameter[1] as $name=>$value) - $component->setSubProperty($name,$value); - $this->_parameters->add($id,$component); - } - } +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); +} $this->_modules=array(); - foreach($config->getModules() as $id=>$moduleConfig) - { +foreach($config->getModules() as $id=>$moduleConfig) +{ $module=Prado::createComponent($moduleConfig[0]); - $this->setModule($id,$module); - foreach($moduleConfig[1] as $name=>$value) - $module->setSubProperty($name,$value); - $module->init($moduleConfig[2]); - } +$this->setModule($id,$module); +foreach($moduleConfig[1] as $name=>$value) +$module->setSubProperty($name,$value); +$module->init($moduleConfig[2]); +} $services=$config->getServices(); - $serviceIDs=array_keys($services); - array_unshift($serviceIDs,self::PAGE_SERVICE_ID); - $request=$this->getRequest(); - $request->setAvailableServices($serviceIDs); +$serviceIDs=array_keys($services); +array_unshift($serviceIDs,self::PAGE_SERVICE_ID); +$request=$this->getRequest(); +$request->setAvailableServices($serviceIDs); if(($serviceID=$request->getServiceID())===null) - $serviceID=self::PAGE_SERVICE_ID; - if(isset($services[$serviceID])) - { - $serviceConfig=$services[$serviceID]; - $service=Prado::createComponent($serviceConfig[0]); - if(!($service instanceof IService)) - throw new THttpException(500,'application_service_unknown',$serviceID); - $this->_service=$service; - foreach($serviceConfig[1] as $name=>$value) - $service->setSubProperty($name,$value); - $service->init($serviceConfig[2]); - } - else - $this->_service=$this->getPageService(); - } +$serviceID=self::PAGE_SERVICE_ID; +if(isset($services[$serviceID])) +{ +$serviceConfig=$services[$serviceID]; +$service=Prado::createComponent($serviceConfig[0]); +if(!($service instanceof IService)) +throw new THttpException(500,'application_service_unknown',$serviceID); +$this->_service=$service; +foreach($serviceConfig[1] as $name=>$value) +$service->setSubProperty($name,$value); +$service->init($serviceConfig[2]); +} +else +$this->_service=$this->getPageService(); +} public function onError($param) - { - if($this->hasEventHandler('OnError')) - $this->raiseEvent('OnError',$this,$param); - else - $this->getErrorHandler()->handleError($this,$param); - } +{ +Prado::log($param->getMessage(),TLogger::ERROR,'System.TApplication'); +$this->getErrorHandler()->handleError($this,$param); +$this->raiseEvent('OnError',$this,$param); +} public function onBeginRequest($param) - { - $this->raiseEvent('OnBeginRequest',$this,$param); - } +{ +$this->raiseEvent('OnBeginRequest',$this,$param); +} public function onAuthentication($param) - { - $this->raiseEvent('OnAuthentication',$this,$param); - } +{ +$this->raiseEvent('OnAuthentication',$this,$param); +} public function onPostAuthentication($param) - { - $this->raiseEvent('OnPostAuthentication',$this,$param); - } +{ +$this->raiseEvent('OnPostAuthentication',$this,$param); +} public function onAuthorization($param) - { - $this->raiseEvent('OnAuthorization',$this,$param); - } +{ +$this->raiseEvent('OnAuthorization',$this,$param); +} public function onPostAuthorization($param) - { - $this->raiseEvent('OnPostAuthorization',$this,$param); - } +{ +$this->raiseEvent('OnPostAuthorization',$this,$param); +} public function onLoadState($param) - { - $this->loadGlobals(); - $this->raiseEvent('OnLoadState',$this,$param); - } +{ +$this->loadGlobals(); +$this->raiseEvent('OnLoadState',$this,$param); +} public function onPostLoadState($param) - { - $this->raiseEvent('OnPostLoadState',$this,$param); - } +{ +$this->raiseEvent('OnPostLoadState',$this,$param); +} public function onPreRunService($param) - { - $this->raiseEvent('OnPreRunService',$this,$param); - } +{ +$this->raiseEvent('OnPreRunService',$this,$param); +} public function onRunService($param) - { - $this->raiseEvent('OnRunService',$this,$param); - if($this->_service) - $this->_service->run(); - } +{ +$this->raiseEvent('OnRunService',$this,$param); +if($this->_service) +$this->_service->run(); +} public function onPostRunService($param) - { - $this->raiseEvent('OnPostRunService',$this,$param); - } +{ +$this->raiseEvent('OnPostRunService',$this,$param); +} public function onSaveState($param) - { - $this->raiseEvent('OnSaveState',$this,$param); - $this->saveGlobals(); - } +{ +$this->raiseEvent('OnSaveState',$this,$param); +$this->saveGlobals(); +} public function onPostSaveState($param) - { - $this->raiseEvent('OnPostSaveState',$this,$param); - } +{ +$this->raiseEvent('OnPostSaveState',$this,$param); +} public function onEndRequest($param) - { - $this->raiseEvent('OnEndRequest',$this,$param); - } +{ +$this->raiseEvent('OnEndRequest',$this,$param); +} } class TApplicationConfiguration extends TComponent { @@ -1899,277 +2115,281 @@ private $_modules=array(); private $_services=array(); private $_parameters=array(); public function loadFromFile($fname) - { - $configPath=dirname($fname); - $dom=new TXmlDocument; - $dom->loadFromFile($fname); +{ +$configPath=dirname($fname); +$dom=new TXmlDocument; +$dom->loadFromFile($fname); foreach($dom->getAttributes() as $name=>$value) - $this->_properties[$name]=$value; +$this->_properties[$name]=$value; if(($pathsNode=$dom->getElementByTagName('paths'))!==null) - { - foreach($pathsNode->getElementsByTagName('alias') as $aliasNode) - { - if(($id=$aliasNode->getAttribute('id'))!==null && ($path=$aliasNode->getAttribute('path'))!==null) - { - $path=str_replace('\\','/',$path); - if(preg_match('/^\\/|.:\\/|.:\\\\/',$path)) $p=realpath($path); - else - $p=realpath($configPath.'/'.$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'); - } - foreach($pathsNode->getElementsByTagName('using') as $usingNode) - { - if(($namespace=$usingNode->getAttribute('namespace'))!==null) - $this->_usings[]=$namespace; - else - throw new TConfigurationException('appconfig_using_invalid'); - } - } +{ +foreach($pathsNode->getElementsByTagName('alias') as $aliasNode) +{ +if(($id=$aliasNode->getAttribute('id'))!==null && ($path=$aliasNode->getAttribute('path'))!==null) +{ +$path=str_replace('\\','/',$path); +if(preg_match('/^\\/|.:\\/|.:\\\\/',$path)) $p=realpath($path); +else +$p=realpath($configPath.'/'.$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'); +} +foreach($pathsNode->getElementsByTagName('using') as $usingNode) +{ +if(($namespace=$usingNode->getAttribute('namespace'))!==null) +$this->_usings[]=$namespace; +else +throw new TConfigurationException('appconfig_using_invalid'); +} +} if(($modulesNode=$dom->getElementByTagName('modules'))!==null) - { - foreach($modulesNode->getElementsByTagName('module') as $node) - { - $properties=$node->getAttributes(); - if(($id=$properties->itemAt('id'))===null) - throw new TConfigurationException('appconfig_moduleid_required'); - if(($type=$properties->remove('class'))===null && isset($this->_modules[$id]) && $this->_modules[$id][2]===null) - $type=$this->_modules[$id][0]; - if($type===null) - throw new TConfigurationException('appconfig_moduletype_required',$id); - $node->setParent(null); - $this->_modules[$id]=array($type,$properties->toArray(),$node); - } - } +{ +foreach($modulesNode->getElementsByTagName('module') as $node) +{ +$properties=$node->getAttributes(); +if(($id=$properties->itemAt('id'))===null) +throw new TConfigurationException('appconfig_moduleid_required'); +if(($type=$properties->remove('class'))===null && isset($this->_modules[$id]) && $this->_modules[$id][2]===null) +$type=$this->_modules[$id][0]; +if($type===null) +throw new TConfigurationException('appconfig_moduletype_required',$id); +$node->setParent(null); +$this->_modules[$id]=array($type,$properties->toArray(),$node); +} +} if(($servicesNode=$dom->getElementByTagName('services'))!==null) - { - foreach($servicesNode->getElementsByTagName('service') as $node) - { - $properties=$node->getAttributes(); - if(($id=$properties->itemAt('id'))===null) - throw new TConfigurationException('appconfig_serviceid_required'); - if(($type=$properties->remove('class'))===null && isset($this->_services[$id]) && $this->_services[$id][2]===null) - $type=$this->_services[$id][0]; - if($type===null) - throw new TConfigurationException('appconfig_servicetype_required',$id); - $node->setParent(null); - $this->_services[$id]=array($type,$properties->toArray(),$node); - } - } +{ +foreach($servicesNode->getElementsByTagName('service') as $node) +{ +$properties=$node->getAttributes(); +if(($id=$properties->itemAt('id'))===null) +throw new TConfigurationException('appconfig_serviceid_required'); +if(($type=$properties->remove('class'))===null && isset($this->_services[$id]) && $this->_services[$id][2]===null) +$type=$this->_services[$id][0]; +if($type===null) +throw new TConfigurationException('appconfig_servicetype_required',$id); +$node->setParent(null); +$this->_services[$id]=array($type,$properties->toArray(),$node); +} +} if(($parametersNode=$dom->getElementByTagName('parameters'))!==null) - { - foreach($parametersNode->getElementsByTagName('parameter') as $node) - { - $properties=$node->getAttributes(); - if(($id=$properties->remove('id'))===null) - throw new TConfigurationException('appconfig_parameterid_required'); - if(($type=$properties->remove('class'))===null) - $this->_parameters[$id]=$node->getValue(); - else - $this->_parameters[$id]=array($type,$properties->toArray()); - } - } - } +{ +foreach($parametersNode->getElementsByTagName('parameter') as $node) +{ +$properties=$node->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]=$node; +else +$this->_parameters[$id]=$value; +} +else +$this->_parameters[$id]=array($type,$properties->toArray()); +} +} +} public function getProperties() - { - return $this->_properties; - } +{ +return $this->_properties; +} public function getAliases() - { - return $this->_aliases; - } +{ +return $this->_aliases; +} public function getUsings() - { - return $this->_usings; - } +{ +return $this->_usings; +} public function getModules() - { - return $this->_modules; - } +{ +return $this->_modules; +} public function getServices() - { - return $this->_services; - } +{ +return $this->_services; +} public function getParameters() - { - return $this->_parameters; - } +{ +return $this->_parameters; +} } class TApplicationStatePersister extends TModule implements IStatePersister { const CACHE_NAME='prado:appstate'; public function init($config) - { - $this->getApplication()->setApplicationStatePersister($this); - } +{ +$this->getApplication()->setApplicationStatePersister($this); +} protected function getStateFilePath() - { - return $this->getApplication()->getRuntimePath().'/global.cache'; - } +{ +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; - } - } +{ +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(); - if(version_compare(phpversion(),'5.1.0','>=')) - file_put_contents($fileName,$content,LOCK_EX); - else - file_put_contents($fileName,$content); - } - } -} -?><?php -class TErrorHandler extends TModule +{ +$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(); +if(version_compare(phpversion(),'5.1.0','>=')) +file_put_contents($fileName,$content,LOCK_EX); +else +file_put_contents($fileName,$content); +} +} +} + +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() - { - return $this->_templatePath; - } -public function setErrorTemplatePath($value) - { - if(($templatePath=Prado::getPathOfNamespace($this->_templatePath))!==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()===TApplication::STATE_DEBUG) - $this->displayException($param); - else - $this->handleExternalError(500,$param); - } - exit(1); - } -protected function handleExternalError($statusCode,$exception) - { - if(!($exception instanceof THttpException)) - error_log($exception->__toString()); - if($this->_templatePath===null) - $this->_templatePath=Prado::getFrameworkPath().'/Exceptions/templates'; - $base=$this->_templatePath.'/'.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'."); -$serverAdmin=isset($_SERVER['SERVER_ADMIN'])?$_SERVER['SERVER_ADMIN']:''; - $tokens=array( - '%%StatusCode%%' => "$statusCode", - '%%ErrorMessage%%' => htmlspecialchars($exception->getMessage()), - '%%ServerAdmin%%' => $serverAdmin, - '%%Version%%' => $_SERVER['SERVER_SOFTWARE'].' <a href="http://www.pradosoft.com/">PRADO</a>/'.Prado::getVersion(), - '%%Time%%' => @strftime('%Y-%m-%d %H:%M',time()) - ); - echo strtr($content,$tokens); - } -protected function handleRecursiveError($exception) - { - if($this->getApplication()->getMode()===TApplication::STATE_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".$param->__toString()); - header('HTTP/1.0 500 Internal Error'); - } - } -protected function displayException($exception) - { - $lines=file($exception->getFile()); - $errorLine=$exception->getLine(); - $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-1;$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]))); - } -$tokens=array( - '%%ErrorType%%' => get_class($exception), - '%%ErrorMessage%%' => htmlspecialchars($exception->getMessage()), - '%%SourceFile%%' => htmlspecialchars($exception->getFile()).' ('.$exception->getLine().')', - '%%SourceCode%%' => $source, - '%%StackTrace%%' => htmlspecialchars($exception->getTraceAsString()), - '%%Version%%' => $_SERVER['SERVER_SOFTWARE'].' <a href="http://www.pradosoft.com/">PRADO</a>/'.Prado::getVersion(), - '%%Time%%' => @strftime('%Y-%m-%d %H:%M',time()) - ); - $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'."); - echo strtr($content,$tokens); - } -} -?><?php -class THttpRequest extends TModule +public function init($config)
+{
+$this->getApplication()->setErrorHandler($this);
+} +public function getErrorTemplatePath()
+{
+return $this->_templatePath;
+} +public function setErrorTemplatePath($value)
+{
+if(($templatePath=Prado::getPathOfNamespace($this->_templatePath))!==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()===TApplication::STATE_DEBUG)
+$this->displayException($param);
+else
+$this->handleExternalError(500,$param);
+}
+} +protected function handleExternalError($statusCode,$exception)
+{
+if(!($exception instanceof THttpException))
+error_log($exception->__toString());
+if($this->_templatePath===null)
+$this->_templatePath=Prado::getFrameworkPath().'/Exceptions/templates';
+$base=$this->_templatePath.'/'.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'."); +$serverAdmin=isset($_SERVER['SERVER_ADMIN'])?$_SERVER['SERVER_ADMIN']:'';
+$tokens=array(
+'%%StatusCode%%' => "$statusCode",
+'%%ErrorMessage%%' => htmlspecialchars($exception->getMessage()),
+'%%ServerAdmin%%' => $serverAdmin,
+'%%Version%%' => $_SERVER['SERVER_SOFTWARE'].' <a href="http://www.pradosoft.com/">PRADO</a>/'.Prado::getVersion(),
+'%%Time%%' => @strftime('%Y-%m-%d %H:%M',time())
+);
+echo strtr($content,$tokens);
+} +protected function handleRecursiveError($exception)
+{
+if($this->getApplication()->getMode()===TApplication::STATE_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".$param->__toString());
+header('HTTP/1.0 500 Internal Error');
+}
+} +protected function displayException($exception)
+{
+$lines=file($exception->getFile());
+$errorLine=$exception->getLine();
+$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-1;$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])));
+} +$tokens=array(
+'%%ErrorType%%' => get_class($exception),
+'%%ErrorMessage%%' => htmlspecialchars($exception->getMessage()),
+'%%SourceFile%%' => htmlspecialchars($exception->getFile()).' ('.$exception->getLine().')',
+'%%SourceCode%%' => $source,
+'%%StackTrace%%' => htmlspecialchars($exception->getTraceAsString()),
+'%%Version%%' => $_SERVER['SERVER_SOFTWARE'].' <a href="http://www.pradosoft.com/">PRADO</a>/'.Prado::getVersion(),
+'%%Time%%' => @strftime('%Y-%m-%d %H:%M',time())
+);
+$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'.");
+echo strtr($content,$tokens);
+}
+} + +class THttpRequest extends TMap implements IModule
{ const SERVICE_VAR='sp'; private $_initialized=false; @@ -2178,236 +2398,240 @@ private $_serviceParam=null; private $_cookies=null; private $_requestUri; private $_pathInfo; -private $_items; -private $_services; - private $_requestResolved=false; -public function init($config) - { - 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) - $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->_items=new TMap(array_merge($_POST,$_GET)); -$this->_initialized=true; - $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 getRequestType() - { - return $_SERVER['REQUEST_METHOD']; - } -public function getIsSecureConnection() - { - return !empty($_SERVER['HTTPS']); - } -public function getPathInfo() - { - return $this->_pathInfo; - } -public function getQueryString() - { - return isset($_SERVER['QUERY_STRING'])?$_SERVER['QUERY_STRING']:''; - } -public function getRequestUri() - { - return $this->_requestUri; - } -public function getApplicationPath() - { - return $_SERVER['SCRIPT_NAME']; - } -public function getPhysicalApplicationPath() - { - 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() - { - return get_browser(); - } -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 getItems() - { - return $this->_items; - } -public function getParameters() - { - return $this->_items; - } -public function getCookies() - { - if($this->_cookies===null) - { - $this->_cookies=new THttpCookieCollection; - 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=false) - { - $url=$this->getApplicationPath(); - $url.='?'.$serviceID.'='; - if(!empty($serviceParam)) - $url.=$serviceParam; - $amp=$encodeAmpersand?'&':'&'; - if(is_array($getItems) || $getItems instanceof Traversable) - { - foreach($getItems as $name=>$value) - $url.=$amp.urlencode($name).'='.urlencode($value); - } - if(defined('SID') && SID != '') - $url.=$amp.SID; - return $url; - } -protected function resolveRequest() - { +private $_services;
+private $_requestResolved=false; +private $_id; +public function getID()
+{
+return $this->_id;
+} +public function setID($value)
+{
+$this->_id=$value;
+} +public function init($config)
+{
+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)
+$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->copyFrom(array_merge($_GET,$_POST)); +$this->_initialized=true;
+$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 getRequestType()
+{
+return $_SERVER['REQUEST_METHOD'];
+} +public function getIsSecureConnection()
+{
+return !empty($_SERVER['HTTPS']);
+} +public function getPathInfo()
+{
+return $this->_pathInfo;
+} +public function getQueryString()
+{
+return isset($_SERVER['QUERY_STRING'])?$_SERVER['QUERY_STRING']:'';
+} +public function getRequestUri()
+{
+return $this->_requestUri;
+} +public function getApplicationPath()
+{
+return $_SERVER['SCRIPT_NAME'];
+} +public function getPhysicalApplicationPath()
+{
+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()
+{
+return get_browser();
+} +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 getCookies()
+{
+if($this->_cookies===null)
+{
+$this->_cookies=new THttpCookieCollection;
+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=false)
+{
+$url=$this->getApplicationPath();
+$url.='?'.$serviceID.'=';
+if(!empty($serviceParam))
+$url.=$serviceParam;
+$amp=$encodeAmpersand?'&':'&';
+if(is_array($getItems) || $getItems instanceof Traversable)
+{
+foreach($getItems as $name=>$value)
+$url.=$amp.urlencode($name).'='.urlencode($value);
+}
+if(defined('SID') && SID != '')
+$url.=$amp.SID;
+return $url;
+} +protected function resolveRequest()
+{
- $this->_requestResolved=true; - foreach($this->_services as $id) - { - if(isset($_GET[$id])) - { - $this->setServiceID($id); - $this->setServiceParameter($_GET[$id]); - break; - } - } - } -public function getAvailableServices() - { - return $this->_services; - } -public function setAvailableServices($services) - { - $this->_services=$services; - } -public function getServiceID() - { - if(!$this->_requestResolved) - $this->resolveRequest(); - return $this->_serviceID; - } -protected function setServiceID($value) - { - $this->_serviceID=$value; - } -public function getServiceParameter() - { - if(!$this->_requestResolved) - $this->resolveRequest(); - return $this->_serviceParam; - } -protected function setServiceParameter($value) - { - $this->_serviceParam=$value; - } -} -class THttpCookieCollection extends TList +$this->_requestResolved=true;
+foreach($this->_services as $id)
+{
+if(isset($_GET[$id]))
+{
+$this->setServiceID($id);
+$this->setServiceParameter($_GET[$id]);
+break;
+}
+}
+} +public function getAvailableServices()
+{
+return $this->_services;
+} +public function setAvailableServices($services)
+{
+$this->_services=$services;
+} +public function getServiceID()
+{
+if(!$this->_requestResolved)
+$this->resolveRequest();
+return $this->_serviceID;
+} +protected function setServiceID($value)
+{
+$this->_serviceID=$value;
+} +public function getServiceParameter()
+{
+if(!$this->_requestResolved)
+$this->resolveRequest();
+return $this->_serviceParam;
+} +protected function setServiceParameter($value)
+{
+$this->_serviceParam=$value;
+}
+} +class THttpCookieCollection extends TList
{ private $_o; -public function __construct($owner=null) - { - parent::__construct(); - $this->_o=$owner; - } -protected function addedItem($item) - { - if($this->_o instanceof THttpResponse) - $this->_o->addCookie($item); - } -protected function removedItem($item) - { - if($this->_o instanceof THttpResponse) - $this->_o->removeCookie($item); - } -protected function canAddItem($item) - { - return ($item instanceof THttpCookie); - } -} -class THttpCookie extends TComponent +public function __construct($owner=null)
+{
+parent::__construct();
+$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('authorizationrulecollection_authorizationrule_required');
+} +public function removeAt($index)
+{
+$item=parent::removeAt($index);
+if($this->_o instanceof THttpResponse)
+$this->_o->removeCookie($item);
+return $item;
+}
+} +class THttpCookie extends TComponent
{ private $_domain=''; private $_name; @@ -2415,73 +2639,73 @@ private $_value=0; private $_expire=0; private $_path='/'; private $_secure=false; -public function __construct($name,$value) - { - parent::__construct(); - $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 - ); +public function __construct($name,$value)
+{
+parent::__construct();
+$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; @@ -2491,65 +2715,65 @@ private $_path; private $_query; private $_fragment; private $_uri; -public function __construct($uri) - { - parent::__construct(); - if(($ret=@parse_url($uri))!==false) - { - $this->_scheme=$ret['scheme']; - $this->_host=$ret['host']; - $this->_port=$ret['port']; - $this->_user=$ret['user']; - $this->_pass=$ret['pass']; - $this->_path=$ret['path']; - $this->_query=$ret['query']; - $this->_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; - } -} -?><?php -class THttpResponse extends TModule implements ITextWriter +public function __construct($uri)
+{
+parent::__construct();
+if(($ret=@parse_url($uri))!==false)
+{
+$this->_scheme=$ret['scheme'];
+$this->_host=$ret['host'];
+$this->_port=$ret['port'];
+$this->_user=$ret['user'];
+$this->_pass=$ret['pass'];
+$this->_path=$ret['path'];
+$this->_query=$ret['query'];
+$this->_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 THttpResponse extends TModule implements ITextWriter
{ private $_bufferOutput=true; private $_initialized=false; @@ -2558,429 +2782,506 @@ private $_status=200; private $_htmlWriterType='System.Web.UI.THtmlWriter'; private $_contentType='text/html'; private $_charset; -public function __destruct() - { - if($this->_bufferOutput) - @ob_end_flush(); - parent::__destruct(); - } -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) - { - $this->_status=TPropertyValue::ensureInteger($status); - } -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) - { - static $defaultMimeTypes=array( - 'css'=>'text/css', - 'gif'=>'image/gif', - 'jpg'=>'image/jpeg', - 'jpeg'=>'image/jpeg', - 'htm'=>'text/html', - 'html'=>'text/html', - 'js'=>'javascript/js' - ); -if(!is_file($fileName)) - throw new TInvalidDataValueException('httpresponse_file_inexistent',$fileName); - header('Pragma: public'); - header('Expires: 0'); - header('Cache-Component: must-revalidate, post-check=0, pre-check=0'); - $mimeType='text/plain'; - if(function_exists('mime_content_type')) - $mimeType=mime_content_type($fileName); - else - { - $ext=array_pop(explode('.',$fileName)); - if(isset($defaultMimeTypes[$ext])) - $mimeType=$defaultMimeTypes[$ext]; - } - $fn=basename($fileName); - header("Content-type: $mimeType"); - header('Content-Length: '.filesize($fileName)); - header("Content-Disposition: attachment; filename=\"$fn\""); - header('Content-Transfer-Encoding: binary'); - readfile($fileName); - } -public function redirect($url) - { - header('Location:'.$url); - exit(); - } -public function flush() - { - $header = $this->getContentTypeHeader(); - $this->appendHeader($header); - if($this->_bufferOutput) - ob_flush(); +public function __destruct()
+{
+if($this->_bufferOutput)
+@ob_end_flush();
+parent::__destruct();
+} +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)
+{
+$this->_status=TPropertyValue::ensureInteger($status);
+} +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)
+{
+static $defaultMimeTypes=array(
+'css'=>'text/css',
+'gif'=>'image/gif',
+'jpg'=>'image/jpeg',
+'jpeg'=>'image/jpeg',
+'htm'=>'text/html',
+'html'=>'text/html',
+'js'=>'javascript/js'
+); +if(!is_file($fileName))
+throw new TInvalidDataValueException('httpresponse_file_inexistent',$fileName);
+header('Pragma: public');
+header('Expires: 0');
+header('Cache-Component: must-revalidate, post-check=0, pre-check=0');
+$mimeType='text/plain';
+if(function_exists('mime_content_type'))
+$mimeType=mime_content_type($fileName);
+else
+{
+$ext=array_pop(explode('.',$fileName));
+if(isset($defaultMimeTypes[$ext]))
+$mimeType=$defaultMimeTypes[$ext];
+}
+$fn=basename($fileName);
+header("Content-type: $mimeType");
+header('Content-Length: '.filesize($fileName));
+header("Content-Disposition: attachment; filename=\"$fn\"");
+header('Content-Transfer-Encoding: binary');
+readfile($fileName);
+} +public function redirect($url)
+{
+header('Location:'.$url);
+exit();
+} +public function flush()
+{
+$header = $this->getContentTypeHeader();
+$this->appendHeader($header);
+if($this->_bufferOutput)
+ob_flush();
- } -protected function getContentTypeHeader() - { - $app = $this->getApplication()->getGlobalization(); - $charset = $this->getCharset(); - if(empty($charset)) - $charset = !is_null($app) ? $app->getCharset() : 'UTF-8'; - $type = $this->getContentType(); - return "Content-Type: $type; charset=$charset"; - } -public function clear() - { - if($this->_bufferOutput) - ob_clean(); +} +protected function getContentTypeHeader()
+{
+$app = $this->getApplication()->getGlobalization();
+$charset = $this->getCharset();
+if(empty($charset))
+$charset = !is_null($app) ? $app->getCharset() : 'UTF-8';
+$type = $this->getContentType();
+return "Content-Type: $type; charset=$charset";
+} +public function clear()
+{
+if($this->_bufferOutput)
+ob_clean();
+ +} +public function appendHeader($value)
+{
+header($value);
+} +public function sendContentTypeHeader($type=null)
+{ +} +public function appendLog($message,$messageType=0,$destination='',$extraHeaders='')
+{
+error_log($message,$messageType,$destination,$extraHeaders);
+} +public function addCookie($cookie)
+{
+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->_htmlWriterType;
+return Prado::createComponent($type,$this);
+}
+} - } -public function appendHeader($value) - { - header($value); - } -public function sendContentTypeHeader($type=null) - { -} -public function appendLog($message,$messageType=0,$destination='',$extraHeaders='') - { - error_log($message,$messageType,$destination,$extraHeaders); - } -public function addCookie($cookie) - { - 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->_htmlWriterType; - return Prado::createComponent($type,$this); - } -} -?><?php -class THttpSession extends TModule -{ -private $_items; +class THttpSession extends TComponent implements IteratorAggregate,ArrayAccess,IModule
+{ private $_initialized=false; private $_started=false; private $_autoStart=false; private $_cookie=null; -public function init($config) - { - if($this->_autoStart) - session_start(); - $this->_initialized=true; - $this->getApplication()->setSession($this); - } -public function open() - { - if(!$this->_started) - { - if($this->_cookie!==null) - session_set_cookie_params($this->_cookie->getExpire(),$this->_cookie->getPath(),$this->_cookie->getDomain(),$this->_cookie->getSecure()); - 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 getItems() - { - if($this->_items===null) - $this->_items=new THttpSessionCollection($_SESSION); - return $this->_items; - } -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',$name); - } -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 getStorage() - { - switch(session_module_name()) - { - case 'files': return 'File'; - case 'mm': return 'SharedMemory'; - case 'user': return 'Custom'; - default: return 'Unknown'; - } - } -public function setStorage($value) - { - if($this->_started) - throw new TInvalidOperationException('httpsession_storage_unchangeable'); - else - { - $value=TPropertyValue::ensureEnum($value,array('File','SharedMemory','Custom')); - if($value==='Custom') - session_set_save_handler(array($this,'_open'),array($this,'_close'),array($this,'_read'),array($this,'_write'),array($this,'_destroy'),array($this,'_gc')); - switch($value) - { - case 'Custom': - session_module_name('user'); - break; - case 'SharedMemory': - session_module_name('mm'); - break; - default: - session_module_name('files'); - break; - } - } - } -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 'None'; - else if(ini_get('session.use_only_cookies')==='0') - return 'Allow'; - else - return 'Only'; - } -public function setCookieMode($value) - { - if($this->_started) - throw new TInvalidOperationException('httpsession_cookiemode_unchangeable'); - else - { - $value=TPropertyValue::ensureEnum($value,array('None','Allow','Only')); - if($value==='None') - ini_set('session.use_cookies','0'); - else if($value==='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_only_cookies',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; - } -} -class THttpSessionCollection extends TMap +private $_id; +public function getID()
+{
+return $this->_id;
+} +public function setID($value)
+{
+$this->_id=$value;
+} +public function init($config)
+{
+if($this->_autoStart)
+session_start();
+$this->_initialized=true;
+$this->getApplication()->setSession($this);
+} +public function open()
+{
+if(!$this->_started)
+{
+if($this->_cookie!==null)
+session_set_cookie_params($this->_cookie->getExpire(),$this->_cookie->getPath(),$this->_cookie->getDomain(),$this->_cookie->getSecure());
+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',$name);
+} +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 getStorage()
+{
+switch(session_module_name())
+{
+case 'files': return 'File';
+case 'mm': return 'SharedMemory';
+case 'user': return 'Custom';
+default: return 'Unknown';
+}
+} +public function setStorage($value)
+{
+if($this->_started)
+throw new TInvalidOperationException('httpsession_storage_unchangeable');
+else
+{
+$value=TPropertyValue::ensureEnum($value,array('File','SharedMemory','Custom'));
+if($value==='Custom')
+session_set_save_handler(array($this,'_open'),array($this,'_close'),array($this,'_read'),array($this,'_write'),array($this,'_destroy'),array($this,'_gc'));
+switch($value)
+{
+case 'Custom':
+session_module_name('user');
+break;
+case 'SharedMemory':
+session_module_name('mm');
+break;
+default:
+session_module_name('files');
+break;
+}
+}
+} +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 'None';
+else if(ini_get('session.use_only_cookies')==='0')
+return 'Allow';
+else
+return 'Only';
+} +public function setCookieMode($value)
+{
+if($this->_started)
+throw new TInvalidOperationException('httpsession_cookiemode_unchangeable');
+else
+{
+$value=TPropertyValue::ensureEnum($value,array('None','Allow','Only'));
+if($value==='None')
+ini_set('session.use_cookies','0');
+else if($value==='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_only_cookies',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 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 $_initialized=false; -public function __construct($data=null) - { - parent::__construct($data); - $this->_initialized=true; - } -protected function addedItem($key,$value) - { - if($this->_initialized) - $_SESSION[$key]=$value; - } -protected function removedItem($key,$value) - { - unset($_SESSION[$key]); - } -} -?><?php -class TAuthorizationRule extends TComponent +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 TAuthorizationRule extends TComponent
{ private $_action; private $_users; @@ -2988,110 +3289,108 @@ private $_roles; private $_verb; private $_everyone; private $_guest; -public function __construct($action,$users,$roles,$verb='') - { - parent::__construct(); - $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->_everyone=false; - $this->_guest=false; - foreach(explode(',',$users) as $user) - { - if(($user=trim(strtolower($user)))!=='') - { - if($user==='*') - $this->_everyone=true; - else if($user==='?') - $this->_guest=true; - else - $this->_users[]=$user; - } - } - foreach(explode(',',$roles) as $role) - { - if(($role=trim(strtolower($role)))!=='') - $this->_roles[]=$role; - } - $verb=trim(strtolower($verb)); - if($verb==='' || $verb==='get' || $verb==='post') - $this->_verb=$verb; - else - throw new TInvalidDataValueException('authorizationrule_verb_invalid',$verb); - } -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 getGuestApplied() - { - return $this->_guest; - } -public function getEveryoneApplied() - { - return $this->_everyone; - } -public function isUserAllowed(IUser $user,$verb) - { - $decision=($this->_action==='allow')?1:-1; - if($this->_verb==='' || strcasecmp($verb,$this->_verb)===0) - { - if($this->_everyone || ($this->_guest && $user->getIsGuest())) - return $decision; - if(in_array(strtolower($user->getName()),$this->_users)) - return $decision; - foreach($this->_roles as $role) - if($user->isInRole($role)) - return $decision; - } - return 0; - } -} -class TAuthorizationRuleCollection extends TList -{ -public function isUserAllowed($user,$verb) - { - if($user instanceof IUser) - { - $verb=strtolower(trim($verb)); - foreach($this as $rule) - { - if(($decision=$rule->isUserAllowed($user,$verb))!==0) - return ($decision>0); - } - return true; - } - else - return false; - } -protected function canAddItem($item) - { - return ($item instanceof TAuthorizationRule); - } -} -?><?php - - - - +public function __construct($action,$users,$roles,$verb='')
+{
+parent::__construct();
+$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->_everyone=false;
+$this->_guest=false;
+foreach(explode(',',$users) as $user)
+{
+if(($user=trim(strtolower($user)))!=='')
+{
+if($user==='*')
+$this->_everyone=true;
+else if($user==='?')
+$this->_guest=true;
+else
+$this->_users[]=$user;
+}
+}
+foreach(explode(',',$roles) as $role)
+{
+if(($role=trim(strtolower($role)))!=='')
+$this->_roles[]=$role;
+}
+$verb=trim(strtolower($verb));
+if($verb==='' || $verb==='get' || $verb==='post')
+$this->_verb=$verb;
+else
+throw new TInvalidDataValueException('authorizationrule_verb_invalid',$verb);
+} +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 getGuestApplied()
+{
+return $this->_guest;
+} +public function getEveryoneApplied()
+{
+return $this->_everyone;
+} +public function isUserAllowed(IUser $user,$verb)
+{
+$decision=($this->_action==='allow')?1:-1;
+if($this->_verb==='' || strcasecmp($verb,$this->_verb)===0)
+{
+if($this->_everyone || ($this->_guest && $user->getIsGuest()))
+return $decision;
+if(in_array(strtolower($user->getName()),$this->_users))
+return $decision;
+foreach($this->_roles as $role)
+if($user->isInRole($role))
+return $decision;
+}
+return 0;
+}
+} +class TAuthorizationRuleCollection extends TList
+{ +public function isUserAllowed($user,$verb)
+{
+if($user instanceof IUser)
+{
+$verb=strtolower(trim($verb));
+foreach($this as $rule)
+{
+if(($decision=$rule->isUserAllowed($user,$verb))!==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 TPageService extends TService +class TPageService extends TService
{ const CONFIG_FILE='config.xml'; const DEFAULT_BASEPATH='pages'; @@ -3108,236 +3407,238 @@ private $_assetManager=null; private $_themeManager=null; private $_templateManager=null; private $_pageStatePersister=null; -public function init($config) - { +public function init($config)
+{
- $application=$this->getApplication(); +$application=$this->getApplication(); $application->setPageService($this); -if($this->_basePath===null) - { - $basePath=$application->getBasePath().'/'.self::DEFAULT_BASEPATH; - if(($this->_basePath=realpath($basePath))===false || !is_dir($this->_basePath)) - throw new TConfigurationException('pageservice_basepath_invalid',$basePath); - } -$this->_pagePath=$application->getRequest()->getServiceParameter(); - if(empty($this->_pagePath)) - $this->_pagePath=$this->_defaultPage; - if(empty($this->_pagePath)) - throw new THttpException(404,'pageservice_page_required'); -if(($cache=$application->getCache())===null) - { - $pageConfig=new TPageConfiguration; - if($config!==null) - $pageConfig->loadXmlElement($config,$application->getBasePath(),null); - $pageConfig->loadConfigurationFiles($this->_pagePath,$this->_basePath); - } - else - { - $configCached=true; - $currentTimestamp=array(); - $arr=$cache->get(self::CONFIG_CACHE_PREFIX.$this->_pagePath); - if(is_array($arr)) - { - list($pageConfig,$timestamps)=$arr; - if($application->getMode()!==TApplication::STATE_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('.',$this->_pagePath); - array_pop($paths); - $configPath=$this->_basePath; - foreach($paths as $path) - { - $configFile=$configPath.'/'.self::CONFIG_FILE; - $currentTimestamp[$configFile]=@filemtime($configFile); - $configPath.='/'.$path; - } - $appConfigFile=$application->getConfigurationFile(); - $currentTimestamp[0]=$appConfigFile===null?0:@filemtime($appConfigFile); - } - if(!$configCached) - { - $pageConfig=new TPageConfiguration; - if($config!==null) - $pageConfig->loadXmlElement($config,$application->getBasePath(),null); - $pageConfig->loadConfigurationFiles($this->_pagePath,$this->_basePath); - $cache->set(self::CONFIG_CACHE_PREFIX.$this->_pagePath,array($pageConfig,$currentTimestamp)); - } - } -foreach($pageConfig->getAliases() as $alias=>$path) - Prado::setPathOfAlias($alias,$path); - foreach($pageConfig->getUsings() as $using) - Prado::using($using); +if($this->_basePath===null)
+{
+$basePath=$application->getBasePath().'/'.self::DEFAULT_BASEPATH;
+if(($this->_basePath=realpath($basePath))===false || !is_dir($this->_basePath))
+throw new TConfigurationException('pageservice_basepath_invalid',$basePath);
+} +$this->_pagePath=$application->getRequest()->getServiceParameter();
+if(empty($this->_pagePath))
+$this->_pagePath=$this->_defaultPage;
+if(empty($this->_pagePath))
+throw new THttpException(404,'pageservice_page_required'); +if(($cache=$application->getCache())===null)
+{
+$pageConfig=new TPageConfiguration;
+if($config!==null)
+$pageConfig->loadXmlElement($config,$application->getBasePath(),null);
+$pageConfig->loadConfigurationFiles($this->_pagePath,$this->_basePath);
+}
+else
+{
+$configCached=true;
+$currentTimestamp=array();
+$arr=$cache->get(self::CONFIG_CACHE_PREFIX.$this->_pagePath);
+if(is_array($arr))
+{
+list($pageConfig,$timestamps)=$arr;
+if($application->getMode()!==TApplication::STATE_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('.',$this->_pagePath);
+array_pop($paths);
+$configPath=$this->_basePath;
+foreach($paths as $path)
+{
+$configFile=$configPath.'/'.self::CONFIG_FILE;
+$currentTimestamp[$configFile]=@filemtime($configFile);
+$configPath.='/'.$path;
+}
+$appConfigFile=$application->getConfigurationFile();
+$currentTimestamp[0]=$appConfigFile===null?0:@filemtime($appConfigFile);
+}
+if(!$configCached)
+{
+$pageConfig=new TPageConfiguration;
+if($config!==null)
+$pageConfig->loadXmlElement($config,$application->getBasePath(),null);
+$pageConfig->loadConfigurationFiles($this->_pagePath,$this->_basePath);
+$cache->set(self::CONFIG_CACHE_PREFIX.$this->_pagePath,array($pageConfig,$currentTimestamp));
+}
+} +foreach($pageConfig->getAliases() as $alias=>$path)
+Prado::setPathOfAlias($alias,$path);
+foreach($pageConfig->getUsings() as $using)
+Prado::using($using); $this->_properties=$pageConfig->getProperties(); -$parameters=$application->getParameters(); - foreach($pageConfig->getParameters() as $id=>$parameter) - { - if(is_string($parameter)) - $parameters->add($id,$parameter); - else - { - $component=Prado::createComponent($parameter[0]); - foreach($parameter[1] as $name=>$value) - $component->setSubProperty($name,$value); - $parameters->add($id,$component); - } - } -foreach($pageConfig->getModules() as $id=>$moduleConfig) - { +$parameters=$application->getParameters();
+foreach($pageConfig->getParameters() as $id=>$parameter)
+{
+if(is_string($parameter))
+$parameters->add($id,$parameter);
+else
+{
+$component=Prado::createComponent($parameter[0]);
+foreach($parameter[1] as $name=>$value)
+$component->setSubProperty($name,$value);
+$parameters->add($id,$component);
+}
+} +foreach($pageConfig->getModules() as $id=>$moduleConfig)
+{
- $module=Prado::createComponent($moduleConfig[0]); - $application->setModule($id,$module); - foreach($moduleConfig[1] as $name=>$value) - $module->setSubProperty($name,$value); - $module->init($moduleConfig[2]); - } +$module=Prado::createComponent($moduleConfig[0]);
+$application->setModule($id,$module);
+foreach($moduleConfig[1] as $name=>$value)
+$module->setSubProperty($name,$value);
+$module->init($moduleConfig[2]);
+} $application->getAuthorizationRules()->mergeWith($pageConfig->getRules()); -$this->_initialized=true; - } -public function getID() - { - return $this->_id; - } -public function setID($value) - { - $this->_id=$value; - } -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 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 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 getPageStatePersister() - { - if(!$this->_pageStatePersister) - { - $this->_pageStatePersister=new TPageStatePersister; - $this->_pageStatePersister->init(null); - } - return $this->_pageStatePersister; - } -public function setPageStatePersister(IStatePersister $value) - { - $this->_pageStatePersister=$value; - } -public function getRequestedPagePath() - { - 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 getBasePath() - { - return $this->_basePath; - } -public function setBasePath($value) - { - if($this->_initialized) - throw new TInvalidOperationException('pageservice_basepath_unchangeable'); - else if(($this->_basePath=realpath(Prado::getPathOfNamespace($value)))===false || !is_dir($this->_basePath)) - throw new TConfigurationException('pageservice_basepath_invalid',$value); - } -public function run() - { +$this->_initialized=true;
+} +public function getID()
+{
+return $this->_id;
+} +public function setID($value)
+{
+$this->_id=$value;
+} +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 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 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 getPageStatePersister()
+{
+if(!$this->_pageStatePersister)
+{
+$this->_pageStatePersister=new TPageStatePersister;
+$this->_pageStatePersister->init(null);
+}
+return $this->_pageStatePersister;
+} +public function setPageStatePersister(IStatePersister $value)
+{
+$this->_pageStatePersister=$value;
+} +public function getRequestedPagePath()
+{
+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 getBasePath()
+{
+return $this->_basePath;
+} +public function setBasePath($value)
+{
+if($this->_initialized)
+throw new TInvalidOperationException('pageservice_basepath_unchangeable');
+else if(($this->_basePath=realpath(Prado::getPathOfNamespace($value)))===false || !is_dir($this->_basePath))
+throw new TConfigurationException('pageservice_basepath_invalid',$value);
+} +public function run()
+{
- $page=null; - $path=$this->_basePath.'/'.strtr($this->_pagePath,'.','/'); - if(is_file($path.self::PAGE_FILE_EXT)) - { - if(is_file($path.Prado::CLASS_FILE_EXT)) - { - $className=basename($path); - if(!class_exists($className,false)) - include_once($path.Prado::CLASS_FILE_EXT); - if(!class_exists($className,false)) - throw new TConfigurationException('pageservice_pageclass_unknown',$className); - } - else - $className='TPage'; - $this->_properties['Template']=$this->getTemplateManager()->getTemplateByFileName($path.self::PAGE_FILE_EXT); - $this->_page=new $className($this->_properties); - } - else - throw new THttpException(404,'pageservice_page_unknown',$this->_pagePath); -$writer=$this->getResponse()->createHtmlWriter(); - $this->_page->run($writer); - $writer->flush(); - } -public function constructUrl($pagePath,$getParams=null,$encodeAmpersand=false) - { - return $this->getRequest()->constructUrl($this->_id,$pagePath,$getParams,$encodeAmpersand); - } -public function getAsset($path) - { - return $this->getAssetManager()->publishFilePath($path); - } -} -class TPageConfiguration extends TComponent +$page=null;
+$path=$this->_basePath.'/'.strtr($this->_pagePath,'.','/');
+if(is_file($path.self::PAGE_FILE_EXT))
+{
+if(is_file($path.Prado::CLASS_FILE_EXT))
+{
+$className=basename($path);
+if(!class_exists($className,false))
+include_once($path.Prado::CLASS_FILE_EXT);
+if(!class_exists($className,false))
+throw new TConfigurationException('pageservice_pageclass_unknown',$className);
+}
+else
+$className='TPage'; +$this->_page=new $className(); +foreach($this->_properties as $name=>$value)
+$this->_page->setSubProperty($name,$value); +$this->_page->setTemplate($this->getTemplateManager()->getTemplateByFileName($path.self::PAGE_FILE_EXT));
+}
+else
+throw new THttpException(404,'pageservice_page_unknown',$this->_pagePath); +$writer=$this->getResponse()->createHtmlWriter();
+$this->_page->run($writer);
+$writer->flush();
+} +public function constructUrl($pagePath,$getParams=null,$encodeAmpersand=false)
+{
+return $this->getRequest()->constructUrl($this->_id,$pagePath,$getParams,$encodeAmpersand);
+} +public function getAsset($path)
+{
+return $this->getAssetManager()->publishFilePath($path);
+}
+} +class TPageConfiguration extends TComponent
{ private $_properties=array(); private $_usings=array(); @@ -3345,927 +3646,906 @@ private $_aliases=array(); private $_modules=array(); private $_parameters=array(); private $_rules=array(); -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 getParameters() - { - return $this->_parameters; - } -public function getRules() - { - return $this->_rules; - } -public function loadConfigurationFiles($pagePath,$basePath) - { - $paths=explode('.',$pagePath); - $page=array_pop($paths); - $path=$basePath; - foreach($paths as $p) - { - $this->loadFromFile($path.'/'.TPageService::CONFIG_FILE,null); - $path.='/'.$p; - } - $this->loadFromFile($path.'/'.TPageService::CONFIG_FILE,$page); - $this->_rules=new TAuthorizationRuleCollection($this->_rules); - } -private function loadFromFile($fname,$page) - { +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 getParameters()
+{
+return $this->_parameters;
+} +public function getRules()
+{
+return $this->_rules;
+} +public function loadConfigurationFiles($pagePath,$basePath)
+{
+$paths=explode('.',$pagePath);
+$page=array_pop($paths);
+$path=$basePath;
+foreach($paths as $p)
+{
+$this->loadFromFile($path.'/'.TPageService::CONFIG_FILE,null);
+$path.='/'.$p;
+}
+$this->loadFromFile($path.'/'.TPageService::CONFIG_FILE,$page);
+$this->_rules=new TAuthorizationRuleCollection($this->_rules);
+} +private function loadFromFile($fname,$page)
+{
+ +if(empty($fname) || !is_file($fname))
+return;
+$dom=new TXmlDocument;
+if($dom->loadFromFile($fname))
+$this->loadXmlElement($dom,dirname($fname),$page);
+else
+throw new TConfigurationException('pageserviceconf_file_invalid',$fname);
+} +public function loadXmlElement($dom,$configPath,$page)
+{
+if(($pathsNode=$dom->getElementByTagName('paths'))!==null)
+{
+foreach($pathsNode->getElementsByTagName('alias') as $aliasNode)
+{
+if(($id=$aliasNode->getAttribute('id'))!==null && ($p=$aliasNode->getAttribute('path'))!==null)
+{
+$p=str_replace('\\','/',$p);
+$path=realpath(preg_match('/^\\/|.:\\//',$p)?$p:$configPath.'/'.$p);
+if($path===false || !is_dir($path))
+throw new TConfigurationException('pageserviceconf_aliaspath_invalid',$id,$p,$configPath);
+if(isset($this->_aliases[$id]))
+throw new TConfigurationException('pageserviceconf_alias_redefined',$id,$configPath);
+$this->_aliases[$id]=$path;
+}
+else
+throw new TConfigurationException('pageserviceconf_alias_invalid',$configPath);
+}
+foreach($pathsNode->getElementsByTagName('using') as $usingNode)
+{
+if(($namespace=$usingNode->getAttribute('namespace'))!==null)
+$this->_usings[]=$namespace;
+else
+throw new TConfigurationException('pageserviceconf_using_invalid',$configPath);
+}
+} +if(($modulesNode=$dom->getElementByTagName('modules'))!==null)
+{
+foreach($modulesNode->getElementsByTagName('module') as $node)
+{
+$properties=$node->getAttributes();
+$type=$properties->remove('class');
+if(($id=$properties->itemAt('id'))===null)
+throw new TConfigurationException('pageserviceconf_module_invalid',$configPath);
+if(isset($this->_modules[$id]))
+{
+if($type===null || $type===$this->_modules[$id][0])
+{
+$this->_modules[$id][1]=array_merge($this->_modules[$id][1],$properties->toArray());
+$elements=$this->_modules[$id][2]->getElements();
+foreach($node->getElements() as $element)
+$elements->add($element);
+}
+else
+{
+$node->setParent(null);
+$this->_modules[$id]=array($type,$properties->toArray(),$node);
+}
+}
+else if($type===null)
+throw new TConfigurationException('pageserviceconf_moduletype_required',$id,$configPath);
+else
+{
+$node->setParent(null);
+$this->_modules[$id]=array($type,$properties->toArray(),$node);
+}
+}
+} +if(($parametersNode=$dom->getElementByTagName('parameters'))!==null)
+{
+foreach($parametersNode->getElementsByTagName('parameter') as $node)
+{
+$properties=$node->getAttributes();
+if(($id=$properties->remove('id'))===null)
+throw new TConfigurationException('pageserviceconf_parameter_invalid',$configPath);
+if(($type=$properties->remove('class'))===null)
+$this->_parameters[$id]=$node->getValue();
+else
+$this->_parameters[$id]=array($type,$properties->toArray());
+}
+} +if(($authorizationNode=$dom->getElementByTagName('authorization'))!==null)
+{
+$rules=array();
+foreach($authorizationNode->getElements() as $node)
+{
+$pages=$node->getAttribute('pages');
+$ruleApplies=false;
+if(empty($pages))
+$ruleApplies=true;
+else if($page!==null)
+{
+$ps=explode(',',$pages);
+foreach($ps as $p)
+{
+if($page===trim($p))
+{
+$ruleApplies=true;
+break;
+}
+}
+}
+if($ruleApplies)
+$rules[]=new TAuthorizationRule($node->getTagName(),$node->getAttribute('users'),$node->getAttribute('roles'),$node->getAttribute('verb'));
+}
+$this->_rules=array_merge($rules,$this->_rules);
+} +if(($pagesNode=$dom->getElementByTagName('pages'))!==null)
+{
+$this->_properties=array_merge($this->_properties,$pagesNode->getAttributes()->toArray());
+if($page!==null) {
+foreach($pagesNode->getElementsByTagName('page') as $node)
+{
+$properties=$node->getAttributes();
+if(($id=$properties->itemAt('id'))===null)
+throw new TConfigurationException('pageserviceconf_page_invalid',$configPath);
+if($id===$page)
+$this->_properties=array_merge($this->_properties,$properties->toArray());
+}
+}
+}
+}
+} - if(empty($fname) || !is_file($fname)) - return; - $dom=new TXmlDocument; - if($dom->loadFromFile($fname)) - $this->loadXmlElement($dom,dirname($fname),$page); - else - throw new TConfigurationException('pageserviceconf_file_invalid',$fname); - } -public function loadXmlElement($dom,$configPath,$page) - { - if(($pathsNode=$dom->getElementByTagName('paths'))!==null) - { - foreach($pathsNode->getElementsByTagName('alias') as $aliasNode) - { - if(($id=$aliasNode->getAttribute('id'))!==null && ($p=$aliasNode->getAttribute('path'))!==null) - { - $p=str_replace('\\','/',$p); - $path=realpath(preg_match('/^\\/|.:\\//',$p)?$p:$configPath.'/'.$p); - if($path===false || !is_dir($path)) - throw new TConfigurationException('pageserviceconf_aliaspath_invalid',$id,$p,$configPath); - if(isset($this->_aliases[$id])) - throw new TConfigurationException('pageserviceconf_alias_redefined',$id,$configPath); - $this->_aliases[$id]=$path; - } - else - throw new TConfigurationException('pageserviceconf_alias_invalid',$configPath); - } - foreach($pathsNode->getElementsByTagName('using') as $usingNode) - { - if(($namespace=$usingNode->getAttribute('namespace'))!==null) - $this->_usings[]=$namespace; - else - throw new TConfigurationException('pageserviceconf_using_invalid',$configPath); - } - } -if(($modulesNode=$dom->getElementByTagName('modules'))!==null) - { - foreach($modulesNode->getElementsByTagName('module') as $node) - { - $properties=$node->getAttributes(); - $type=$properties->remove('class'); - if(($id=$properties->itemAt('id'))===null) - throw new TConfigurationException('pageserviceconf_module_invalid',$configPath); - if(isset($this->_modules[$id])) - { - if($type===null || $type===$this->_modules[$id][0]) - { - $this->_modules[$id][1]=array_merge($this->_modules[$id][1],$properties->toArray()); - $elements=$this->_modules[$id][2]->getElements(); - foreach($node->getElements() as $element) - $elements->add($element); - } - else - { - $node->setParent(null); - $this->_modules[$id]=array($type,$properties->toArray(),$node); - } - } - else if($type===null) - throw new TConfigurationException('pageserviceconf_moduletype_required',$id,$configPath); - else - { - $node->setParent(null); - $this->_modules[$id]=array($type,$properties->toArray(),$node); - } - } - } -if(($parametersNode=$dom->getElementByTagName('parameters'))!==null) - { - foreach($parametersNode->getElementsByTagName('parameter') as $node) - { - $properties=$node->getAttributes(); - if(($id=$properties->remove('id'))===null) - throw new TConfigurationException('pageserviceconf_parameter_invalid',$configPath); - if(($type=$properties->remove('class'))===null) - $this->_parameters[$id]=$node->getValue(); - else - $this->_parameters[$id]=array($type,$properties->toArray()); - } - } -if(($authorizationNode=$dom->getElementByTagName('authorization'))!==null) - { - $rules=array(); - foreach($authorizationNode->getElements() as $node) - { - $pages=$node->getAttribute('pages'); - $ruleApplies=false; - if(empty($pages)) - $ruleApplies=true; - else if($page!==null) - { - $ps=explode(',',$pages); - foreach($ps as $p) - { - if($page===trim($p)) - { - $ruleApplies=true; - break; - } - } - } - if($ruleApplies) - $rules[]=new TAuthorizationRule($node->getTagName(),$node->getAttribute('users'),$node->getAttribute('roles'),$node->getAttribute('verb')); - } - $this->_rules=array_merge($rules,$this->_rules); - } -if(($pagesNode=$dom->getElementByTagName('pages'))!==null) - { - $this->_properties=array_merge($this->_properties,$pagesNode->getAttributes()->toArray()); - if($page!==null) { - foreach($pagesNode->getElementsByTagName('page') as $node) - { - $properties=$node->getAttributes(); - if(($id=$properties->itemAt('id'))===null) - throw new TConfigurationException('pageserviceconf_page_invalid',$configPath); - if($id===$page) - $this->_properties=array_merge($this->_properties,$properties->toArray()); - } - } - } - } -} -?><?php -class THtmlWriter extends TComponent implements ITextWriter -{ - const TAG_INLINE=0; - const TAG_NONCLOSING=1; - const TAG_OTHER=2; - const CHAR_NEWLINE="\n"; - const CHAR_TAB="\t"; - private static $_tagTypes=array( - '*'=>2, - 'a'=>0, - 'acronym'=>0, - 'address'=>2, - 'area'=>1, - 'b'=>0, - 'base'=>1, - 'basefont'=>1, - 'bdo'=>0, - 'bgsound'=>1, - 'big'=>0, - 'blockquote'=>2, - 'body'=>2, - 'br'=>2, - 'button'=>0, - 'caption'=>2, - 'center'=>2, - 'cite'=>0, - 'code'=>0, - 'col'=>1, - 'colgroup'=>2, - 'del'=>0, - 'dd'=>0, - 'dfn'=>0, - 'dir'=>2, - 'div'=>2, - 'dl'=>2, - 'dt'=>0, - 'em'=>0, - 'embed'=>1, - 'fieldset'=>2, - 'font'=>0, - 'form'=>2, - 'frame'=>1, - 'frameset'=>2, - 'h1'=>2, - 'h2'=>2, - 'h3'=>2, - 'h4'=>2, - 'h5'=>2, - 'h6'=>2, - 'head'=>2, - 'hr'=>1, - 'html'=>2, - 'i'=>0, - 'iframe'=>2, - 'img'=>1, - 'input'=>1, - 'ins'=>0, - 'isindex'=>1, - 'kbd'=>0, - 'label'=>0, - 'legend'=>2, - 'li'=>0, - 'link'=>1, - 'map'=>2, - 'marquee'=>2, - 'menu'=>2, - 'meta'=>1, - 'nobr'=>0, - 'noframes'=>2, - 'noscript'=>2, - 'object'=>2, - 'ol'=>2, - 'option'=>2, - 'p'=>0, - 'param'=>2, - 'pre'=>2, - 'ruby'=>2, - 'rt'=>2, - 'q'=>0, - 's'=>0, - 'samp'=>0, - 'script'=>2, - 'select'=>2, - 'small'=>2, - 'span'=>0, - 'strike'=>0, - 'strong'=>0, - 'style'=>2, - 'sub'=>0, - 'sup'=>0, - 'table'=>2, - 'tbody'=>2, - 'td'=>0, - 'textarea'=>0, - 'tfoot'=>2, - 'th'=>0, - 'thead'=>2, - 'title'=>2, - 'tr'=>2, - 'tt'=>0, - 'u'=>0, - 'ul'=>2, - 'var'=>0, - 'wbr'=>1, - 'xml'=>2 - ); - private static $_attrEncode=array( - 'abbr'=>true, - 'accesskey'=>true, - 'alt'=>true, - 'axis'=>true, - 'background'=>true, - 'class'=>true, - 'content'=>true, - 'headers'=>true, - 'href'=>true, - 'longdesc'=>true, - 'onclick'=>true, - 'onchange'=>true, - 'src'=>true, - 'title'=>true, - 'value'=>true - ); - private static $_styleEncode=array( - 'background-image'=>true, - 'list-style-image'=>true - ); - private $_attributes=array(); - private $_openTags=array(); - private $_writer=null; - private $_styles=array(); -public function __construct($writer) - { - $this->_writer=$writer; - } -public function isValidFormAttribute($name) - { - return true; - } -public function addAttributes($attrs) - { - foreach($attrs as $name=>$value) - $this->_attributes[$name]=isset(self::$_attrEncode[$name])?THttpUtility::htmlEncode($value):$value; - } -public function addAttribute($name,$value) - { - $this->_attributes[$name]=isset(self::$_attrEncode[$name])?THttpUtility::htmlEncode($value):$value; - } -public function addStyleAttribute($name,$value) - { - $this->_styles[$name]=isset(self::$_styleEncode[$name])?THttpUtility::htmlEncode($value):$value; - } -public function flush() - { - $this->_writer->flush(); - } -public function write($str) - { - $this->_writer->write($str); - } -public function writeLine($str='') - { - $this->_writer->write($str.self::CHAR_NEWLINE); - } -public function writeBreak() - { - $this->_writer->write('<br/>'); - } -public function writeAttribute($name,$value,$encode=false) - { - $this->_writer->write(' '.$name.='"'.($encode?THttpUtility::htmlEncode($value):$value).'"'); - } -public function renderBeginTag($tagName) - { - $tagType=isset(self::$_tagTypes[$tagName])?self::$_tagTypes[$tagName]:self::TAG_OTHER; - $str='<'.$tagName; - foreach($this->_attributes as $name=>$value) - $str.=' '.$name.'="'.$value.'"'; - if(!empty($this->_styles)) - { - $str.=' style="'; - foreach($this->_styles as $name=>$value) - $str.=$name.':'.$value.';'; - $str.='"'; - } - if($tagType===self::TAG_NONCLOSING) - { - $str.=' />'; - array_push($this->_openTags,''); - } - else - { - $str.='>'; - array_push($this->_openTags,$tagName); - } - $this->_writer->write($str); - $this->_attributes=array(); - $this->_styles=array(); - } -public function renderEndTag() - { - if(!empty($this->_openTags) && ($tagName=array_pop($this->_openTags))!=='') - $this->_writer->write('</'.$tagName.'>'); - } -} -?><?php -class TTemplateManager extends TModule +class THtmlWriter extends TComponent implements ITextWriter
+{
+const TAG_INLINE=0;
+const TAG_NONCLOSING=1;
+const TAG_OTHER=2;
+const CHAR_NEWLINE="\n";
+const CHAR_TAB="\t";
+private static $_tagTypes=array(
+'*'=>2,
+'a'=>0,
+'acronym'=>0,
+'address'=>2,
+'area'=>1,
+'b'=>0,
+'base'=>1,
+'basefont'=>1,
+'bdo'=>0,
+'bgsound'=>1,
+'big'=>0,
+'blockquote'=>2,
+'body'=>2,
+'br'=>2,
+'button'=>0,
+'caption'=>2,
+'center'=>2,
+'cite'=>0,
+'code'=>0,
+'col'=>1,
+'colgroup'=>2,
+'del'=>0,
+'dd'=>0,
+'dfn'=>0,
+'dir'=>2,
+'div'=>2,
+'dl'=>2,
+'dt'=>0,
+'em'=>0,
+'embed'=>1,
+'fieldset'=>2,
+'font'=>0,
+'form'=>2,
+'frame'=>1,
+'frameset'=>2,
+'h1'=>2,
+'h2'=>2,
+'h3'=>2,
+'h4'=>2,
+'h5'=>2,
+'h6'=>2,
+'head'=>2,
+'hr'=>1,
+'html'=>2,
+'i'=>0,
+'iframe'=>2,
+'img'=>1,
+'input'=>1,
+'ins'=>0,
+'isindex'=>1,
+'kbd'=>0,
+'label'=>0,
+'legend'=>2,
+'li'=>0,
+'link'=>1,
+'map'=>2,
+'marquee'=>2,
+'menu'=>2,
+'meta'=>1,
+'nobr'=>0,
+'noframes'=>2,
+'noscript'=>2,
+'object'=>2,
+'ol'=>2,
+'option'=>2,
+'p'=>0,
+'param'=>2,
+'pre'=>2,
+'ruby'=>2,
+'rt'=>2,
+'q'=>0,
+'s'=>0,
+'samp'=>0,
+'script'=>2,
+'select'=>2,
+'small'=>2,
+'span'=>0,
+'strike'=>0,
+'strong'=>0,
+'style'=>2,
+'sub'=>0,
+'sup'=>0,
+'table'=>2,
+'tbody'=>2,
+'td'=>0,
+'textarea'=>0,
+'tfoot'=>2,
+'th'=>0,
+'thead'=>2,
+'title'=>2,
+'tr'=>2,
+'tt'=>0,
+'u'=>0,
+'ul'=>2,
+'var'=>0,
+'wbr'=>1,
+'xml'=>2
+);
+private static $_attrEncode=array(
+'abbr'=>true,
+'accesskey'=>true,
+'alt'=>true,
+'axis'=>true,
+'background'=>true,
+'class'=>true,
+'content'=>true,
+'headers'=>true,
+'href'=>true,
+'longdesc'=>true,
+'onclick'=>true,
+'onchange'=>true,
+'src'=>true,
+'title'=>true,
+'value'=>true
+);
+private static $_styleEncode=array(
+'background-image'=>true,
+'list-style-image'=>true
+);
+private $_attributes=array();
+private $_openTags=array();
+private $_writer=null;
+private $_styles=array(); +public function __construct($writer)
+{
+$this->_writer=$writer;
+} +public function isValidFormAttribute($name)
+{
+return true;
+} +public function addAttributes($attrs)
+{
+foreach($attrs as $name=>$value)
+$this->_attributes[$name]=isset(self::$_attrEncode[$name])?THttpUtility::htmlEncode($value):$value;
+} +public function addAttribute($name,$value)
+{
+$this->_attributes[$name]=isset(self::$_attrEncode[$name])?THttpUtility::htmlEncode($value):$value;
+} +public function addStyleAttribute($name,$value)
+{
+$this->_styles[$name]=isset(self::$_styleEncode[$name])?THttpUtility::htmlEncode($value):$value;
+} +public function flush()
+{
+$this->_writer->flush();
+} +public function write($str)
+{
+$this->_writer->write($str);
+} +public function writeLine($str='')
+{
+$this->_writer->write($str.self::CHAR_NEWLINE);
+} +public function writeBreak()
+{
+$this->_writer->write('<br/>');
+} +public function writeAttribute($name,$value,$encode=false)
+{
+$this->_writer->write(' '.$name.='"'.($encode?THttpUtility::htmlEncode($value):$value).'"');
+} +public function renderBeginTag($tagName)
+{
+$tagType=isset(self::$_tagTypes[$tagName])?self::$_tagTypes[$tagName]:self::TAG_OTHER;
+$str='<'.$tagName;
+foreach($this->_attributes as $name=>$value)
+$str.=' '.$name.'="'.$value.'"';
+if(!empty($this->_styles))
+{
+$str.=' style="';
+foreach($this->_styles as $name=>$value)
+$str.=$name.':'.$value.';';
+$str.='"';
+}
+if($tagType===self::TAG_NONCLOSING)
+{
+$str.=' />';
+array_push($this->_openTags,'');
+}
+else
+{
+$str.='>';
+array_push($this->_openTags,$tagName);
+}
+$this->_writer->write($str);
+$this->_attributes=array();
+$this->_styles=array();
+} +public function renderEndTag()
+{
+if(!empty($this->_openTags) && ($tagName=array_pop($this->_openTags))!=='')
+$this->_writer->write('</'.$tagName.'>');
+}
+} + +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()).'/'.$className.self::TEMPLATE_FILE_EXT; - return $this->getTemplateByFileName($tplFile); - } -public function getTemplateByFileName($fileName) - { - if(!is_null($fileName=$this->getLocalizedTemplate($fileName))) - { +public function init($config)
+{
+$this->getService()->setTemplateManager($this);
+} +public function getTemplateByClassName($className)
+{
+$class=new ReflectionClass($className);
+$tplFile=dirname($class->getFileName()).'/'.$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,$timestamp)=$array; - if(filemtime($fileName)<$timestamp) - return $template; - } - $template=new TTemplate(file_get_contents($fileName),dirname($fileName),$fileName); - $cache->set(self::TEMPLATE_CACHE_PREFIX.$fileName,array($template,time())); - return $template; - } - } - else - return null; - } -protected function getLocalizedTemplate($filename) - { - $app = $this->getApplication()->getGlobalization(); - if(is_null($app)) return $filename; - foreach($app->getLocalizedResource($filename) as $file) - { - if(($file=realpath($file))!==false && is_file($file)) - return $file; - } -} -} -class TTemplate extends TComponent implements ITemplate +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,$timestamp)=$array;
+if(filemtime($fileName)<$timestamp)
+return $template;
+}
+$template=new TTemplate(file_get_contents($fileName),dirname($fileName),$fileName);
+$cache->set(self::TEMPLATE_CACHE_PREFIX.$fileName,array($template,time()));
+return $template;
+}
+}
+else
+return null;
+} +protected function getLocalizedTemplate($filename)
+{
+$app = $this->getApplication()->getGlobalization();
+if(is_null($app)) return $filename;
+foreach($app->getLocalizedResource($filename) as $file)
+{
+if(($file=realpath($file))!==false && is_file($file))
+return $file;
+}
+return null;
+}
+} +class TTemplate extends TComponent implements ITemplate
{ const REGEX_RULES='/<!.*?!>|<!--.*?-->|<\/?com:([\w\.]+)((?:\s*[\w\.]+=\'.*?\'|\s*[\w\.]+=".*?"|\s*[\w\.]+=<%.*?%>)*)\s*\/?>|<\/?prop:([\w\.]+)\s*>|<%@\s*((?:\s*[\w\.]+=\'.*?\'|\s*[\w\.]+=".*?")*)\s*%>|<%[%#~\\$=\\[](.*?)%>/msS'; -const CONFIG_DATABIND=0; - const CONFIG_EXPRESSION=1; - const CONFIG_ASSET=2; - const CONFIG_PARAMETER=3; - const CONFIG_LOCALIZATION=4; +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 $_assetManager; -public function __construct($template,$contextPath,$tplFile=null) - { - $this->_contextPath=$contextPath; - $this->_tplFile=$tplFile; - $this->parse($template); - } -public function getContextPath() - { - return $this->_contextPath; - } -public function getDirective() - { - return $this->_directive; - } -public function &getItems() - { - return $this->_tpl; - } -public function instantiateIn($tplControl) - { - if(($page=$tplControl->getPage())===null) - $page=$this->getService()->getRequestedPage(); - $this->_assetManager=$this->getService()->getAssetManager(); - $controls=array(); - foreach($this->_tpl as $key=>$object) - { - if(isset($object[2])) { - $component=Prado::createComponent($object[1]); - if($component instanceof TControl) - { - $controls[$key]=$component; - $component->setTemplateControl($tplControl); - if(isset($object[2]['id'])) - $tplControl->registerObject($object[2]['id'],$component); - if(isset($object[2]['skinid'])) - { - $component->setSkinID($object[2]['skinid']); - unset($object[2]['skinid']); - } - $component->applyStyleSheetSkin($page); - foreach($object[2] as $name=>$value) - $this->configureControl($component,$name,$value); - $parent=isset($controls[$object[0]])?$controls[$object[0]]:$tplControl; - $component->createdOnTemplate($parent); - } - else if($component instanceof TComponent) - { - if(isset($object[2]['id'])) - { - $tplControl->registerObject($object[2]['id'],$component); - if(!$component->hasProperty('id')) - unset($object[2]['id']); - } - foreach($object[2] as $name=>$value) - $this->configureComponent($component,$name,$value); - $parent=isset($controls[$object[0]])?$controls[$object[0]]:$tplControl; - $parent->addParsedObject($component); - } - } - else { - if(isset($controls[$object[0]])) - $controls[$object[0]]->addParsedObject($object[1]); - else - $tplControl->addParsedObject($object[1]); - } - } - } -protected function configureControl($control,$name,$value) - { - if(is_string($value) && strncasecmp($name,'on',2)===0) $this->configureEvent($control,$name,$value); - else if(strpos($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($component,$name,$value) - { - if(strpos($value,'.')===false) - $component->attachEventHandler($name,array($component,'TemplateControl.'.$value)); - else - $component->attachEventHandler($name,array($component,$value)); - } -protected function configureProperty($component,$name,$value) - { - $setter='set'.$name; - if(is_array($value)) - { - switch($value[0]) - { - case self::CONFIG_DATABIND: - $component->bindProperty($name,$value[1]); - break; - case self::CONFIG_EXPRESSION: - $component->$setter($component->evaluateExpression($value[1])); - break; - case self::CONFIG_ASSET: $url=$this->_assetManager->publishFilePath($this->_contextPath.'/'.$value[1]); - $component->$setter($url); - break; - case self::CONFIG_PARAMETER: $component->$setter($this->getApplication()->getParameters()->itemAt($value[1])); - break; - case self::CONFIG_LOCALIZATION: - $component->$setter(localize($value[1])); - break; - default: break; - } - } - else - $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: $component->setSubProperty($name,$component->evaluateExpression($value[1])); - break; - case self::CONFIG_ASSET: $url=$this->_assetManager->publishFilePath($this->_contextPath.'/'.$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,localize($value[1])); - break; - default: break; - } - } - else - $component->setSubProperty($name,$value); - } -protected function parse($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; - $c=0; - 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]); - try - { - $this->validateAttributes($type,$attributes); - } - catch(Exception $e) - { - $line=count(explode("\n",substr($input,0,$matchEnd+1))); - if($this->_tplFile===null) - throw new TTemplateParsingException('template_componenttag_invalid',"Line $line",$type,$e->getMessage()); - else - throw new TTemplateParsingException('template_componenttag_invalid',"{$this->_tplFile} (Line $line)",$type,$e->getMessage()); - } - $tpl[$c++]=array($container,$type,$attributes); - if($str[strlen($str)-2]!=='/') { - array_push($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)) - { - $line=count(explode("\n",substr($input,0,$matchEnd+1))); - if($this->_tplFile===null) - throw new TTemplateParsingException('template_closingtag_unexpected',"Line $line","</com:$type>"); - else - throw new TTemplateParsingException('template_closingtag_unexpected',"{$this->_tplFile} (Line $line)","</com:$type>"); - } -$name=array_pop($stack); - if($name!==$type) - { - if($name[0]==='@') - $tag='</prop:'.substr($name,1).'>'; - else - $tag='</com:'.$name.'>'; - $line=count(explode("\n",substr($input,0,$matchEnd+1))); - if($this->_tplFile===null) - throw new TTemplateParsingException('template_closingtag_expected',"Line $line",$tag); - else - throw new TTemplateParsingException('template_closingtag_expected',"{$this->_tplFile} (Line $line)",$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])) - { - $line=count(explode("\n",substr($input,0,$matchEnd+1))); - if($this->_tplFile===null) - throw new TTemplateParsingException('template_directive_nonunique',"Line $line"); - else - throw new TTemplateParsingException('template_directive_nonunique',"{$this->_tplFile} (Line $line)"); - } - $this->_directive=$this->parseAttributes($match[4][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($str[2]==='=') $tpl[$c++]=array($container,'TExpression',array('Expression'=>THttpUtility::htmlDecode($match[5][0]))); - else if($str[2]==='%') $tpl[$c++]=array($container,'TStatements',array('Statements'=>THttpUtility::htmlDecode($match[5][0]))); - else - $tpl[$c++]=array($container,'TLiteral',array('Text'=>$this->parseAttribute($str))); - } - else if(strpos($str,'<prop:')===0) { - $prop=strtolower($match[3][0]); - array_push($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)) - { - $line=count(explode("\n",substr($input,0,$matchEnd+1))); - if($this->_tplFile===null) - throw new TTemplateParsingException('template_closingtag_unexpected',"Line $line","</prop:$prop>"); - else - throw new TTemplateParsingException('template_closingtag_unexpected',"{$this->_tplFile} (Line $line)","</prop:$prop>"); - } - $name=array_pop($stack); - if($name!=='@'.$prop) - { - if($name[0]==='@') - $tag='</prop:'.substr($name,1).'>'; - else - $tag='</com:'.$name.'>'; - $line=count(explode("\n",substr($input,0,$matchEnd+1))); - if($this->_tplFile===null) - throw new TTemplateParsingException('template_closingtag_expected',"Line $line",$tag); - else - throw new TTemplateParsingException('template_closingtag_expected',"{$this->_tplFile} (Line $line)",$tag); - } - if(($last=count($stack))<1 || $stack[$last-1][0]!=='@') - { - if($matchStart>$textStart && $container>=0) - { - $value=substr($input,$textStart,$matchStart-$textStart); - $value=$this->parseAttribute($value); - $type=$tpl[$container][1]; - try - { - $this->validateAttributes($type,array($prop=>$value)); - } - catch(Exception $e) - { - $line=count(explode("\n",substr($input,0,$matchEnd+1))); - if($this->_tplFile===null) - throw new TTemplateParsingException('template_componenttag_invalid',"Line $line",$type,$e->getMessage()); - else - throw new TTemplateParsingException('template_componenttag_invalid',"{$this->_tplFile} (Line $line)",$type,$e->getMessage()); - } - $tpl[$container][2][$prop]=$value; - $textStart=$matchEnd+1; - } - $expectPropEnd=false; - } - } - else if(strpos($str,'<!--')===0) { - $state=0; - } - else if(strpos($str,'<!')===0) { - if($expectPropEnd) - { - $line=count(explode("\n",substr($input,0,$matchEnd+1))); - if($this->_tplFile===null) - throw new TTemplateParsingException('template_comments_forbidden',"Line $line"); - else - throw new TTemplateParsingException('template_comments_forbidden',"{$this->_tplFile} (Line $line)"); - } - if($matchStart>$textStart) - $tpl[$c++]=array($container,substr($input,$textStart,$matchStart-$textStart)); - $textStart=$matchEnd+1; - } - else - { - $line=count(explode("\n",substr($input,0,$matchEnd+1))); - if($this->_tplFile===null) - throw new TTemplateParsingException('template_matching_unexpected',"Line $line",$match); - else - throw new TTemplateParsingException('template_matching_unexpected',"{$this->_tplFile} (Line $line)",$match); - } - } - if(!empty($stack)) - { - $name=array_pop($stack); - if($name[0]==='@') - $tag='</prop:'.substr($name,1).'>'; - else - $tag='</com:'.$name.'>'; - $line=count(explode("\n",substr($input,0,$matchEnd+1))); - if($this->_tplFile===null) - throw new TTemplateParsingException('template_closingtag_expected',"Line $line",$tag); - else - throw new TTemplateParsingException('template_closingtag_expected',"{$this->_tplFile} (Line $line)",$tag); - } - if($textStart<strlen($input)) - $tpl[$c++]=array($container,substr($input,$textStart)); - return $tpl; - } -protected function parseAttributes($str) - { - if($str==='') - return array(); - $pattern='/([\w\.]+)=(\'.*?\'|".*?"|<%.*?%>)/msS'; - $attributes=array(); - $n=preg_match_all($pattern,$str,$matches,PREG_SET_ORDER); - for($i=0;$i<$n;++$i) - { - $name=strtolower($matches[$i][1]); - $value=$matches[$i][2]; - if($value[0]==='\'' || $value[0]==='"') - $value=substr($value,1,strlen($value)-2); - $attributes[$name]=$this->parseAttribute($value); - } - return $attributes; - } -protected function parseAttribute($value) - { - $matches=array(); - if(!preg_match('/^(<%#.*?%>|<%=.*?%>|<%~.*?%>|<%\\$.*?%>|<%\\[.*?\\]%>)$/msS',$value,$matches)) - return THttpUtility::htmlDecode($value); - $value=THttpUtility::htmlDecode($matches[1]); - if($value[2]==='#') return array(self::CONFIG_DATABIND,substr($value,3,strlen($value)-5)); - else if($value[2]==='=') return array(self::CONFIG_EXPRESSION,substr($value,3,strlen($value)-5)); - else 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))); - } -protected function validateAttributes($type,$attributes) - { - Prado::using($type); - if(($pos=strrpos($type,'.'))!==false) - $className=substr($type,$pos+1); - else - $className=$type; - if(is_subclass_of($className,'TControl') || $className==='TControl') - { - foreach($attributes as $name=>$att) - { - if(($pos=strpos($name,'.'))!==false) - { - $subname=substr($name,0,$pos); - if(!is_callable(array($className,'get'.$subname))) - throw new TTemplateParsingException('template_property_unknown',$subname); - } - else if(strncasecmp($name,'on',2)===0) - { - if(!is_callable(array($className,$name))) - throw new TTemplateParsingException('template_event_unknown',$name); - } - else - { - if(!is_callable(array($className,'set'.$name))) - { - if(is_callable(array($className,'get'.$name))) - throw new TTemplateParsingException('template_property_readonly',$name); - else - throw new TTemplateParsingException('template_property_unknown',$name); - } - } - } - } - else if(is_subclass_of($className,'TComponent') || $className==='TComponent') - { - foreach($attributes as $name=>$att) - { - if($att[0]===self::CONFIG_DATABIND) - throw new TTemplateParsingException('template_databind_forbidden',$name); - if(($pos=strpos($name,'.'))!==false) - { - $subname=substr($name,0,$pos); - if(!is_callable(array($className,'get'.$subname))) - throw new TTemplateParsingException('template_property_unknown',$subname); - } - else if(strncasecmp($name,'on',2)===0) - throw new TTemplateParsingException('template_event_forbidden',$name); - else - { - if(!is_callable(array($className,'set'.$name))) - { - if(is_callable(array($className,'get'.$name))) - throw new TTemplateParsingException('template_property_readonly',$name); - else - throw new TTemplateParsingException('template_property_unknown',$name); - } - } - } - } - else - throw new TTemplateParsingException('template_component_required',$type); - } -} -?><?php -class TThemeManager extends TModule +private $_startingLine=0; +private $_content; +public function __construct($template,$contextPath,$tplFile=null,$startingLine=0)
+{
+$this->_contextPath=$contextPath;
+$this->_tplFile=$tplFile;
+$this->_startingLine=$startingLine;
+$this->_content=$template;
+$this->parse($template);
+$this->_content=null; } +public function getContextPath()
+{
+return $this->_contextPath;
+} +public function getDirective()
+{
+return $this->_directive;
+} +public function &getItems()
+{
+return $this->_tpl;
+} +public function instantiateIn($tplControl)
+{
+if(($page=$tplControl->getPage())===null)
+$page=$this->getService()->getRequestedPage();
+$this->_assetManager=$this->getService()->getAssetManager();
+$controls=array();
+foreach($this->_tpl as $key=>$object)
+{
+if(isset($object[2])) {
+$component=Prado::createComponent($object[1]);
+if($component instanceof TControl)
+{
+$controls[$key]=$component;
+$component->setTemplateControl($tplControl);
+if(isset($object[2]['id']))
+$tplControl->registerObject($object[2]['id'],$component);
+if(isset($object[2]['skinid']))
+{
+$component->setSkinID($object[2]['skinid']);
+unset($object[2]['skinid']);
+}
+$component->applyStyleSheetSkin($page);
+foreach($object[2] as $name=>$value)
+$this->configureControl($component,$name,$value);
+$parent=isset($controls[$object[0]])?$controls[$object[0]]:$tplControl;
+$component->createdOnTemplate($parent);
+}
+else if($component instanceof TComponent)
+{
+if(isset($object[2]['id']))
+{
+$tplControl->registerObject($object[2]['id'],$component);
+if(!$component->hasProperty('id'))
+unset($object[2]['id']);
+}
+foreach($object[2] as $name=>$value)
+$this->configureComponent($component,$name,$value);
+$parent=isset($controls[$object[0]])?$controls[$object[0]]:$tplControl;
+$parent->addParsedObject($component);
+}
+}
+else {
+if(isset($controls[$object[0]]))
+$controls[$object[0]]->addParsedObject($object[1]);
+else
+$tplControl->addParsedObject($object[1]);
+}
+}
+} +protected function configureControl($control,$name,$value)
+{
+if(strncasecmp($name,'on',2)===0) $this->configureEvent($control,$name,$value);
+else if(strpos($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($component,$name,$value)
+{
+if(strpos($value,'.')===false)
+$component->attachEventHandler($name,array($component,'TemplateControl.'.$value));
+else
+$component->attachEventHandler($name,array($component,$value));
+} +protected function configureProperty($component,$name,$value)
+{
+$setter='set'.$name;
+if(is_array($value))
+{
+switch($value[0])
+{
+case self::CONFIG_DATABIND:
+$component->bindProperty($name,$value[1]);
+break;
+case self::CONFIG_EXPRESSION:
+$component->$setter($component->evaluateExpression($value[1]));
+break;
+case self::CONFIG_TEMPLATE:
+$component->$setter($value[1]);
+break;
+case self::CONFIG_ASSET: $url=$this->_assetManager->publishFilePath($this->_contextPath.'/'.$value[1]);
+$component->$setter($url);
+break;
+case self::CONFIG_PARAMETER: $component->$setter($this->getApplication()->getParameters()->itemAt($value[1]));
+break;
+case self::CONFIG_LOCALIZATION:
+Prado::using('System.I18N.Translation');
+$component->$setter(localize(trim($value[1])));
+break;
+default: break;
+}
+}
+else
+$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: $component->setSubProperty($name,$component->evaluateExpression($value[1]));
+break;
+case self::CONFIG_TEMPLATE:
+$component->setSubProperty($name,$value[1]);
+break;
+case self::CONFIG_ASSET: $url=$this->_assetManager->publishFilePath($this->_contextPath.'/'.$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,localize($value[1]));
+break;
+default: break;
+}
+}
+else
+$component->setSubProperty($name,$value);
+} +protected function parse($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;
+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]!=='/') {
+array_push($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]))
+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;
+if($str[2]==='=') $tpl[$c++]=array($container,'TExpression',array('Expression'=>THttpUtility::htmlDecode($match[5][0])));
+else if($str[2]==='%') $tpl[$c++]=array($container,'TStatements',array('Statements'=>THttpUtility::htmlDecode($match[5][0])));
+else
+$tpl[$c++]=array($container,'TLiteral',array('Text'=>$this->parseAttribute($str)));
+}
+else if(strpos($str,'<prop:')===0) {
+$prop=strtolower($match[3][0]);
+array_push($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 && $container>=0)
+{
+$value=substr($input,$textStart,$matchStart-$textStart);
+if(strrpos($prop,'template')===strlen($prop)-8)
+$value=$this->parseTemplateProperty($value,$textStart);
+else
+$value=$this->parseAttribute($value);
+$type=$tpl[$container][1];
+$this->validateAttributes($type,array($prop=>$value));
+$tpl[$container][2][$prop]=$value;
+$textStart=$matchEnd+1;
+}
+$expectPropEnd=false;
+}
+}
+else if(strpos($str,'<!--')===0) {
+$state=0;
+}
+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->getErrorCode()==='template_format_invalid' || $e->getErrorCode()==='template_format_invalid2')
+throw $e;
+if($matchEnd===0)
+$line=$this->_startingLine+1;
+else
+$line=$this->_startingLine+count(explode("\n",substr($input,0,$matchEnd+1)));
+if(empty($this->_tplFile))
+throw new TConfigurationException('template_format_invalid2',$line,$e->getMessage(),$input);
+else
+throw new TConfigurationException('template_format_invalid',$this->_tplFile,$line,$e->getMessage());
+}
+return $tpl;
+} +protected function parseAttributes($str,$offset)
+{
+if($str==='')
+return array();
+$pattern='/([\w\.]+)=(\'.*?\'|".*?"|<%.*?%>)/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]);
+$value=$match[2][0];
+if(strrpos($name,'template')===strlen($name)-8)
+{
+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));
+} +protected function parseAttribute($value)
+{
+$matches=array();
+if(!preg_match('/\\s*(<%#.*?%>|<%=.*?%>|<%~.*?%>|<%\\$.*?%>|<%\\[.*?\\]%>)\\s*/msS',$value,$matches) || $matches[0]!==$value)
+return THttpUtility::htmlDecode($value);
+$value=THttpUtility::htmlDecode($matches[1]);
+if($value[2]==='#') return array(self::CONFIG_DATABIND,substr($value,3,strlen($value)-5));
+else if($value[2]==='=') return array(self::CONFIG_EXPRESSION,substr($value,3,strlen($value)-5));
+else 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)));
+} +protected function validateAttributes($type,$attributes)
+{
+Prado::using($type);
+if(($pos=strrpos($type,'.'))!==false)
+$className=substr($type,$pos+1);
+else
+$className=$type;
+if(is_subclass_of($className,'TControl') || $className==='TControl')
+{
+foreach($attributes as $name=>$att)
+{
+if(($pos=strpos($name,'.'))!==false)
+{
+$subname=substr($name,0,$pos);
+if(!is_callable(array($className,'get'.$subname)))
+throw new TConfigurationException('template_property_unknown',$type,$subname);
+}
+else if(strncasecmp($name,'on',2)===0)
+{
+if(!is_callable(array($className,$name)))
+throw new TConfigurationException('template_event_unknown',$type,$name);
+else if(!is_string($att))
+throw new TConfigurationException('template_eventhandler_invalid',$type,$name);
+}
+else
+{
+if(!is_callable(array($className,'set'.$name)))
+{
+if(is_callable(array($className,'get'.$name)))
+throw new TConfigurationException('template_property_readonly',$type,$name);
+else
+throw new TConfigurationException('template_property_unknown',$type,$name);
+}
+}
+}
+}
+else if(is_subclass_of($className,'TComponent') || $className==='TComponent')
+{
+foreach($attributes as $name=>$att)
+{
+if($att[0]===self::CONFIG_DATABIND)
+throw new TConfigurationException('template_databind_forbidden',$type,$name);
+if(($pos=strpos($name,'.'))!==false)
+{
+$subname=substr($name,0,$pos);
+if(!is_callable(array($className,'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 && !is_callable(array($className,'set'.$name)))
+{
+if(is_callable(array($className,'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);
+}
+} + +class TThemeManager extends TModule
{ const DEFAULT_BASEPATH='themes'; private $_initialized=false; private $_basePath=null; private $_baseUrl=null; -public function init($config) - { - $this->_initialized=true; - $this->getService()->setThemeManager($this); - } -public function getTheme($name) - { - $themePath=$this->getBasePath().'/'.$name; - $themeUrl=rtrim($this->getBaseUrl(),'/').'/'.$name; - return new TTheme($themePath,$themeUrl); -} -public function getBasePath() - { - if($this->_basePath===null) - { - $this->_basePath=dirname($this->getRequest()->getPhysicalApplicationPath()).'/'.self::DEFAULT_BASEPATH; - if(($basePath=realpath($this->_basePath))===false || !is_dir($basePath)) - throw new TConfigurationException('thememanager_basepath_invalid',$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::getPathOfAlias($value); - if($this->_basePath===null || !is_dir($this->_basePath)) - throw new TInvalidDataValueException('thememanager_basepath_invalid',$value); - $this->_basePath=$value; - } - } -public function getBaseUrl() - { - if($this->_baseUrl===null) - { - $appPath=dirname($this->getRequest()->getPhysicalApplicationPath()); - $basePath=$this->getBasePath(); - if(strpos($basePath,$appPath)===false) - throw new TConfigurationException('thememanager_baseurl_required'); - $appUrl=dirname($this->getRequest()->getApplicationPath()); - $this->_baseUrl=$appUrl.strtr(substr($basePath,strlen($appPath)),'\\','/'); - } - return $this->_baseUrl; - } -public function setBaseUrl($value) - { - $this->_baseUrl=rtrim($value,'/'); - } -} -class TTheme extends TComponent +public function init($config)
+{
+$this->_initialized=true;
+$this->getService()->setThemeManager($this);
+} +public function getTheme($name)
+{
+$themePath=$this->getBasePath().'/'.$name;
+$themeUrl=rtrim($this->getBaseUrl(),'/').'/'.$name;
+return new TTheme($themePath,$themeUrl); +} +public function getBasePath()
+{
+if($this->_basePath===null)
+{
+$this->_basePath=dirname($this->getRequest()->getPhysicalApplicationPath()).'/'.self::DEFAULT_BASEPATH;
+if(($basePath=realpath($this->_basePath))===false || !is_dir($basePath))
+throw new TConfigurationException('thememanager_basepath_invalid',$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::getPathOfAlias($value);
+if($this->_basePath===null || !is_dir($this->_basePath))
+throw new TInvalidDataValueException('thememanager_basepath_invalid',$value);
+$this->_basePath=$value;
+}
+} +public function getBaseUrl()
+{
+if($this->_baseUrl===null)
+{
+$appPath=dirname($this->getRequest()->getPhysicalApplicationPath());
+$basePath=$this->getBasePath();
+if(strpos($basePath,$appPath)===false)
+throw new TConfigurationException('thememanager_baseurl_required');
+$appUrl=dirname($this->getRequest()->getApplicationPath());
+$this->_baseUrl=$appUrl.strtr(substr($basePath,strlen($appPath)),'\\','/');
+}
+return $this->_baseUrl;
+} +public function setBaseUrl($value)
+{
+$this->_baseUrl=rtrim($value,'/');
+}
+} +class TTheme extends TComponent implements ITheme
{ const THEME_CACHE_PREFIX='prado:theme:'; const SKIN_FILE_EXT='.skin'; @@ -4275,139 +4555,139 @@ private $_skins=null; private $_name=''; private $_cssFiles=array(); private $_jsFiles=array(); -public function __construct($themePath,$themeUrl) - { - $this->_themeUrl=$themeUrl; - $this->_name=basename($themePath); - if(($cache=$this->getApplication()->getCache())!==null) - { - $array=$cache->get(self::THEME_CACHE_PREFIX.$themePath); - if(is_array($array)) - { - list($skins,$cssFiles,$jsFiles,$timestamp)=$array; - $cacheValid=true; - if($this->getApplication()->getMode()!==TApplication::STATE_PERFORMANCE) - { - 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 && filemtime($themePath.'/'.$file)>$timestamp) - { - $cacheValid=false; - break; - } - } - closedir($dir); - if($cacheValid) - $this->_skins=$skins; - } - else - { - $this->_cssFiles=$cssFiles; - $this->_jsFiles=$jsFiles; - $this->_skins=$skins; - } - } - } - if($this->_skins===null) - { - 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($skin[0]!==-1) - throw new TConfigurationException('theme_control_nested',$skin[1],dirname($themePath)); - else if(!isset($skin[2])) continue; - $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)); - foreach($skin[2] as $name=>$value) - { - if(is_array($value) && ($value[0]===TTemplate::CONFIG_DATABIND || $value[0]===TTemplate::CONFIG_PARAMETER)) - throw new TConfigurationException('theme_databind_forbidden',dirname($themePath),$type,$id); - } - $this->_skins[$type][$id]=$skin[2]; - } - } - } - closedir($dir); - if($cache!==null) - $cache->set(self::THEME_CACHE_PREFIX.$themePath,array($this->_skins,$this->_cssFiles,$this->_jsFiles,time())); - } - } -public function getName() - { - return $this->_name; - } -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) - { +public function __construct($themePath,$themeUrl)
+{
+$this->_themeUrl=$themeUrl;
+$this->_name=basename($themePath);
+if(($cache=$this->getApplication()->getCache())!==null)
+{
+$array=$cache->get(self::THEME_CACHE_PREFIX.$themePath);
+if(is_array($array))
+{
+list($skins,$cssFiles,$jsFiles,$timestamp)=$array;
+$cacheValid=true;
+if($this->getApplication()->getMode()!==TApplication::STATE_PERFORMANCE)
+{
+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 && filemtime($themePath.'/'.$file)>$timestamp)
+{
+$cacheValid=false;
+break;
+}
+}
+closedir($dir);
+if($cacheValid)
+$this->_skins=$skins;
+}
+else
+{
+$this->_cssFiles=$cssFiles;
+$this->_jsFiles=$jsFiles;
+$this->_skins=$skins;
+}
+}
+}
+if($this->_skins===null)
+{
+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($skin[0]!==-1)
+throw new TConfigurationException('theme_control_nested',$skin[1],dirname($themePath));
+else if(!isset($skin[2])) continue;
+$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));
+foreach($skin[2] as $name=>$value)
+{
+if(is_array($value) && ($value[0]===TTemplate::CONFIG_DATABIND || $value[0]===TTemplate::CONFIG_PARAMETER))
+throw new TConfigurationException('theme_databind_forbidden',dirname($themePath),$type,$id);
+}
+$this->_skins[$type][$id]=$skin[2];
+}
+}
+}
+closedir($dir);
+if($cache!==null)
+$cache->set(self::THEME_CACHE_PREFIX.$themePath,array($this->_skins,$this->_cssFiles,$this->_jsFiles,time()));
+}
+} +public function getName()
+{
+return $this->_name;
+} +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))
+{
+if($value[0]===TTemplate::CONFIG_EXPRESSION)
+$value=$this->evaluateExpression($value[1]);
+else if($value[0]===TTemplate::CONFIG_ASSET)
+$value=$this->_themeUrl.'/'.ltrim($value[1],'/');
+}
+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;
+} +public function getJavaScriptFiles()
+{
+return $this->_jsFiles;
+}
+} - if(is_array($value)) - { - if($value[0]===TTemplate::CONFIG_EXPRESSION) - $value=$this->evaluateExpression($value[1]); - else if($value[0]===TTemplate::CONFIG_ASSET) - $value=$this->_themeUrl.'/'.ltrim($value[1],'/'); - } - 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; - } -public function getJavaScriptFiles() - { - return $this->_jsFiles; - } -} -?><?php -class TAssetManager extends TModule +class TAssetManager extends TModule
{ const DEFAULT_BASEPATH='assets'; private $_basePath=null; @@ -4415,195 +4695,209 @@ private $_baseUrl=null; private $_checkTimestamp=false; private $_application; private $_published=array(); -public function init($config) - { - $application=$this->getApplication(); - if($this->_basePath===null) - $this->_basePath=dirname($application->getRequest()->getPhysicalApplicationPath()).'/'.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=dirname($application->getRequest()->getApplicationPath()).'/'.self::DEFAULT_BASEPATH; - $application->getService()->setAssetManager($this); - } -public function getBasePath() - { - return $this->_basePath; - } -public function setBasePath($value) - { - if($this->_initialized) - throw new TInvalidOperationException('assetmanager_basepath_unchangeable'); - else - { - $this->_basePath=Prado::getPathOfAlias($value); - if($this->_basePath===null || !is_dir($this->_basePath) || !is_writable($this->_basePath)) - throw new TInvalidDataValueException('assetmanage_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=$value; - } -public function publishFilePath($path,$checkTimestamp=false) - { - if(isset($this->_published[$path])) - return $this->_published[$path]; - else if(($fullpath=realpath($path))===false) - return ''; - else if(is_file($fullpath)) - { - $dir=$this->hash(dirname($fullpath)); - $file=$this->_basePath.'/'.$dir.'/'.basename($fullpath); - if(!is_file($file) || $checkTimestamp || $this->getApplication()->getMode()!==TApplication::STATE_PERFORMANCE) - { - if(!is_dir($this->_basePath.'/'.$dir)) - @mkdir($this->_basePath.'/'.$dir); - if(!is_file($file) || @filemtime($file)<@filemtime($fullpath)) - { +public function init($config)
+{
+$application=$this->getApplication();
+if($this->_basePath===null)
+$this->_basePath=dirname($application->getRequest()->getPhysicalApplicationPath()).'/'.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=dirname($application->getRequest()->getApplicationPath()).'/'.self::DEFAULT_BASEPATH;
+$application->getService()->setAssetManager($this);
+} +public function getBasePath()
+{
+return $this->_basePath;
+} +public function setBasePath($value)
+{
+if($this->_initialized)
+throw new TInvalidOperationException('assetmanager_basepath_unchangeable');
+else
+{
+$this->_basePath=Prado::getPathOfAlias($value);
+if($this->_basePath===null || !is_dir($this->_basePath) || !is_writable($this->_basePath))
+throw new TInvalidDataValueException('assetmanage_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=$value;
+} +public function getPublishedUrl($path)
+{
+if(($fullpath=realpath($path))!==false)
+{
+$dir=$this->hash(dirname($fullpath));
+$file=$this->_basePath.'/'.$dir.'/'.basename($fullpath);
+if(is_file($file) || is_dir($file))
+return $this->_baseUrl.'/'.$dir.'/'.basename($fullpath);
+}
+return null;
+} +public function isPublished($path)
+{
+return $this->getPublishedUrl($path) !== null;
+} +public function publishFilePath($path,$checkTimestamp=false)
+{
+if(isset($this->_published[$path]))
+return $this->_published[$path];
+else if(($fullpath=realpath($path))===false)
+return '';
+else if(is_file($fullpath))
+{
+$dir=$this->hash(dirname($fullpath));
+$file=$this->_basePath.'/'.$dir.'/'.basename($fullpath);
+if(!is_file($file) || $checkTimestamp || $this->getApplication()->getMode()!==TApplication::STATE_PERFORMANCE)
+{
+if(!is_dir($this->_basePath.'/'.$dir))
+@mkdir($this->_basePath.'/'.$dir);
+if(!is_file($file) || @filemtime($file)<@filemtime($fullpath))
+{
+ +@copy($fullpath,$file);
+}
+}
+$this->_published[$path]=$this->_baseUrl.'/'.$dir.'/'.basename($fullpath);
+return $this->_published[$path];
+}
+else
+{
+$dir=$this->hash($fullpath);
+if(!is_dir($this->_basePath.'/'.$dir) || $checkTimestamp || $this->getApplication()->getMode()!==TApplication::STATE_PERFORMANCE)
+{
- @copy($fullpath,$file); - } - } - $this->_published[$path]=$this->_baseUrl.'/'.$dir.'/'.basename($fullpath); - return $this->_published[$path]; - } - else - { - $dir=$this->hash($fullpath); - if(!is_dir($this->_basePath.'/'.$dir) || $checkTimestamp || $this->getApplication()->getMode()!==TApplication::STATE_PERFORMANCE) - { +$this->copyDirectory($fullpath,$this->_basePath.'/'.$dir);
+}
+$this->_published[$path]=$this->_baseUrl.'/'.$dir;
+return $this->_published[$path];
+}
+} +protected function hash($dir)
+{
+return sprintf('%x',crc32($dir));
+} +protected function copyDirectory($src,$dst)
+{
+if(!is_dir($dst))
+@mkdir($dst);
+$folder=@opendir($src);
+while($file=@readdir($folder))
+{
+if($file==='.' || $file==='..')
+continue;
+else if(is_file($src.'/'.$file))
+{
+if(@filemtime($dst.'/'.$file)<@filemtime($src.'/'.$file))
+@copy($src.'/'.$file,$dst.'/'.$file);
+}
+else
+$this->copyDirectory($src.'/'.$file,$dst.'/'.$file);
+}
+closedir($folder);
+}
+} - $this->copyDirectory($fullpath,$this->_basePath.'/'.$dir); - } - $this->_published[$path]=$this->_baseUrl.'/'.$dir; - return $this->_published[$path]; - } - } -private function hash($dir) - { - return sprintf('%x',crc32($dir)); - } -protected function copyDirectory($src,$dst) - { - if(!is_dir($dst)) - @mkdir($dst); - $folder=@opendir($src); - while($file=@readdir($folder)) - { - if($file==='.' || $file==='..') - continue; - else if(is_file($src.'/'.$file)) - { - if(@filemtime($dst.'/'.$file)<@filemtime($src.'/'.$file)) - @copy($src.'/'.$file,$dst.'/'.$file); - } - else - $this->copyDirectory($src.'/'.$file,$dst.'/'.$file); - } - closedir($folder); - } -} -?><?php -class TPageStatePersister extends TModule implements IStatePersister +class TPageStatePersister extends TModule implements IStatePersister
{ private $_privateKey=null; -public function init($config) - { - $this->getService()->setPageStatePersister($this); - } -public function save($state) - { +public function init($config)
+{
+$this->getService()->setPageStatePersister($this);
+} +public function save($state)
+{
- $data=Prado::serialize($state); - $hmac=$this->computeHMAC($data,$this->getPrivateKey()); - if(extension_loaded('zlib')) - $data=gzcompress($hmac.$data); - else - $data=$hmac.$data; - $this->getService()->getRequestedPage()->getClientScript()->registerHiddenField(TPage::FIELD_PAGESTATE,base64_encode($data)); - } -public function load() - { +$data=Prado::serialize($state);
+$hmac=$this->computeHMAC($data,$this->getPrivateKey());
+if(extension_loaded('zlib'))
+$data=gzcompress($hmac.$data);
+else
+$data=$hmac.$data;
+$this->getService()->getRequestedPage()->getClientScript()->registerHiddenField(TPage::FIELD_PAGESTATE,base64_encode($data));
+} +public function load()
+{
- $str=base64_decode($this->getApplication()->getRequest()->getItems()->itemAt(TPage::FIELD_PAGESTATE)); - if($str==='') - return null; - if(extension_loaded('zlib')) - $data=gzuncompress($str); - else - $data=$str; - if($data!==false && strlen($data)>32) - { - $hmac=substr($data,0,32); - $state=substr($data,32); - if($hmac===$this->computeHMAC($state,$this->getPrivateKey())) - return Prado::unserialize($state); - } - throw new THttpException(400,'pagestatepersister_pagestate_corrupted'); - } -protected function generatePrivateKey() - { - $v1=rand(); - $v2=rand(); - $v3=rand(); - return md5("$v1$v2$v3"); - } -public function getPrivateKey() - { - if(empty($this->_privateKey)) - { - if(($this->_privateKey=$this->getApplication()->getGlobalState('prado:pagestatepersister:privatekey'))===null) - { - $this->_privateKey=$this->generatePrivateKey(); - $this->getApplication()->setGlobalState('prado:pagestatepersister:privatekey',$this->_privateKey,null); - } - } - return $this->_privateKey; - } -public function setPrivateKey($value) - { - if(strlen($value)<8) - throw new TInvalidDataValueException('pagestatepersister_privatekey_invalid'); - $this->_privateKey=$value; - } -private function computeHMAC($data,$key) - { - if (strlen($key) > 64) - $key = pack('H32', md5($key)); - else if (strlen($key) < 64) - $key = str_pad($key, 64, "\0"); - return md5((str_repeat("\x5c", 64) ^ substr($key, 0, 64)) . pack('H32', md5((str_repeat("\x36", 64) ^ substr($key, 0, 64)) . $data))); - } -} -?><?php +$str=base64_decode($this->getRequest()->itemAt(TPage::FIELD_PAGESTATE));
+if($str==='')
+return null;
+if(extension_loaded('zlib'))
+$data=gzuncompress($str);
+else
+$data=$str;
+if($data!==false && strlen($data)>32)
+{
+$hmac=substr($data,0,32);
+$state=substr($data,32);
+if($hmac===$this->computeHMAC($state,$this->getPrivateKey()))
+return Prado::unserialize($state);
+}
+throw new THttpException(400,'pagestatepersister_pagestate_corrupted');
+} +protected function generatePrivateKey()
+{
+$v1=rand();
+$v2=rand();
+$v3=rand();
+return md5("$v1$v2$v3");
+} +public function getPrivateKey()
+{
+if(empty($this->_privateKey))
+{
+if(($this->_privateKey=$this->getApplication()->getGlobalState('prado:pagestatepersister:privatekey'))===null)
+{
+$this->_privateKey=$this->generatePrivateKey();
+$this->getApplication()->setGlobalState('prado:pagestatepersister:privatekey',$this->_privateKey,null);
+}
+}
+return $this->_privateKey;
+} +public function setPrivateKey($value)
+{
+if(strlen($value)<8)
+throw new TInvalidDataValueException('pagestatepersister_privatekey_invalid');
+$this->_privateKey=$value;
+} +private function computeHMAC($data,$key)
+{
+if (strlen($key) > 64)
+$key = pack('H32', md5($key));
+else if (strlen($key) < 64)
+$key = str_pad($key, 64, "\0");
+return md5((str_repeat("\x5c", 64) ^ substr($key, 0, 64)) . pack('H32', md5((str_repeat("\x36", 64) ^ substr($key, 0, 64)) . $data)));
+}
+} -class TControl extends TComponent +class TControl extends TComponent
{ const ID_FORMAT='/^\\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 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; private $_id=''; private $_uid=''; @@ -4615,838 +4909,849 @@ private $_viewState=array(); private $_stage=0; private $_flags=0; private $_rf=array(); -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 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 getAsset($assetPath) - { - $class=new ReflectionClass(get_class($this)); - $assetPath=dirname($class->getFileName()).'/'.$assetPath; - return $this->getService()->getAsset($assetPath); - } -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==='') { - 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 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 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]=new TControlList($this); - return $this->_rf[self::RF_CONTROLS]; - } -public function getVisible($checkParents=true) - { - if($checkParents) - { - for($control=$this;$control;$control=$control->_parent) - if(!$control->getViewState('Visible',true)) - 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]); - } -protected function getViewState($key,$defaultValue=null) - { - return isset($this->_viewState[$key])?$this->_viewState[$key]:$defaultValue; - } -protected function setViewState($key,$value,$defaultValue=null) - { - if($value===$defaultValue) - unset($this->_viewState[$key]); - else - $this->_viewState[$key]=$value; - } -protected function clearViewState($key) - { - unset($this->_viewState[$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 dataBind() - { +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 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 getAsset($assetPath)
+{
+$class=new ReflectionClass(get_class($this));
+$assetPath=dirname($class->getFileName()).'/'.$assetPath;
+return $this->getService()->getAsset($assetPath);
+} +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==='') {
+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 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 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]=new TControlList($this);
+return $this->_rf[self::RF_CONTROLS];
+} +public function getVisible($checkParents=true)
+{
+if($checkParents)
+{
+for($control=$this;$control;$control=$control->_parent)
+if(!$control->getViewState('Visible',true))
+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]);
+} +protected function getViewState($key,$defaultValue=null)
+{
+return isset($this->_viewState[$key])?$this->_viewState[$key]:$defaultValue;
+} +protected function setViewState($key,$value,$defaultValue=null)
+{
+if($value===$defaultValue)
+unset($this->_viewState[$key]);
+else
+$this->_viewState[$key]=$value;
+} +protected function clearViewState($key)
+{
+unset($this->_viewState[$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 dataBind()
+{
- $this->dataBindProperties(); +$this->dataBindProperties();
- $this->onDataBinding(null); +$this->onDataBinding(null);
- $this->dataBindChildren(); - } -protected function dataBindProperties() - { - if(isset($this->_rf[self::RF_DATA_BINDINGS])) - { - foreach($this->_rf[self::RF_DATA_BINDINGS] as $property=>$expression) - $this->setSubProperty($property,$this->evaluateExpression($expression)); - } - } -protected function dataBindChildren() - { - if(isset($this->_rf[self::RF_CONTROLS])) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - if($control instanceof TControl) - $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->hasControl() && ($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; - $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; - } - } - } -protected 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) - { - $controls=array(); - if($this->getHasControls()) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - { - if($control instanceof $type) - $controls[]=$control; - if(($control instanceof TControl) && $control->getHasControls()) - $controls=array_merge($controls,$control->findControlsByType($type)); - } - } - 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 createdOnTemplate($parent) - { - $parent->addParsedObject($this); - } -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(); - } -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; - $control->_stage=self::CS_CONSTRUCTED; - if(!($control->_flags & self::IS_ID_SET)) - $control->_id=''; - $control->clearCachedUniqueID(true); - } -protected function initRecursive($namingContainer=null) - { - 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; - } - $this->onInit(null); - $this->_stage=self::CS_INITIALIZED; - } - } -protected function loadRecursive() - { - if($this->_stage<self::CS_LOADED) - $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() - { - if($this->getVisible(false)) - { - $this->ensureChildControls(); - $this->onPreRender(null); - if($this->getHasControls()) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - if($control instanceof TControl) - $control->preRenderRecursive(); - } - } - $this->_stage=self::CS_PRERENDERED; - } -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(); - } - $this->onUnload(null); - } -protected function onInit($param) - { - $this->raiseEvent('OnInit',$this,$param); - } -protected function onLoad($param) - { - $this->raiseEvent('OnLoad',$this,$param); - } -protected function onDataBinding($param) - { - $this->raiseEvent('OnDataBinding',$this,$param); - } -protected function onUnload($param) - { - $this->raiseEvent('OnUnload',$this,$param); - } -protected function onPreRender($param) - { - $this->raiseEvent('OnPreRender',$this,$param); - } -protected function raiseBubbleEvent($sender,$param) - { - $control=$this; - while($control=$control->_parent) - { - if($control->onBubbleEvent($sender,$param)) - break; - } - } -protected function onBubbleEvent($sender,$param) - { - return false; - } -protected function broadcastEvent($sender,TBroadCastEventParameter $param) - { - $origin=(($page=$this->getPage())===null)?$this:$page; - $origin->broadcastEventInternal($sender,$param); - } -final protected function broadcastEventInternal($sender,$param) - { - 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($sender,$param); - } - } - } -protected function renderControl($writer) - { - if($this->getVisible(false)) - $this->render($writer); - } -protected function render($writer) - { - $this->renderChildren($writer); - } -protected function renderChildren($writer) - { - if($this->getHasControls()) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - { - if($control instanceof TControl) - $control->renderControl($writer); - else if(is_string($control)) - $writer->write($control); - } - } - } -protected function onSaveState($param) - { - $this->raiseEvent('OnSaveState',$this,$param); - } -protected function onLoadState($param) - { - $this->raiseEvent('OnLoadState',$this,$param); - } -final protected function loadStateRecursive(&$state,$needViewState=true) - { - if($state!==null) - { - $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])) - { - $s=&$state[$control->_id]; - unset($state[$control->_id]); - } - else - $s=null; - $control->loadStateRecursive($s,$needViewState); - } - } - } - if(!empty($state)) - $this->_rf[self::RF_CHILD_STATE]=&$state; - $this->_stage=self::CS_STATE_LOADED; - $this->onLoadState(null); - } - else $this->_stage=self::CS_STATE_LOADED; - } -final protected function &saveStateRecursive($needViewState=true) - { - $this->onSaveState(null); - $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) - { - $cs=&$control->saveStateRecursive($needViewState); - $state[$control->_id]=&$cs; - } - } - } - if($needViewState) - $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) - { - $this->_uid=''; - if($recursive && isset($this->_rf[self::RF_CONTROLS])) - { - foreach($this->_rf[self::RF_CONTROLS] as $control) - if($control instanceof TControl) - $control->clearCachedUniqueID($recursive); - } - } -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 TControlList extends TList +$this->dataBindChildren();
+} +protected function dataBindProperties()
+{
+if(isset($this->_rf[self::RF_DATA_BINDINGS]))
+{
+foreach($this->_rf[self::RF_DATA_BINDINGS] as $property=>$expression)
+$this->setSubProperty($property,$this->evaluateExpression($expression));
+}
+} +protected function dataBindChildren()
+{
+if(isset($this->_rf[self::RF_CONTROLS]))
+{
+foreach($this->_rf[self::RF_CONTROLS] as $control)
+if($control instanceof TControl)
+$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->hasControl() && ($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;
+$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;
+}
+}
+} +protected 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)
+{
+$controls=array();
+if($this->getHasControls())
+{
+foreach($this->_rf[self::RF_CONTROLS] as $control)
+{
+if($control instanceof $type)
+$controls[]=$control;
+if(($control instanceof TControl) && $control->getHasControls())
+$controls=array_merge($controls,$control->findControlsByType($type));
+}
+}
+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 getRegisteredObject($name)
+{
+return isset($this->_rf[self::RF_NAMED_OBJECTS][$name])?$this->_rf[self::RF_NAMED_OBJECTS][$name]:null;
+} +public function createdOnTemplate($parent)
+{
+$parent->addParsedObject($this);
+} +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();
+} +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;
+$control->_stage=self::CS_CONSTRUCTED;
+if(!($control->_flags & self::IS_ID_SET))
+$control->_id='';
+$control->clearCachedUniqueID(true);
+} +protected function initRecursive($namingContainer=null)
+{
+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;
+}
+$this->onInit(null);
+$this->_stage=self::CS_INITIALIZED;
+}
+} +protected function loadRecursive()
+{
+if($this->_stage<self::CS_LOADED)
+$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()
+{
+if($this->getVisible(false))
+{
+$this->ensureChildControls();
+$this->onPreRender(null);
+if($this->getHasControls())
+{
+foreach($this->_rf[self::RF_CONTROLS] as $control)
+if($control instanceof TControl)
+$control->preRenderRecursive();
+}
+}
+$this->_stage=self::CS_PRERENDERED;
+} +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();
+}
+$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->onBubbleEvent($sender,$param))
+break;
+}
+} +public function onBubbleEvent($sender,$param)
+{
+return false;
+} +protected function broadcastEvent($sender,TBroadCastEventParameter $param)
+{
+$origin=(($page=$this->getPage())===null)?$this:$page;
+$origin->broadcastEventInternal($sender,$param);
+} +final protected function broadcastEventInternal($sender,$param)
+{
+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($sender,$param);
+}
+}
+} +protected function renderControl($writer)
+{
+if($this->getVisible(false))
+$this->render($writer);
+} +protected function render($writer)
+{
+$this->renderChildren($writer);
+} +protected function renderChildren($writer)
+{
+if($this->getHasControls())
+{
+foreach($this->_rf[self::RF_CONTROLS] as $control)
+{
+if($control instanceof TControl)
+$control->renderControl($writer);
+else if(is_string($control))
+$writer->write($control);
+}
+}
+} +public function saveState()
+{
+} +public function loadState()
+{
+} +final protected function loadStateRecursive(&$state,$needViewState=true)
+{
+if($state!==null)
+{
+$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]);
+}
+else
+{
+$s=array();
+$control->loadStateRecursive($s,$needViewState);
+}
+}
+}
+}
+if(!empty($state))
+$this->_rf[self::RF_CHILD_STATE]=&$state;
+$this->_stage=self::CS_STATE_LOADED;
+}
+else
+$this->_stage=self::CS_STATE_LOADED;
+$this->loadState();
+} +final protected function &saveStateRecursive($needViewState=true)
+{
+$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)
+{
+$cs=&$control->saveStateRecursive($needViewState);
+if(!empty($cs))
+$state[$control->_id]=&$cs;
+}
+}
+}
+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)
+{
+$this->_uid='';
+if($recursive && isset($this->_rf[self::RF_CONTROLS]))
+{
+foreach($this->_rf[self::RF_CONTROLS] as $control)
+if($control instanceof TControl)
+$control->clearCachedUniqueID($recursive);
+}
+} +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 TControlList extends TList
{ private $_o; -public function __construct(TControl $owner) - { - parent::__construct(); - $this->_o=$owner; - } -protected function getOwner() - { - return $this->_o; - } -protected function addedItem($item) - { - if($item instanceof TControl) - $this->_o->addedControl($item); - } -protected function removedItem($item) - { - if($item instanceof TControl) - $this->_o->removedControl($item); - } -protected function canAddItem($item) - { - return is_string($item) || ($item instanceof TControl); - } -public function clear() - { - parent::clear(); - if($this->_o instanceof INamingContainer) - $this->_o->clearNamingContainer(); - } -} -interface INamingContainer -{ -} -interface IPostBackEventHandler +public function __construct(TControl $owner)
+{
+parent::__construct();
+$this->_o=$owner;
+} +protected function getOwner()
+{
+return $this->_o;
+} +public function insertAt($index,$item)
+{
+if(is_string($item))
+parent::insertAt($index,$item);
+else if($item instanceof TControl)
+{
+parent::insertAt($index,$item);
+$this->_o->addedControl($item);
+}
+else
+throw new TInvalidDataTypeException('controllist_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();
+}
+} +interface INamingContainer
+{
+} +interface IPostBackEventHandler
{ public function raisePostBackEvent($param); -public function getPostBackOptions(); +public function getPostBackOptions();
} -interface IPostBackDataHandler +interface IPostBackDataHandler
{ public function loadPostData($key,$values); -public function raisePostDataChangedEvent(); +public function raisePostDataChangedEvent();
} -interface IValidator +interface IValidator
{ public function validate(); public function getIsValid(); public function setIsValid($value); public function getErrorMessage(); -public function setErrorMessage($value); -} -interface IValidatable -{ -public function getValidationPropertyValue(); -} -interface IBroadcastEventReceiver -{ -public function broadcastEventReceived($sender,$param); -} -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; - } -} -?><?php -class TTemplateControl extends TControl implements INamingContainer +public function setErrorMessage($value);
+} +interface IValidatable
+{ +public function getValidationPropertyValue();
+} +interface IBroadcastEventReceiver
+{ +public function broadcastEventReceived($sender,$param);
+} +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 TTemplateControl extends TControl implements INamingContainer
{ const EXT_TEMPLATE='.tpl'; protected static $_template=array(); @@ -5455,392 +5760,389 @@ private $_master=null; private $_masterClass=''; private $_contents=array(); private $_placeholders=array(); -public function __construct() - { - if(($tpl=$this->getTemplate(true))!==null) - { - foreach($tpl->getDirective() as $name=>$value) - $this->setSubProperty($name,$value); - } - } -public function getTemplate($load=false) - { - if($this->_localTemplate===null) - { - $class=get_class($this); - $tpl=isset(self::$_template[$class])?self::$_template[$class]:null; - return ($tpl===null && $load)?$this->loadTemplate():$tpl; - } - else - return $this->_localTemplate; - } -public function setTemplate($value) - { - $this->_localTemplate=$value; - } -protected function loadTemplate() - { +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;
+} +protected function loadTemplate()
+{
- $template=$this->getService()->getTemplateManager()->getTemplateByClassName(get_class($this)); - self::$_template[get_class($this)]=$template; - return $template; - } -protected function createChildControls() - { - if($tpl=$this->getTemplate()) - $tpl->instantiateIn($this); - } -public function registerContent(TContent $object) - { - $this->_contents[$object->getID()]=$object; - } -public function getMasterClass() - { - return $this->_masterClass; - } -public function setMasterClass($value) - { - $this->_masterClass=$value; - } -public function getMaster() - { - return $this->_master; - } -public function registerContentPlaceHolder($id,$parent,$loc) - { - $this->_placeholders[$id]=array($parent,$loc); - } -public function injectContent($id,$content) - { - if(isset($this->_placeholders[$id])) - { - list($parent,$loc)=$this->_placeholders[$id]; - $parent->getControls()->insert($loc,$content); - } - } -protected function initRecursive($namingContainer=null) - { - $this->ensureChildControls(); - if($this->_masterClass!=='') - { - $master=Prado::createComponent($this->_masterClass); - if(!($master instanceof TTemplateControl)) - throw new TInvalidDataValueException('tplcontrol_required',get_class($master)); - $this->_master=$master; - $this->getControls()->clear(); - $this->getControls()->add($master); - $master->ensureChildControls(); - foreach($this->_contents as $id=>$content) - $master->injectContent($id,$content); - } - parent::initRecursive($namingContainer); - } -} -?><?php -class TForm extends TControl -{ - protected function onInit($param) - { - parent::onInit($param); - $this->getPage()->setForm($this); - } -protected function addAttributesToRender($writer) - { - $attributes=$this->getAttributes(); - $writer->addAttribute('method',$this->getMethod()); - $writer->addAttribute('action',$this->getRequest()->getRequestURI()); - if(($enctype=$this->getEnctype())!=='') - $writer->addAttribute('enctype',$enctype); - $attributes->remove('action'); +$template=$this->getService()->getTemplateManager()->getTemplateByClassName(get_class($this));
+self::$_template[get_class($this)]=$template;
+return $template;
+} +protected function createChildControls()
+{
+if($tpl=$this->getTemplate(true))
+{
+foreach($tpl->getDirective() as $name=>$value)
+$this->setSubProperty($name,$value);
+$tpl->instantiateIn($this);
+}
+} +public function registerContent(TContent $object)
+{
+$this->_contents[$object->getID()]=$object;
+} +public function getMasterClass()
+{
+return $this->_masterClass;
+} +public function setMasterClass($value)
+{
+$this->_masterClass=$value;
+} +public function getMaster()
+{
+return $this->_master;
+} +public function registerContentPlaceHolder($id,$parent,$loc)
+{
+$this->_placeholders[$id]=array($parent,$loc);
+} +public function injectContent($id,$content)
+{
+if(isset($this->_placeholders[$id]))
+{
+list($parent,$loc)=$this->_placeholders[$id];
+$parent->getControls()->insertAt($loc,$content);
+}
+} +protected function initRecursive($namingContainer=null)
+{
+$this->ensureChildControls();
+if($this->_masterClass!=='')
+{
+$master=Prado::createComponent($this->_masterClass);
+if(!($master instanceof TTemplateControl))
+throw new TInvalidDataValueException('tplcontrol_required',get_class($master));
+$this->_master=$master;
+$this->getControls()->clear();
+$this->getControls()->add($master);
+$master->ensureChildControls();
+foreach($this->_contents as $id=>$content)
+$master->injectContent($id,$content);
+}
+parent::initRecursive($namingContainer);
+}
+} + +class TForm extends TControl
+{
+public function onInit($param)
+{
+parent::onInit($param);
+$this->getPage()->setForm($this);
+} +protected function addAttributesToRender($writer)
+{
+$attributes=$this->getAttributes();
+$writer->addAttribute('method',$this->getMethod());
+$writer->addAttribute('action',$this->getRequest()->getRequestURI());
+if(($enctype=$this->getEnctype())!=='')
+$writer->addAttribute('enctype',$enctype);
+$attributes->remove('action'); $page=$this->getPage(); -if($this->getDefaultButton()!=='') - { - } - $writer->addAttribute('id',$this->getClientID()); - foreach($attributes as $name=>$value) - $writer->addAttribute($name,$value); - } -protected function render($writer) - { - $this->addAttributesToRender($writer); - $writer->renderBeginTag('form'); - $page=$this->getPage(); - $page->beginFormRender($writer); - $this->renderChildren($writer); - $page->endFormRender($writer); - $writer->renderEndTag(); - } -public function getDefaultButton() - { - return $this->getViewState('DefaultButton',''); - } -public function setDefaultButton($value) - { - $this->setViewState('DefaultButton',$value,''); - } -public function getDefaultFocus() - { - return $this->getViewState('DefaultFocus',''); - } -public function setDefaultFocus($value) - { - $this->setViewState('DefaultFocus',$value,''); - } -public function getMethod() - { - return $this->getViewState('Method','post'); - } -public function setMethod($value) - { - $this->setViewState('Method',$value,'post'); - } -public function getEnctype() - { - return $this->getViewState('Enctype',''); - } -public function setEnctype($value) - { - $this->setViewState('Enctype',$value,''); - } -public function getName() - { - return $this->getUniqueID(); - } -public function getTarget() - { - return $this->getViewState('Target',''); - } -public function setTarget($value) - { - $this->setViewState('Target',$value,''); - } -} -?><?php +if($this->getDefaultButton()!=='')
+{
+}
+$writer->addAttribute('id',$this->getClientID());
+foreach($attributes as $name=>$value)
+$writer->addAttribute($name,$value);
+} +protected function render($writer)
+{
+$this->addAttributesToRender($writer);
+$writer->renderBeginTag('form');
+$page=$this->getPage();
+$page->beginFormRender($writer);
+$this->renderChildren($writer);
+$page->endFormRender($writer);
+$writer->renderEndTag();
+} +public function getDefaultButton()
+{
+return $this->getViewState('DefaultButton','');
+} +public function setDefaultButton($value)
+{
+$this->setViewState('DefaultButton',$value,'');
+} +public function getDefaultFocus()
+{
+return $this->getViewState('DefaultFocus','');
+} +public function setDefaultFocus($value)
+{
+$this->setViewState('DefaultFocus',$value,'');
+} +public function getMethod()
+{
+return $this->getViewState('Method','post');
+} +public function setMethod($value)
+{
+$this->setViewState('Method',$value,'post');
+} +public function getEnctype()
+{
+return $this->getViewState('Enctype','');
+} +public function setEnctype($value)
+{
+$this->setViewState('Enctype',$value,'');
+} +public function getName()
+{
+return $this->getUniqueID();
+} +public function getTarget()
+{
+return $this->getViewState('Target','');
+} +public function setTarget($value)
+{
+$this->setViewState('Target',$value,'');
+}
+} + Prado::using('System.Web.Javascripts.*'); class TClientScriptManager extends TComponent { - const SCRIPT_DIR='Web/Javascripts/js'; +const SCRIPT_DIR='Web/Javascripts/js'; private $_page; - private $_hiddenFields=array(); - private $_beginScripts=array(); - private $_endScripts=array(); - private $_scriptFiles=array(); +private $_hiddenFields=array(); +private $_beginScripts=array(); +private $_endScripts=array(); +private $_scriptFiles=array(); private $_styleSheetFiles=array(); - private $_styleSheets=array(); +private $_styleSheets=array(); private $_client; private $_publishedScriptFiles=array(); public function __construct(TPage $owner) - { - $this->_page=$owner; - $this->_client = new TClientScript($this); - } +{ +$this->_page=$owner; +$this->_client = new TClientScript($this); +} public function registerPostBackControl($control,$namespace='Prado.WebUI') - { - $options = $this->getPostBackOptions($control); - $type = get_class($control); - $namespace = empty($namespace) ? "window" : $namespace; - $code = "new {$namespace}.{$type}($options);"; - $this->registerEndScript(sprintf('%08X', crc32($code)), $code); +{ +$options = $this->getPostBackOptions($control); +$type = get_class($control); +$namespace = empty($namespace) ? "window" : $namespace; +$code = "new {$namespace}.{$type}($options);"; +$this->registerEndScript(sprintf('%08X', crc32($code)), $code); $this->registerHiddenField(TPage::FIELD_POSTBACK_TARGET,''); - $this->registerHiddenField(TPage::FIELD_POSTBACK_PARAMETER,''); - $this->registerClientScript('prado'); - } +$this->registerHiddenField(TPage::FIELD_POSTBACK_PARAMETER,''); +$this->registerClientScript('prado'); +} protected function getPostBackOptions($control) - { - $postback = $control->getPostBackOptions(); - if(!isset($postback['ID'])) - $postback['ID'] = $control->getClientID(); - if(!isset($postback['FormID'])) - $postback['FormID'] = $this->_page->getForm()->getClientID(); - $options = new TJavascriptSerializer($postback); - return $options->toJavascript(); - } +{ +$postback = $control->getPostBackOptions(); +if(!isset($postback['ID'])) +$postback['ID'] = $control->getClientID(); +if(!isset($postback['FormID'])) +$postback['FormID'] = $this->_page->getForm()->getClientID(); +$options = new TJavascriptSerializer($postback); +return $options->toJavascript(); +} public function registerDefaultButton($panel, $button) - { - $serializer = new TJavascriptSerializer( - $this->getDefaultButtonOptions($panel, $button)); - $options = $serializer->toJavascript(); - $code = "new Prado.WebUI.DefaultButton($options);"; - $scripts = $this->_page->getClientScript(); - $scripts->registerEndScript("prado:".$panel->getClientID(), $code); - } +{ +$serializer = new TJavascriptSerializer( +$this->getDefaultButtonOptions($panel, $button)); +$options = $serializer->toJavascript(); +$code = "new Prado.WebUI.DefaultButton($options);"; +$scripts = $this->_page->getClientScript(); +$scripts->registerEndScript("prado:".$panel->getClientID(), $code); +} protected function getDefaultButtonOptions($panel, $button) - { - $options['Panel'] = $panel->getClientID(); - $options['Target'] = $button->getClientID(); - $options['Event'] = 'click'; - return $options; - } +{ +$options['Panel'] = $panel->getClientID(); +$options['Target'] = $button->getClientID(); +$options['Event'] = 'click'; +return $options; +} public function registerClientScript($script) - { - static $scripts = array(); - $scripts = array_unique(array_merge($scripts, - TClientScript::getScripts($script))); +{ +static $scripts = array(); +$scripts = array_unique(array_merge($scripts, +TClientScript::getScripts($script))); $this->publishClientScriptAssets($scripts); $url = $this->publishClientScriptCompressorAsset(); - $url .= '?js='.implode(',', $scripts); - if(Prado::getApplication()->getMode() == TApplication::STATE_DEBUG) - $url .= '&__nocache'; - $this->registerScriptFile('prado:gzipscripts', $url); - } +$url .= '?js='.implode(',', $scripts); +if(Prado::getApplication()->getMode() == TApplication::STATE_DEBUG) +$url .= '&__nocache'; +$this->registerScriptFile('prado:gzipscripts', $url); +} protected function publishClientScriptAssets($scripts) - { - foreach($scripts as $lib) - { - if(!isset($this->_publishedScriptFiles[$lib])) - { - $base = Prado::getFrameworkPath(); - $clientScripts = self::SCRIPT_DIR; - $assetManager = $this->_page->getService()->getAssetManager(); - $file = "{$base}/{$clientScripts}/{$lib}.js"; - $assetManager->publishFilePath($file); - $this->_publishedScriptFiles[$lib] = true; - } - } - } +{ +foreach($scripts as $lib) +{ +if(!isset($this->_publishedScriptFiles[$lib])) +{ +$base = Prado::getFrameworkPath(); +$clientScripts = self::SCRIPT_DIR; +$assetManager = $this->_page->getService()->getAssetManager(); +$file = "{$base}/{$clientScripts}/{$lib}.js"; +$assetManager->publishFilePath($file); +$this->_publishedScriptFiles[$lib] = true; +} +} +} protected function publishClientScriptCompressorAsset() - { - $scriptFile = 'clientscripts.php'; - if(isset($this->_publishedScriptFiles[$scriptFile])) - return $this->_publishedScriptFiles[$scriptFile]; - else - { - $base = Prado::getFrameworkPath(); - $clientScripts = self::SCRIPT_DIR; - $assetManager = $this->_page->getService()->getAssetManager(); - $file = "{$base}/{$clientScripts}/{$scriptFile}"; - $url= $assetManager->publishFilePath($file); - $this->_publishedScriptFiles[$scriptFile] = $url; - return $url; - } - } +{ +$scriptFile = 'clientscripts.php'; +if(isset($this->_publishedScriptFiles[$scriptFile])) +return $this->_publishedScriptFiles[$scriptFile]; +else +{ +$base = Prado::getFrameworkPath(); +$clientScripts = self::SCRIPT_DIR; +$assetManager = $this->_page->getService()->getAssetManager(); +$file = "{$base}/{$clientScripts}/{$scriptFile}"; +$url= $assetManager->publishFilePath($file); +$this->_publishedScriptFiles[$scriptFile] = $url; +return $url; +} +} public function isHiddenFieldRegistered($key) - { - return isset($this->_hiddenFields[$key]); - } +{ +return isset($this->_hiddenFields[$key]); +} public function isScriptRegistered($key) - { - return isset($this->_scripts[$key]); - } +{ +return isset($this->_scripts[$key]); +} public function isScriptFileRegistered($key) - { - return isset($this->_scriptFiles[$key]); - } +{ +return isset($this->_scriptFiles[$key]); +} public function isBeginScriptRegistered($key) - { - return isset($this->_beginScripts[$key]); - } +{ +return isset($this->_beginScripts[$key]); +} public function isEndScriptRegistered($key) - { - return isset($this->_endScripts[$key]); - } +{ +return isset($this->_endScripts[$key]); +} public function isStyleSheetFileRegistered($key) - { - return isset($this->_styleSheetFiles[$key]); - } +{ +return isset($this->_styleSheetFiles[$key]); +} public function isStyleSheetRegistered($key) - { - return isset($this->_styleSheets[$key]); - } +{ +return isset($this->_styleSheets[$key]); +} public function registerScriptFile($key,$url) - { - $this->_scriptFiles[$key]=$url; - } +{ +$this->_scriptFiles[$key]=$url; +} public function registerHiddenField($name,$value) - { - if(!isset($this->_hiddenFields[$name]) || $this->_hiddenFields[$name]!==null) - $this->_hiddenFields[$name]=$value; - } +{ +if(!isset($this->_hiddenFields[$name]) || $this->_hiddenFields[$name]!==null) +$this->_hiddenFields[$name]=$value; +} public function registerBeginScript($key,$script) - { - $this->_beginScripts[$key]=$script; - } +{ +$this->_beginScripts[$key]=$script; +} public function registerEndScript($key,$script) - { - $this->_endScripts[$key]=$script; - } +{ +$this->_endScripts[$key]=$script; +} public function registerStyleSheetFile($key,$url) - { - $this->_styleSheetFiles[$key]=$url; - } +{ +$this->_styleSheetFiles[$key]=$url; +} public function registerStyleSheet($key,$css) - { - $this->_styleSheets[$key]=$css; - } +{ +$this->_styleSheets[$key]=$css; +} public function renderScriptFiles($writer) - { - $str=''; - foreach($this->_scriptFiles as $include) - $str.="<script type=\"text/javascript\" src=\"".THttpUtility::htmlEncode($include)."\"></script>\n"; - $writer->write($str); - } +{ +$str=''; +foreach($this->_scriptFiles as $include) +$str.="<script type=\"text/javascript\" src=\"".THttpUtility::htmlEncode($include)."\"></script>\n"; +$writer->write($str); +} public function renderBeginScripts($writer) - { - if(count($this->_beginScripts)) - $writer->write("<script type=\"text/javascript\">\n//<![CDATA[\n".implode("\n",$this->_beginScripts)."\n//]]>\n</script>\n"); - } +{ +if(count($this->_beginScripts)) +$writer->write("<script type=\"text/javascript\">\n//<![CDATA[\n".implode("\n",$this->_beginScripts)."\n//]]>\n</script>\n"); +} public function renderEndScripts($writer) - { - if(count($this->_endScripts)) - $writer->write("<script type=\"text/javascript\">\n//<![CDATA[\n".implode("\n",$this->_endScripts)."\n//]]>\n</script>\n"); - } +{ +if(count($this->_endScripts)) +$writer->write("<script type=\"text/javascript\">\n//<![CDATA[\n".implode("\n",$this->_endScripts)."\n//]]>\n</script>\n"); +} public function renderHiddenFields($writer) - { - $str=''; - foreach($this->_hiddenFields as $name=>$value) - { - if($value!==null) - { - $value=THttpUtility::htmlEncode($value); - $str.="<input type=\"hidden\" name=\"$name\" id=\"$name\" value=\"$value\" />\n"; - $this->_hiddenFields[$name]=null; - } - } - if($str!=='') - $writer->write("<div>\n".$str."</div>\n"); - } +{ +$str=''; +foreach($this->_hiddenFields as $name=>$value) +{ +if($value!==null) +{ +$value=THttpUtility::htmlEncode($value); +$str.="<input type=\"hidden\" name=\"$name\" id=\"$name\" value=\"$value\" />\n"; +$this->_hiddenFields[$name]=null; +} +} +if($str!=='') +$writer->write("<div>\n".$str."</div>\n"); +} +public function renderJavascriptBlock($code) +{ +return "<script type=\"text/javascript\">\n/*<![CDATA[*/\n{$code}\n/*]]>*/\n</script>"; +} public function renderStyleSheetFiles($writer) - { - $str=''; - foreach($this->_styleSheetFiles as $url) - { - $str.="<link rel=\"stylesheet\" type=\"text/css\" href=\"".THttpUtility::htmlEncode($url)."\" />\n"; - } - $writer->write($str); - } +{ +$str=''; +foreach($this->_styleSheetFiles as $url) +{ +$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".implode("\n",$this->_styleSheets)."\n</style>\n"); - } +{ +if(count($this->_styleSheets)) +$writer->write("<style type=\"text/css\">\n".implode("\n",$this->_styleSheets)."\n</style>\n"); +} public function getHasHiddenFields() - { - return count($this->_hiddenFields)>0; - } -} -?><?php -Prado::using('System.Web.UI.WebControls.*'); - - - +{ +return count($this->_hiddenFields)>0; +} +} -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_SCROLLX='PRADO_SCROLLX'; - const FIELD_SCROLLY='PRADO_SCROLLY'; -private static $_systemPostFields=array( - 'PRADO_POSTBACK_TARGET'=>true, - 'PRADO_POSTBACK_PARAMETER'=>true, - 'PRADO_LASTFOCUS'=>true, - 'PRADO_PAGESTATE'=>true, - 'PRADO_SCROLLX'=>true, - 'PRADO_SCROLLY'=>true, - '__PREVPAGE','__CALLBACKID','__CALLBACKPARAM' - ); +Prado::using('System.Web.UI.WebControls.*');
+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_SCROLLX='PRADO_SCROLLX';
+const FIELD_SCROLLY='PRADO_SCROLLY'; +private static $_systemPostFields=array(
+'PRADO_POSTBACK_TARGET'=>true,
+'PRADO_POSTBACK_PARAMETER'=>true,
+'PRADO_LASTFOCUS'=>true,
+'PRADO_PAGESTATE'=>true,
+'PRADO_SCROLLX'=>true,
+'PRADO_SCROLLY'=>true,
+'__PREVPAGE','__CALLBACKID','__CALLBACKPARAM'
+); private $_form=null; private $_head=null; private $_templateFile=null; @@ -5860,2278 +6162,2277 @@ private $_formRendered=false; private $_inFormRender=false; private $_focus=null; private $_maintainScrollPosition=false; -private $_maxPageStateFieldLength=10; - private $_enableViewStateMac=true; - private $_isCrossPagePostBack=false; - private $_previousPagePath=''; -public function __construct($initProperties=null) - { - - $this->setPage($this); - if(is_array($initProperties)) - { +private $_maxPageStateFieldLength=10;
+private $_enableViewStateMac=true;
+private $_isCrossPagePostBack=false;
+private $_previousPagePath=''; +public function __construct()
+{
+parent::__construct();
+$this->setPage($this);
+} +public function run($writer)
+{
- foreach($initProperties as $name=>$value) - $this->setSubProperty($name,$value); - } - parent::__construct(); - } -public function run($writer) - { +$this->determinePostBackMode(); - $this->determinePostBackMode(); +$this->onPreInit(null);
- $this->onPreInit(null); +$this->initRecursive();
- $this->initRecursive(); +$this->onInitComplete(null); +if($this->getIsPostBack())
+{
+$this->_restPostData=new TMap;
- $this->onInitComplete(null); -if($this->getIsPostBack()) - { - $this->_restPostData=new TMap; +$this->loadPageState();
- $this->loadPageState(); +$this->processPostData($this->_postData,true);
- $this->processPostData($this->_postData,true); +$this->onPreLoad(null);
- $this->onPreLoad(null); +$this->loadRecursive();
- $this->loadRecursive(); +$this->processPostData($this->_restPostData,false);
- $this->processPostData($this->_restPostData,false); +$this->raiseChangedEvents();
- $this->raiseChangedEvents(); +$this->raisePostBackEvent();
- $this->raisePostBackEvent(); +$this->onLoadComplete(null);
+}
+else
+{
- $this->onLoadComplete(null); - } - else - { +$this->onPreLoad(null);
- $this->onPreLoad(null); +$this->loadRecursive();
- $this->loadRecursive(); +$this->onLoadComplete(null);
+} - $this->onLoadComplete(null); - } +$this->preRenderRecursive();
- $this->preRenderRecursive(); +$this->onPreRenderComplete(null); - $this->onPreRenderComplete(null); +$this->savePageState();
- $this->savePageState(); +$this->onSaveStateComplete(null); - $this->onSaveStateComplete(null); +$this->renderControl($writer);
- $this->renderControl($writer); +$this->unloadRecursive();
+} +protected function loadTemplate()
+{
+if($this->_templateFile===null)
+return parent::loadTemplate();
+else
+{
+$template=$this->getService()->getTemplateManager()->getTemplateByFileName($this->_templateFile);
+$this->setTemplate($template);
+return $template;
+}
+} +public function getTemplateFile()
+{
+return $this->_templateFile;
+} +public function setTemplateFile($value)
+{
+if(($templateFile=Prado::getPathOfNamespace($value,TTemplateManager::TEMPLATE_FILE_EXT))===null || !is_file($templateFile))
+throw new TInvalidDataValueException('page_templatefile_invalid',$value);
+else
+$this->_templateFile=$templateFile;
+} +public function setForm(TForm $form)
+{
+if($this->_form===null)
+$this->_form=$form;
+else
+throw new TInvalidOperationException('page_form_duplicated');
+} +public function getForm()
+{
+return $this->_form;
+} +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='')
+{
+$this->_validated=true;
+if($this->_validators && $this->_validators->getCount())
+{
- $this->unloadRecursive(); - } -protected function loadTemplate() - { - if($this->_templateFile===null) - return parent::loadTemplate(); - else - { - $template=$this->getService()->getTemplateManager()->getTemplateByFileName($this->_templateFile); - $this->setTemplate($template); - return $template; - } - } -public function getTemplateFile() - { - return $this->_templateFile; - } -public function setTemplateFile($value) - { - if(($templateFile=Prado::getPathOfNamespace($value,TTemplateManager::TEMPLATE_FILE_EXT))===null || !is_file($templateFile)) - throw new TInvalidDataValueException('page_templatefile_invalid',$value); - else - $this->_templateFile=$templateFile; - } -public function setForm(TForm $form) - { - if($this->_form===null) - $this->_form=$form; - else - throw new TInvalidOperationException('page_form_duplicated'); - } -public function getForm() - { - return $this->_form; - } -public function getValidators($validationGroup='') - { - if(!$this->_validators) - $this->_validators=new TList; - if($validationGroup==='') - 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='') - { - $this->_validated=true; - if($this->_validators && $this->_validators->getCount()) - { +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=$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=$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();
+if($this->_theme instanceof ITheme)
+{
+foreach($this->_theme->getStyleSheetFiles() as $url)
+$cs->registerStyleSheetFile($url,$url);
+foreach($this->_theme->getJavaScriptFiles() as $url)
+$cs->registerHeadScriptFile($url,$url);
+}
+if($this->_styleSheet instanceof ITheme)
+{
+foreach($this->_styleSheet->getStyleSheetFiles() as $url)
+$cs->registerStyleSheetFile($url,$url);
+foreach($this->_styleSheet->getJavaScriptFiles() as $url)
+$cs->registerHeadScriptFile($url,$url);
+}
+} +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;
+} +protected function getPageStatePersister()
+{
+return $this->getService()->getPageStatePersister();
+} +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->getPageStatePersister()->load();
+$this->loadStateRecursive($state,$this->getEnableViewState());
+} +protected function savePageState()
+{
+$state=&$this->saveStateRecursive($this->getEnableViewState());
+$this->getPageStatePersister()->save($state);
+} +protected function isSystemPostField($field)
+{
+return isset(self::$_systemPostFields[$field]);
+} +public function registerRequiresPostData(TControl $control)
+{
+$this->_controlsRegisteredForPostData[$control->getUniqueID()]=true;
+} +public function getPostBackEventTarget()
+{
+if($this->_postBackEventTarget===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->_postBackEventParameter=$this->_postData->itemAt(self::FIELD_POSTBACK_PARAMETER);
+return $this->_postBackEventParameter;
+} +public function setPostBackEventParameter($value)
+{
+$this->_postBackEventParameter=$value;
+} +public function registerAutoPostBackControl(TControl $control)
+{
+$this->_autoPostBackControl=$control;
+} +protected function processPostData($postData,$beforeLoad)
+{
+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)
+$this->setPostBackEventTarget($control);
+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]);
+}
+}
+} +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->_inFormRender)
+throw new TConfigurationException('page_control_outofform',get_class($control),$control->getID(false));
+} +public function beginFormRender($writer)
+{
+if($this->_formRendered)
+throw new TConfigurationException('page_singleform_required');
+$this->_formRendered=true;
+$this->_inFormRender=true;
+$cs=$this->getClientScript();
+$cs->renderHiddenFields($writer);
+$cs->renderBeginScripts($writer);
+} +public function endFormRender($writer)
+{
+$cs=$this->getClientScript();
+if($this->getClientSupportsJavaScript())
+{
+if($this->_focus)
+{
+if(is_string($this->_focus))
+$cs->registerFocusScript($this->_focus);
+else if(($this->_focus instanceof TControl) && $this->_focus->getVisible(true))
+$cs->registerFocusScript($this->_focus->getClientID());
+}
+else if($this->_postData && ($lastFocus=$this->_postData->itemAt(self::FIELD_LASTFOCUS))!==null)
+$cs->registerFocusScript($lastFocus);
+if($this->_maintainScrollPosition && $this->_postData)
+{
+$x=TPropertyValue::ensureInteger($this->_postData->itemAt(self::PRADO_SCROLLX));
+$y=TPropertyValue::ensureInteger($this->_postData->itemAt(self::PRADO_SCROLLY));
+$cs->registerScrollScript($x,$y);
+}
+$cs->renderHiddenFields($writer);
+$cs->renderScriptFiles($writer);
+$cs->renderEndScripts($writer);
+}
+else
+$cs->renderHiddenFields($writer);
+$this->_inFormRender=false;
+} +public function setFocus($value)
+{
+$this->_focus=$value;
+} +public function getMaintainScrollPosition()
+{
+return $this->_maintainScrollPosition;
+} +public function setMaintainScrollPosition($value)
+{
+$this->_maintainScrollPosition=TPropertyValue::ensureBoolean($value);
+} +public function getClientSupportsJavaScript()
+{
+return true;
+} +protected function initializeCulture()
+{
+} +public function getHead()
+{
+return $this->_head;
+} +public function setHead(THead $value)
+{
+if($this->_head)
+throw new TInvalidOperationException('page_head_duplicated');
+$this->_head=$value;
+} +public function getTitle()
+{
+return $this->getViewState('Title','');
+} +public function setTitle($value)
+{
+$this->setViewState('Title',$value,'');
+}
+} - 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=$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=$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; - } -protected function onPreInit($param) - { - $this->raiseEvent('OnPreInit',$this,$param); - } -protected function onInitComplete($param) - { - $this->raiseEvent('OnInitComplete',$this,$param); - } -protected function onPreLoad($param) - { - $this->raiseEvent('OnPreLoad',$this,$param); - } -protected function onLoadComplete($param) - { - $this->raiseEvent('OnLoadComplete',$this,$param); - } -protected function onPreRenderComplete($param) - { - $this->raiseEvent('OnPreRenderComplete',$this,$param); - $cs=$this->getClientScript(); - if($this->_theme) - { - foreach($this->_theme->getStyleSheetFiles() as $url) - $cs->registerStyleSheetFile($url,$url); - foreach($this->_theme->getJavaScriptFiles() as $url) - $cs->registerHeadScriptFile($url,$url); - } - if($this->_styleSheet) - { - foreach($this->_styleSheet->getStyleSheetFiles() as $url) - $cs->registerStyleSheetFile($url,$url); - foreach($this->_styleSheet->getJavaScriptFiles() as $url) - $cs->registerHeadScriptFile($url,$url); - } - } -protected function onSaveStateComplete($param) - { - $this->raiseEvent('OnSaveStateComplete',$this,$param); - } -private function determinePostBackMode() - { - $postData=$this->getApplication()->getRequest()->getItems(); - if($postData->contains(self::FIELD_PAGESTATE) || $postData->contains(self::FIELD_POSTBACK_TARGET)) - $this->_postData=$postData; - } -public function getIsPostBack() - { - return $this->_postData!==null; - } -protected function getPageStatePersister() - { - return $this->getService()->getPageStatePersister(); - } -protected function onSaveState($param) - { - parent::onSaveState($param); - $this->setViewState('ControlsRequiringPostBack',$this->_controlsRegisteredForPostData,array()); - } -protected function onLoadState($param) - { - $this->_controlsRequiringPostData=$this->getViewState('ControlsRequiringPostBack',array()); - parent::onLoadState($param); - } -protected function loadPageState() - { - $state=$this->getPageStatePersister()->load(); - $this->loadStateRecursive($state,$this->getEnableViewState()); - } -protected function savePageState() - { - $state=&$this->saveStateRecursive($this->getEnableViewState()); - $this->getPageStatePersister()->save($state); - } -protected function isSystemPostField($field) - { - return isset(self::$_systemPostFields[$field]); - } -public function registerRequiresPostData(TControl $control) - { - $this->_controlsRegisteredForPostData[$control->getUniqueID()]=true; - } -public function getPostBackEventTarget() - { - if($this->_postBackEventTarget===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->_postBackEventParameter=$this->_postData->itemAt(self::FIELD_POSTBACK_PARAMETER); - return $this->_postBackEventParameter; - } -public function setPostBackEventParameter($value) - { - $this->_postBackEventParameter=$value; - } -public function registerAutoPostBackControl(TControl $control) - { - $this->_autoPostBackControl=$control; - } -protected function processPostData($postData,$beforeLoad) - { - 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) - $this->setPostBackEventTarget($control); - 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]); - } - } - } -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->_inFormRender) - throw new TConfigurationException('page_control_outofform',get_class($control),$control->getID(false)); - } -public function beginFormRender($writer) - { - if($this->_formRendered) - throw new TConfigurationException('page_singleform_required'); - $this->_formRendered=true; - $this->_inFormRender=true; - $cs=$this->getClientScript(); - $cs->renderHiddenFields($writer); - $cs->renderBeginScripts($writer); - } -public function endFormRender($writer) - { - $cs=$this->getClientScript(); - if($this->getClientSupportsJavaScript()) - { - if($this->_focus) - { - if(is_string($this->_focus)) - $cs->registerFocusScript($this->_focus); - else if(($this->_focus instanceof TControl) && $this->_focus->getVisible(true)) - $cs->registerFocusScript($this->_focus->getClientID()); - } - else if($this->_postData && ($lastFocus=$this->_postData->itemAt(self::FIELD_LASTFOCUS))!==null) - $cs->registerFocusScript($lastFocus); - if($this->_maintainScrollPosition && $this->_postData) - { - $x=TPropertyValue::ensureInteger($this->_postData->itemAt(self::PRADO_SCROLLX)); - $y=TPropertyValue::ensureInteger($this->_postData->itemAt(self::PRADO_SCROLLY)); - $cs->registerScrollScript($x,$y); - } - $cs->renderHiddenFields($writer); - $cs->renderScriptFiles($writer); - $cs->renderEndScripts($writer); - } - else - $cs->renderHiddenFields($writer); - $this->_inFormRender=false; - } -public function setFocus($value) - { - $this->_focus=$value; - } -public function getMaintainScrollPosition() - { - return $this->_maintainScrollPosition; - } -public function setMaintainScrollPosition($value) - { - $this->_maintainScrollPosition=TPropertyValue::ensureBoolean($value); - } -public function getClientSupportsJavaScript() - { - return true; - } -protected function initializeCulture() - { - } -public function getHead() - { - return $this->_head; - } -public function setHead(THead $value) - { - if($this->_head) - throw new TInvalidOperationException('page_head_duplicated'); - $this->_head=$value; - } -public function getTitle() - { - return $this->getViewState('Title',''); - } -public function setTitle($value) - { - $this->setViewState('Title',$value,''); - } -} -?><?php -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; +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($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($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($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($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($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(($font->_flags & self::IS_SET_BOLD) && !($this->_flags & self::IS_SET_BOLD)) - $this->setBold($font->getBold()); - if(($font->_flags & self::IS_SET_ITALIC) && !($this->_flags & self::IS_SET_ITALIC)) - $this->setItalic($font->getItalic()); - if(($font->_flags & self::IS_SET_OVERLINE) && !($this->_flags & self::IS_SET_OVERLINE)) - $this->setOverline($font->getOverline()); - if(($font->_flags & self::IS_SET_STRIKEOUT) && !($this->_flags & self::IS_SET_STRIKEOUT)) - $this->setStrikeout($font->getStrikeout()); - if(($font->_flags & self::IS_SET_UNDERLINE) && !($this->_flags & self::IS_SET_UNDERLINE)) - $this->setUnderline($font->getUnderline()); - if(($font->_flags & self::IS_SET_SIZE) && !($this->_flags & self::IS_SET_SIZE)) - $this->setSize($font->getSize()); - if(($font->_flags & self::IS_SET_NAME) && !($this->_flags & self::IS_SET_NAME)) - $this->setName($font->getName()); - } -public function copyFrom($font) - { - $this->_flags=$font->_flags; - $this->_name=$font->_name; - $this->_size=$font->_size; - } -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); - } -} -?><?php +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($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 copyFrom($font)
+{
+$this->_flags=$font->_flags;
+$this->_name=$font->_name;
+$this->_size=$font->_size;
+} +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 +class TStyle extends TComponent
{ private $_fields=array(); private $_font=null; private $_class=null; private $_customStyle=null; -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 setCssClass($value) - { - $this->_class=trim($value)===''?null:$value; - } -public function getFont() - { - if($this->_font===null) - $this->_font=new TFont; - return $this->_font; - } -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=trim($value)===''?null:$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() - { - parent::reset(); - $this->_fields=array(); - $this->_font=null; - $this->_class=null; - $this->_customStyle=null; - } -public function copyFrom($style) - { - if($style!==null) - { - $this->reset(); - $this->_fields=$style->_fields; - $this->_class=$style->_class; - $this->_customStyle=$style->_customStyle; - if($style->_font!==null) - $this->getFont()->copyFrom($style->_font); - } - } -public function mergeWith($style) - { - if($style!==null) - { - $this->_fields=array_merge($style->_fields,$this->_fields); - if($this->_class===null) - $this->_class=$style->_class; - if($this->_font===null && $style->_font!==null) - $this->getFont()->mergeWith($style->_font); - } - } -public function addAttributesToRender($writer) - { - if($this->_customStyle!=='') - { - foreach(explode(';',$this->_customStyle) as $style) - { - $arr=explode(':',$style); - if(isset($arr[1]) && trim($arr[0])!=='') - $writer->addStyleAttribute(trim($arr[0]),trim($arr[1])); - } - } - foreach($this->_fields as $name=>$value) - $writer->addStyleAttribute($name,$value); - if($this->_font!==null) - $this->_font->addAttributesToRender($writer); - if($this->_class!==null) - $writer->addAttribute('class',$this->_class); - } -} -class TTableStyle extends TStyle +public function __construct($style=null)
+{
+if($style!==null)
+$this->copyFrom($style);
+} +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 setCssClass($value)
+{
+$this->_class=trim($value)===''?null:$value;
+} +public function getFont()
+{
+if($this->_font===null)
+$this->_font=new TFont;
+return $this->_font;
+} +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=trim($value)===''?null:$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)
+{
+$this->reset();
+if($style instanceof TStyle)
+{
+$this->_fields=$style->_fields;
+$this->_class=$style->_class;
+$this->_customStyle=$style->_customStyle;
+if($style->_font!==null)
+$this->getFont()->copyFrom($style->_font);
+}
+} +public function mergeWith($style)
+{
+if($style!==null)
+{
+$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()->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]));
+}
+}
+foreach($this->_fields as $name=>$value)
+$writer->addStyleAttribute($name,$value);
+if($this->_font!==null)
+$this->_font->addAttributesToRender($writer);
+if($this->_class!==null)
+$writer->addAttribute('class',$this->_class);
+}
+} +class TTableStyle extends TStyle
{ private $_backImageUrl=null; private $_horizontalAlign=null; private $_cellPadding=null; private $_cellSpacing=null; private $_gridLines=null; -public function reset() - { - $this->_backImageUrl=null; - $this->_horizontalAlign=null; - $this->_cellPadding=null; - $this->_cellSpacing=null; - $this->_gridLines=null; - } -public function copyFrom($style) - { - parent::copyFrom($style); - if($style instanceof TTableStyle) - { - $this->_backImageUrl=$style->_backImageUrl; - $this->_horizontalAlign=$style->_horizontalAlign; - $this->_cellPadding=$style->_cellPadding; - $this->_cellSpacing=$style->_cellSpacing; - $this->_gridLines=$style->_gridLines; - } - } -public function mergeWith($style) - { - parent::mergeWith($style); - if($style instanceof TTableStyle) - { - if($style->_backImageUrl!==null && $this->_backImageUrl===null) - $this->_backImageUrl=$style->_backImageUrl; - if($style->_horizontalAlign!==null && $this->_horizontalAlign===null) - $this->_horizontalAlign=$style->_horizontalAlign; - if($style->_cellPadding!==null && $this->_cellPadding===null) - $this->_cellPadding=$style->_cellPadding; - if($style->_cellSpacing!==null && $this->_cellSpacing===null) - $this->_cellSpacing=$style->_cellSpacing; - if($style->_gridLines!==null && $this->_gridLines===null) - $this->_gridLines=$style->_gridLines; - } - } -public function addAttributesToRender($writer) - { - if(($url=trim($this->getBackImageUrl()))!=='') - $writer->addStyleAttribute('background-image','url('.$url.')'); -if(($horizontalAlign=$this->getHorizontalAlign())!=='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->getCellSpacing()===0) - $writer->addStyleAttribute('border-collapse','collapse'); - } -switch($this->getGridLines()) - { - case 'Horizontal' : $writer->addAttribute('rules','rows'); break; - case 'Vertical' : $writer->addAttribute('rules','cols'); break; - case 'Both' : $writer->addAttribute('rules','all'); break; - } -parent::addAttributesToRender($writer); - } -public function getBackImageUrl() - { - return $this->_backImageUrl===null?'':$this->_backImageUrl; - } -public function setBackImageUrl($value) - { - $this->_backImageUrl=trim($value)===''?null:$value; - } -public function getHorizontalAlign() - { - return $this->_horizontalAlign===null?'NotSet':$this->_horizontalAlign; - } -public function setHorizontalAlign($value) - { - $this->_horizontalAlign=TPropertyValue::ensureEnum($value,array('NotSet','Left','Right','Center','Justify')); - if($this->_horizontalAlign==='NotSet') - $this->_horizontalAlign=null; - } -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'); - if($this->_cellPadding===-1) - $this->_cellPadding=null; - } -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'); - if($this->_cellSpacing===-1) - $this->_cellSpacing=null; - } -public function getGridLines() - { - return $this->_gridLines===null?'None':$this->_gridLines; - } -public function setGridLines($value) - { - $this->_gridLines=TPropertyValue::ensureEnum($value,array('None', 'Horizontal', 'Vertical', 'Both')); - } -} -class TTableItemStyle extends TStyle +public function reset()
+{
+$this->_backImageUrl=null;
+$this->_horizontalAlign=null;
+$this->_cellPadding=null;
+$this->_cellSpacing=null;
+$this->_gridLines=null;
+} +public function copyFrom($style)
+{
+parent::copyFrom($style);
+if($style instanceof TTableStyle)
+{
+$this->_backImageUrl=$style->_backImageUrl;
+$this->_horizontalAlign=$style->_horizontalAlign;
+$this->_cellPadding=$style->_cellPadding;
+$this->_cellSpacing=$style->_cellSpacing;
+$this->_gridLines=$style->_gridLines;
+}
+} +public function mergeWith($style)
+{
+parent::mergeWith($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;
+}
+} +public function addAttributesToRender($writer)
+{
+if(($url=trim($this->getBackImageUrl()))!=='')
+$writer->addStyleAttribute('background-image','url('.$url.')'); +if(($horizontalAlign=$this->getHorizontalAlign())!=='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->getCellSpacing()===0)
+$writer->addStyleAttribute('border-collapse','collapse');
+} +switch($this->getGridLines())
+{
+case 'Horizontal' : $writer->addAttribute('rules','rows'); break;
+case 'Vertical' : $writer->addAttribute('rules','cols'); break;
+case 'Both' : $writer->addAttribute('rules','all'); break;
+} +parent::addAttributesToRender($writer);
+} +public function getBackImageUrl()
+{
+return $this->_backImageUrl===null?'':$this->_backImageUrl;
+} +public function setBackImageUrl($value)
+{
+$this->_backImageUrl=trim($value)===''?null:$value;
+} +public function getHorizontalAlign()
+{
+return $this->_horizontalAlign===null?'NotSet':$this->_horizontalAlign;
+} +public function setHorizontalAlign($value)
+{
+$this->_horizontalAlign=TPropertyValue::ensureEnum($value,array('NotSet','Left','Right','Center','Justify'));
+if($this->_horizontalAlign==='NotSet')
+$this->_horizontalAlign=null;
+} +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');
+if($this->_cellPadding===-1)
+$this->_cellPadding=null;
+} +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');
+if($this->_cellSpacing===-1)
+$this->_cellSpacing=null;
+} +public function getGridLines()
+{
+return $this->_gridLines===null?'None':$this->_gridLines;
+} +public function setGridLines($value)
+{
+$this->_gridLines=TPropertyValue::ensureEnum($value,array('None', 'Horizontal', 'Vertical', 'Both'));
+}
+} +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); - $this->_verticalAlign=$style->_verticalAlign; - $this->_horizontalAlign=$style->_horizontalAlign; - $this->_wrap=$style->_wrap; - } -public function mergeWith($style) - { - parent::mergeWith($style); - if($style instanceof TTableItemStyle) - { - if($style->_verticalAlign!==null && $this->_verticalAlign===null) - $this->_verticalAlign=$style->_verticalAlign; - if($style->_horizontalAlign!==null && $this->_horizontalAlign===null) - $this->_horizontalAlign=$style->_horizontalAlign; - if($style->_wrap!==null && $this->_wrap===null) - $this->_wrap=$style->_wrap; - } - } -public function addAttributesToRender($writer) - { - if(!$this->getWrap()) - $writer->addStyleAttribute('nowrap','nowrap'); -if(($horizontalAlign=$this->getHorizontalAlign())!=='NotSet') - $writer->addAttribute('align',strtolower($horizontalAlign)); -if(($verticalAlign=$this->getVerticalAlign())!=='NotSet') - $writer->addAttribute('valign',strtolower($verticalAlign)); -parent::addAttributesToRender($writer); - } -public function getHorizontalAlign() - { - return $this->_horizontalAlign===null?'NotSet':$this->_horizontalAlign; - } -public function setHorizontalAlign($value) - { - $this->_horizontalAlign=TPropertyValue::ensureEnum($value,array('NotSet','Left','Right','Center','Justify')); - if($this->_horizontalAlign==='NotSet') - $this->_horizontalAlign=null; - } -public function getVerticalAlign() - { - return $this->_verticalAlign===null?'NotSet':$this->_verticalAlign; - } -public function setVerticalAlign($value) - { - $this->_verticalAlign=TPropertyValue::ensureEnum($value,array('NotSet','Top','Bottom','Middel')); - if($this->_verticalAlign==='NotSet') - $this->_verticalAlign=null; - } -public function getWrap() - { - return $this->_wrap===null?true:$this->_wrap; - } -public function setWrap($value) - { - $this->_wrap=TPropertyValue::ensureBoolean($value); - } -} -?><?php +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)
+{
+$this->_verticalAlign=$style->_verticalAlign;
+$this->_horizontalAlign=$style->_horizontalAlign;
+$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())!=='NotSet')
+$writer->addAttribute('align',strtolower($horizontalAlign)); +if(($verticalAlign=$this->getVerticalAlign())!=='NotSet')
+$writer->addAttribute('valign',strtolower($verticalAlign)); +parent::addAttributesToRender($writer);
+} +public function getHorizontalAlign()
+{
+return $this->_horizontalAlign===null?'NotSet':$this->_horizontalAlign;
+} +public function setHorizontalAlign($value)
+{
+$this->_horizontalAlign=TPropertyValue::ensureEnum($value,array('NotSet','Left','Right','Center','Justify'));
+if($this->_horizontalAlign==='NotSet')
+$this->_horizontalAlign=null;
+} +public function getVerticalAlign()
+{
+return $this->_verticalAlign===null?'NotSet':$this->_verticalAlign;
+} +public function setVerticalAlign($value)
+{
+$this->_verticalAlign=TPropertyValue::ensureEnum($value,array('NotSet','Top','Bottom','Middel'));
+if($this->_verticalAlign==='NotSet')
+$this->_verticalAlign=null;
+} +public function getWrap()
+{
+return $this->_wrap===null?true:$this->_wrap;
+} +public function setWrap($value)
+{
+$this->_wrap=TPropertyValue::ensureBoolean($value);
+}
+} -class TWebControl extends TControl -{ -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 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 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); - } - } -protected function render($writer) - { - $this->renderBeginTag($writer); - $this->renderContents($writer); - $this->renderEndTag($writer); - } -public function renderBeginTag($writer) - { - $this->addAttributesToRender($writer); - $writer->renderBeginTag($this->getTagName()); - } -protected function renderContents($writer) - { - parent::renderChildren($writer); - } -public function renderEndTag($writer) - { - $writer->renderEndTag(); - } -} -?><?php -class TPlaceHolder extends TControl -{ -} -?><?php -class TLiteral extends TControl -{ -public function getText() - { - return $this->getViewState('Text',''); - } -public function setText($value) - { - $this->setViewState('Text',$value,''); - } -public function getEncode() - { - return $this->getViewState('Encode',false); - } -public function setEncode($value) - { - $this->setViewState('Encode',TPropertyValue::ensureBoolean($value),false); - } -protected function render($writer) - { - if(($text=$this->getText())!=='') - { - if($this->getEncode()) - $writer->write(THttpUtility::htmlEncode($text)); - else - $writer->write($text); - } - } -} -?><?php -class TLabel extends TWebControl -{ -protected function getTagName() - { - return ($this->getAssociatedControlID()==='')?'span':'label'; - } -protected function addAttributesToRender($writer) - { - if(($aid=$this->getAssociatedControlID())!=='') - { - if($control=$this->findControl($aid)) - $writer->addAttribute('for',$control->getClientID()); - else - throw new TInvalidDataValueException('label_associatedcontrol_invalid',$aid); - } - parent::addAttributesToRender($writer); - } -protected function renderContents($writer) - { - if(($text=$this->getText())==='') - parent::renderContents($writer); - else - $writer->write($text); - } -public function getText() - { - return $this->getViewState('Text',''); - } -public function setText($value) - { - $this->setViewState('Text',$value,''); - } -public function getAssociatedControlID() - { - return $this->getViewState('AssociatedControlID',''); - } -public function setAssociatedControlID($value) - { - $this->setViewState('AssociatedControlID',$value,''); - } -} -?><?php -class TImage extends TWebControl -{ -protected function getTagName() - { - return 'img'; - } -protected function addAttributesToRender($writer) - { - $writer->addAttribute('src',$this->getImageUrl()); - $writer->addAttribute('alt',$this->getAlternateText()); - if(($desc=$this->getDescriptionUrl())!=='') - $writer->addAttribute('longdesc',$desc); - if(($align=$this->getImageAlign())!=='') - $writer->addAttribute('align',$align); - if(($width=$this->getBorderWidth())==='') - $writer->addStyleAttribute('border-width','0px'); - parent::addAttributesToRender($writer); - } -protected function renderContents($writer) - { - } -public function getAlternateText() - { - return $this->getViewState('AlternateText',''); - } -public function setAlternateText($value) - { - $this->setViewState('AlternateText',$value,''); - } -public function getImageAlign() - { - return $this->getViewState('ImageAlign',''); - } -public function setImageAlign($value) - { - $this->setViewState('ImageAlign',$value,''); - } -public function getImageUrl() - { - return $this->getViewState('ImageUrl',''); - } -public function setImageUrl($value) - { - $this->setViewState('ImageUrl',$value,''); - } -public function getDescriptionUrl() - { - return $this->getViewState('DescriptionUrl',''); - } -public function setDescriptionUrl($value) - { - $this->setViewState('DescriptionUrl',$value,''); - } -} -?><?php +class TWebControl extends TControl
+{ +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 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 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);
+}
+} +protected function render($writer)
+{
+$this->renderBeginTag($writer);
+$this->renderContents($writer);
+$this->renderEndTag($writer);
+} +public function renderBeginTag($writer)
+{
+$this->addAttributesToRender($writer);
+$writer->renderBeginTag($this->getTagName());
+} +protected function renderContents($writer)
+{
+parent::renderChildren($writer);
+} +public function renderEndTag($writer)
+{
+$writer->renderEndTag();
+}
+} + +class TPlaceHolder extends TControl
+{
+} + +class TLiteral extends TControl
+{ +public function getText()
+{
+return $this->getViewState('Text','');
+} +public function setText($value)
+{
+$this->setViewState('Text',$value,'');
+} +public function getEncode()
+{
+return $this->getViewState('Encode',false);
+} +public function setEncode($value)
+{
+$this->setViewState('Encode',TPropertyValue::ensureBoolean($value),false);
+} +protected function render($writer)
+{
+if(($text=$this->getText())!=='')
+{
+if($this->getEncode())
+$writer->write(THttpUtility::htmlEncode($text));
+else
+$writer->write($text);
+}
+}
+} -class TImageButton extends TImage implements IPostBackDataHandler, IPostBackEventHandler +class TLabel extends TWebControl
+{ +protected function getTagName()
+{
+return ($this->getForControl()==='')?'span':'label';
+} +protected function addAttributesToRender($writer)
+{
+if(($aid=$this->getForControl())!=='')
+{
+if($control=$this->findControl($aid))
+$writer->addAttribute('for',$control->getClientID());
+else
+throw new TInvalidDataValueException('label_associatedcontrol_invalid',$aid);
+}
+parent::addAttributesToRender($writer);
+} +protected function renderContents($writer)
+{
+if(($text=$this->getText())==='')
+parent::renderContents($writer);
+else
+$writer->write($text);
+} +public function getText()
+{
+return $this->getViewState('Text','');
+} +public function setText($value)
+{
+$this->setViewState('Text',$value,'');
+} +public function getForControl()
+{
+return $this->getViewState('ForControl','');
+} +public function setForControl($value)
+{
+$this->setViewState('ForControl',$value,'');
+}
+} + +class TImage extends TWebControl
+{ +protected function getTagName()
+{
+return 'img';
+} +protected function addAttributesToRender($writer)
+{
+$writer->addAttribute('src',$this->getImageUrl());
+$writer->addAttribute('alt',$this->getAlternateText());
+if(($desc=$this->getDescriptionUrl())!=='')
+$writer->addAttribute('longdesc',$desc);
+if(($align=$this->getImageAlign())!=='')
+$writer->addAttribute('align',$align);
+if(($width=$this->getBorderWidth())==='')
+$writer->addStyleAttribute('border-width','0px');
+parent::addAttributesToRender($writer);
+} +protected function renderContents($writer)
+{
+} +public function getAlternateText()
+{
+return $this->getViewState('AlternateText','');
+} +public function setAlternateText($value)
+{
+$this->setViewState('AlternateText',$value,'');
+} +public function getImageAlign()
+{
+return $this->getViewState('ImageAlign','');
+} +public function setImageAlign($value)
+{
+$this->setViewState('ImageAlign',$value,'');
+} +public function getImageUrl()
+{
+return $this->getViewState('ImageUrl','');
+} +public function setImageUrl($value)
+{
+$this->setViewState('ImageUrl',$value,'');
+} +public function getDescriptionUrl()
+{
+return $this->getViewState('DescriptionUrl','');
+} +public function setDescriptionUrl($value)
+{
+$this->setViewState('DescriptionUrl',$value,'');
+}
+} + +class TImageButton extends TImage implements IPostBackDataHandler, IPostBackEventHandler
{ private $_x=0; private $_y=0; -protected function getTagName() - { - return 'input'; - } -protected function addAttributesToRender($writer) - { - $page=$this->getPage(); - $page->ensureRenderInForm($this); - $writer->addAttribute('type','image'); - if(($uniqueID=$this->getUniqueID())!=='') - $writer->addAttribute('name',$uniqueID); - if($this->getEnabled(true)) - { - $scripts = $this->getPage()->getClientScript(); - $options = $this->getPostBackOptions(); - $postback = $scripts->getPostBackEventReference($this, '', $options, false); - $scripts->registerClientEvent($this, "click", $postback); - } - else if($this->getEnabled()) $writer->addAttribute('disabled','disabled'); - parent::addAttributesToRender($writer); - } -public function getPostBackOptions() - { - $options=new TPostBackOptions(); - if($this->getCausesValidation() && $this->getPage()->getValidators($this->getValidationGroup())->getCount()>0) - { - $options->setPerformValidation(true); - $options->setValidationGroup($this->getValidationGroup()); - } - if($this->getPostBackUrl()!=='') - $options->setActionUrl($this->getPostBackUrl()); - $options->setClientSubmit(false); - return $options; - } -public function loadPostData($key,$values) - { - $uid=$this->getUniqueID(); - if(isset($values["{$uid}_x"]) && isset($values["{$uid}_y"])) - { - $this->_x=intval($values["{$uid}_x"]); - $this->_y=intval($values["{$uid}_y"]); - $this->getPage()->setPostBackEventTarget($this); - } - return false; - } -public function raisePostDataChangedEvent() - { - } -public function onClick($param) - { - $this->raiseEvent('OnClick',$this,$param); - } -public function onCommand($param) - { - $this->raiseEvent('OnCommand',$this,$param); - $this->raiseBubbleEvent($this,$param); - } -public function raisePostBackEvent($param) - { - if($this->getCausesValidation()) - $this->getPage()->validate($this->getValidationGroup()); - $this->onClick(new TImageClickEventParameter($this->_x,$this->_y)); - $this->onCommand(new TCommandEventParameter($this->getCommandName(),$this->getCommandParameter())); - } -public function getCausesValidation() - { - return $this->getViewState('CausesValidation',true); - } -public function setCausesValidation($value) - { - $this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true); - } -public function getCommandName() - { - return $this->getViewState('CommandName',''); - } -public function setCommandName($value) - { - $this->setViewState('CommandName',$value,''); - } -public function getCommandParameter() - { - return $this->getViewState('CommandParameter',''); - } -public function setCommandParameter($value) - { - $this->setViewState('CommandParameter',$value,''); - } -public function getValidationGroup() - { - return $this->getViewState('ValidationGroup',''); - } -public function setValidationGroup($value) - { - $this->setViewState('ValidationGroup',$value,''); - } -public function getPostBackUrl() - { - return $this->getViewState('PostBackUrl',''); - } -public function setPostBackUrl($value) - { - $this->setViewState('PostBackUrl',$value,''); - } -public function getText() - { - return $this->getAlternateText(); - } -public function setText($value) - { - $this->setAlternateText($value); - } -protected function onPreRender($param) - { - parent::onPreRender($param); - $this->getPage()->registerRequiresPostData($this); - } -} -class TImageClickEventParameter extends TEventParameter +protected function getTagName()
+{
+return 'input';
+} +protected function addAttributesToRender($writer)
+{
+$page=$this->getPage();
+$page->ensureRenderInForm($this);
+$writer->addAttribute('type','image');
+if(($uniqueID=$this->getUniqueID())!=='')
+$writer->addAttribute('name',$uniqueID);
+if($this->getEnabled(true))
+{
+if($this->canCauseValidation())
+{
+$writer->addAttribute('id',$this->getClientID());
+$this->getPage()->getClientScript()->registerPostBackControl($this);
+}
+}
+else if($this->getEnabled()) $writer->addAttribute('disabled','disabled');
+parent::addAttributesToRender($writer);
+} +protected function canCauseValidation()
+{
+if($this->getCausesValidation())
+{
+$group=$this->getValidationGroup();
+return $this->getPage()->getValidators($group)->getCount()>0;
+}
+else
+return false;
+} +public function getPostBackOptions()
+{
+$options['CausesValidation'] = $this->getCausesValidation();
+$options['ValidationGroup'] = $this->getValidationGroup(); +return $options;
+} +public function loadPostData($key,$values)
+{
+$uid=$this->getUniqueID();
+if(isset($values["{$uid}_x"]) && isset($values["{$uid}_y"]))
+{
+$this->_x=intval($values["{$uid}_x"]);
+$this->_y=intval($values["{$uid}_y"]);
+$this->getPage()->setPostBackEventTarget($this);
+}
+return false;
+} +public function raisePostDataChangedEvent()
+{
+} +public function onClick($param)
+{
+$this->raiseEvent('OnClick',$this,$param);
+} +public function onCommand($param)
+{
+$this->raiseEvent('OnCommand',$this,$param);
+$this->raiseBubbleEvent($this,$param);
+} +public function raisePostBackEvent($param)
+{
+if($this->getCausesValidation())
+$this->getPage()->validate($this->getValidationGroup());
+$this->onClick(new TImageClickEventParameter($this->_x,$this->_y));
+$this->onCommand(new TCommandEventParameter($this->getCommandName(),$this->getCommandParameter()));
+} +public function getCausesValidation()
+{
+return $this->getViewState('CausesValidation',true);
+} +public function setCausesValidation($value)
+{
+$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);
+} +public function getCommandName()
+{
+return $this->getViewState('CommandName','');
+} +public function setCommandName($value)
+{
+$this->setViewState('CommandName',$value,'');
+} +public function getCommandParameter()
+{
+return $this->getViewState('CommandParameter','');
+} +public function setCommandParameter($value)
+{
+$this->setViewState('CommandParameter',$value,'');
+} +public function getValidationGroup()
+{
+return $this->getViewState('ValidationGroup','');
+} +public function setValidationGroup($value)
+{
+$this->setViewState('ValidationGroup',$value,'');
+} +public function getText()
+{
+return $this->getAlternateText();
+} +public function setText($value)
+{
+$this->setAlternateText($value);
+} +public function onPreRender($param)
+{
+parent::onPreRender($param);
+$this->getPage()->registerRequiresPostData($this);
+} +protected function renderContents($writer)
+{
+}
+} +class TImageClickEventParameter extends TEventParameter
{ public $_x=0; public $_y=0; -public function __construct($x,$y) - { - $this->_x=$x; - $this->_y=$y; - } -public function getX() - { - return $this->_x; - } -public function setX($value) - { - $this->_x=TPropertyValue::ensureInteger($value); - } -public function getY() - { - return $this->_y; - } -public function setY($value) - { - $this->_y=TPropertyValue::ensureInteger($value); - } -} -?><?php -class TButton extends TWebControl implements IPostBackEventHandler -{ -protected function getTagName() - { - return 'input'; - } -protected function addAttributesToRender($writer) - { - $page=$this->getPage(); - $page->ensureRenderInForm($this); - $writer->addAttribute('type','submit'); - if(($uniqueID=$this->getUniqueID())!=='') - $writer->addAttribute('name',$uniqueID); - $writer->addAttribute('value',$this->getText()); - if($this->getEnabled(true)) - { - if($this->canCauseValidation()) - $this->getPage()->getClientScript()->registerPostBackControl($this); - } - else if($this->getEnabled()) $writer->addAttribute('disabled','disabled'); -$writer->addAttribute('id',$this->getClientID()); - parent::addAttributesToRender($writer); - } -protected function canCauseValidation() - { - $group = $this->getValidationGroup(); - $hasValidators = $this->getPage()->getValidators($group)->getCount()>0; - return $this->getCausesValidation() && $hasValidators; - } -public function getPostBackOptions() - { - $options['CausesValidation'] = $this->getCausesValidation(); - $options['ValidationGroup'] = $this->getValidationGroup(); -return $options; - } -protected function renderContents($writer) - { - } -public function onClick($param) - { - $this->raiseEvent('OnClick',$this,$param); - } -public function onCommand($param) - { - $this->raiseEvent('OnCommand',$this,$param); - $this->raiseBubbleEvent($this,$param); - } -public function raisePostBackEvent($param) - { - if($this->getCausesValidation()) - $this->getPage()->validate($this->getValidationGroup()); - $this->onClick(null); - $this->onCommand(new TCommandEventParameter($this->getCommandName(),$this->getCommandParameter())); - } -public function getText() - { - return $this->getViewState('Text',''); - } -public function setText($value) - { - $this->setViewState('Text',$value,''); - } -public function getCausesValidation() - { - return $this->getViewState('CausesValidation',true); - } -public function setCausesValidation($value) - { - $this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true); - } -public function getCommandName() - { - return $this->getViewState('CommandName',''); - } -public function setCommandName($value) - { - $this->setViewState('CommandName',$value,''); - } -public function getCommandParameter() - { - return $this->getViewState('CommandParameter',''); - } -public function setCommandParameter($value) - { - $this->setViewState('CommandParameter',$value,''); - } -public function getValidationGroup() - { - return $this->getViewState('ValidationGroup',''); - } -public function setValidationGroup($value) - { - $this->setViewState('ValidationGroup',$value,''); - } -} -?><?php -class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatable -{ -protected function getTagName() - { - return 'input'; - } -public function loadPostData($key,$values) - { - $checked=$this->getChecked(); - if(isset($values[$key])!=$checked) - { - $this->setChecked(!$checked); - return true; - } - else - return false; - } -public function raisePostDataChangedEvent() - { - $page=$this->getPage(); - if($this->getAutoPostBack() && !$page->getPostBackEventTarget()) - { - $page->setPostBackEventTarget($this); - if($this->getCausesValidation()) - $page->validate($this->getValidationGroup()); - } - $this->onCheckedChanged(null); - } -protected function onCheckedChanged($param) - { - $this->raiseEvent('OnCheckedChanged',$this,$param); - } -protected function onPreRender($param) - { - parent::onPreRender($param); - if($this->getEnabled(true)) - $this->getPage()->registerRequiresPostData($this); - } -public function getValidationPropertyValue() - { - return $this->getChecked(); - } -public function getText() - { - return $this->getViewState('Text',''); - } -public function setText($value) - { - $this->setViewState('Text',$value,''); - } -public function getTextAlign() - { - return $this->getViewState('TextAlign','Right'); - } -public function setTextAlign($value) - { - $this->setViewState('TextAlign',TPropertyValue::ensureEnum($value,array('Left','Right')),'Right'); - } -public function getChecked() - { - return $this->getViewState('Checked',false); - } -public function setChecked($value) - { - $this->setViewState('Checked',$value,false); - } -public function getAutoPostBack() - { - return $this->getViewState('AutoPostBack',false); - } -public function setAutoPostBack($value) - { - $this->setViewState('AutoPostBack',$value,false); - } -public function getCausesValidation() - { - return $this->getViewState('CausesValidation',true); - } -public function setCausesValidation($value) - { - $this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true); - } -public function getValidationGroup() - { - return $this->getViewState('ValidationGroup',''); - } -public function setValidationGroup($value) - { - $this->setViewState('ValidationGroup',$value,''); - } -protected function render($writer) - { - $this->addAttributesToRender($writer); - $this->getPage()->ensureRenderInForm($this); - $needSpan=false; - if($this->getHasStyle()) - { - $this->getStyle()->addAttributesToRender($writer); - $needSpan=true; - } - if(!$this->getEnabled(true)) - { - $writer->addAttribute('disabled','disabled'); - $needSpan=true; - } - if(($tooltip=$this->getToolTip())!=='') - { - $writer->addAttribute('title',$tooltip); - $needSpan=true; - } - $onclick=null; - if($this->getHasAttributes()) - { - $attributes=$this->getAttributes(); - $value=$attributes->remove('value'); - $onclick=$attributes->remove('onclick'); - if($attributes->getCount()) - { - $writer->addAttributes($attributes); - $needSpan=true; - } - if($value!==null) - $attributes->add('value',$value); - } - if($needSpan) - $writer->renderBeginTag('span'); - $clientID=$this->getClientID(); - if(($text=$this->getText())!=='') - { - if($this->getTextAlign()==='Left') - { - $this->renderLabel($writer,$clientID,$text); - $this->renderInputTag($writer,$clientID,$onclick); - } - else - { - $this->renderInputTag($writer,$clientID,$onclick); - $this->renderLabel($writer,$clientID,$text); - } - } - else - $this->renderInputTag($writer,$clientID,$onclick); - if($needSpan) - $writer->renderEndTag(); - } -public function getLabelAttributes() - { - if($attributes=$this->getViewState('LabelAttributes',null)) - return $attributes; - else - { - $attributes=new TMap; - $this->setViewState('LabelAttributes',$attributes,null); - return $attributes; - } - } -public function getInputAttributes() - { - if($attributes=$this->getViewState('InputAttributes',null)) - return $attributes; - else - { - $attributes=new TMap; - $this->setViewState('InputAttributes',$attributes,null); - return $attributes; - } - } -protected function renderLabel($writer,$clientID,$text) - { - $writer->addAttribute('for',$clientID); - if($attributes=$this->getViewState('LabelAttributes',null)) - $writer->addAttributes($attributes); - $writer->renderBeginTag('label'); - $writer->write($text); - $writer->renderEndTag(); - } -protected function renderInputTag($writer,$clientID,$onclick) - { - if($clientID!=='') - $writer->addAttribute('id',$clientID); - $writer->addAttribute('type','checkbox'); - if(($uniqueID=$this->getUniqueID())!=='') - $writer->addAttribute('name',$uniqueID); - if($this->getChecked()) - $writer->addAttribute('checked','checked'); - if(!$this->getEnabled(true)) - $writer->addAttribute('disabled','disabled'); -$page=$this->getPage(); - if($this->getAutoPostBack() && $page->getClientSupportsJavaScript()) - $page->getClientScript()->registerPostBackControl($this); -if(($accesskey=$this->getAccessKey())!=='') - $writer->addAttribute('accesskey',$accesskey); - if(($tabindex=$this->getTabIndex())>0) - $writer->addAttribute('tabindex',"$tabindex"); - if($attributes=$this->getViewState('InputAttributes',null)) - $writer->addAttributes($attributes); - $writer->renderBeginTag('input'); - $writer->renderEndTag(); - } -public function getPostBackOptions() - { - $options['ValidationGroup'] = $this->getValidationGroup(); - $options['CausesValidation'] = $this->getCausesValidation(); - $options['EventTarget'] = $this->getUniqueID(); - return $options; - } -} -?><?php +public function __construct($x,$y)
+{
+$this->_x=$x;
+$this->_y=$y;
+} +public function getX()
+{
+return $this->_x;
+} +public function setX($value)
+{
+$this->_x=TPropertyValue::ensureInteger($value);
+} +public function getY()
+{
+return $this->_y;
+} +public function setY($value)
+{
+$this->_y=TPropertyValue::ensureInteger($value);
+}
+} +class TButton extends TWebControl implements IPostBackEventHandler
+{ +protected function getTagName()
+{
+return 'input';
+} +protected function addAttributesToRender($writer)
+{
+$page=$this->getPage();
+$page->ensureRenderInForm($this);
+$writer->addAttribute('type','submit');
+if(($uniqueID=$this->getUniqueID())!=='')
+$writer->addAttribute('name',$uniqueID);
+$writer->addAttribute('value',$this->getText());
+if($this->getEnabled(true))
+{
+if($this->canCauseValidation())
+{
+$writer->addAttribute('id',$this->getClientID());
+$this->getPage()->getClientScript()->registerPostBackControl($this);
+}
+}
+else if($this->getEnabled()) $writer->addAttribute('disabled','disabled'); +parent::addAttributesToRender($writer);
+} +protected function canCauseValidation()
+{
+if($this->getCausesValidation())
+{
+$group=$this->getValidationGroup();
+return $this->getPage()->getValidators($group)->getCount()>0;
+}
+else
+return false;
+} +public function getPostBackOptions()
+{
+$options['CausesValidation'] = $this->getCausesValidation();
+$options['ValidationGroup'] = $this->getValidationGroup(); +return $options;
+} +protected function renderContents($writer)
+{
+} +public function onClick($param)
+{
+$this->raiseEvent('OnClick',$this,$param);
+} +public function onCommand($param)
+{
+$this->raiseEvent('OnCommand',$this,$param);
+$this->raiseBubbleEvent($this,$param);
+} +public function raisePostBackEvent($param)
+{
+if($this->getCausesValidation())
+$this->getPage()->validate($this->getValidationGroup());
+$this->onClick(null);
+$this->onCommand(new TCommandEventParameter($this->getCommandName(),$this->getCommandParameter()));
+} +public function getText()
+{
+return $this->getViewState('Text','');
+} +public function setText($value)
+{
+$this->setViewState('Text',$value,'');
+} +public function getCausesValidation()
+{
+return $this->getViewState('CausesValidation',true);
+} +public function setCausesValidation($value)
+{
+$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);
+} +public function getCommandName()
+{
+return $this->getViewState('CommandName','');
+} +public function setCommandName($value)
+{
+$this->setViewState('CommandName',$value,'');
+} +public function getCommandParameter()
+{
+return $this->getViewState('CommandParameter','');
+} +public function setCommandParameter($value)
+{
+$this->setViewState('CommandParameter',$value,'');
+} +public function getValidationGroup()
+{
+return $this->getViewState('ValidationGroup','');
+} +public function setValidationGroup($value)
+{
+$this->setViewState('ValidationGroup',$value,'');
+}
+} -class TRadioButton extends TCheckBox +class TCheckBox extends TWebControl implements IPostBackDataHandler, IValidatable
+{ +protected function getTagName()
+{
+return 'input';
+} +public function loadPostData($key,$values)
+{
+$checked=$this->getChecked();
+if(isset($values[$key])!=$checked)
+{
+$this->setChecked(!$checked);
+return true;
+}
+else
+return false;
+} +public function raisePostDataChangedEvent()
+{
+if($this->getAutoPostBack() && $this->getCausesValidation())
+$this->getPage()->validate($this->getValidationGroup());
+$this->onCheckedChanged(null);
+} +public function onCheckedChanged($param)
+{
+$this->raiseEvent('OnCheckedChanged',$this,$param);
+} +public function onPreRender($param)
+{
+parent::onPreRender($param);
+if($this->getEnabled(true))
+$this->getPage()->registerRequiresPostData($this);
+} +public function getValidationPropertyValue()
+{
+return $this->getChecked();
+} +public function getText()
+{
+return $this->getViewState('Text','');
+} +public function setText($value)
+{
+$this->setViewState('Text',$value,'');
+} +public function getTextAlign()
+{
+return $this->getViewState('TextAlign','Right');
+} +public function setTextAlign($value)
+{
+$this->setViewState('TextAlign',TPropertyValue::ensureEnum($value,array('Left','Right')),'Right');
+} +public function getChecked()
+{
+return $this->getViewState('Checked',false);
+} +public function setChecked($value)
+{
+$this->setViewState('Checked',TPropertyValue::ensureBoolean($value),false);
+} +public function getAutoPostBack()
+{
+return $this->getViewState('AutoPostBack',false);
+} +public function setAutoPostBack($value)
+{
+$this->setViewState('AutoPostBack',TPropertyValue::ensureBoolean($value),false);
+} +public function getCausesValidation()
+{
+return $this->getViewState('CausesValidation',true);
+} +public function setCausesValidation($value)
+{
+$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);
+} +public function getValidationGroup()
+{
+return $this->getViewState('ValidationGroup','');
+} +public function setValidationGroup($value)
+{
+$this->setViewState('ValidationGroup',$value,'');
+} +protected function render($writer)
+{
+$this->addAttributesToRender($writer);
+$this->getPage()->ensureRenderInForm($this);
+$needSpan=false;
+if($this->getHasStyle())
+{
+$this->getStyle()->addAttributesToRender($writer);
+$needSpan=true;
+}
+if(!$this->getEnabled(true))
+{
+$writer->addAttribute('disabled','disabled');
+$needSpan=true;
+}
+if(($tooltip=$this->getToolTip())!=='')
+{
+$writer->addAttribute('title',$tooltip);
+$needSpan=true;
+}
+if($this->getHasAttributes())
+{
+$attributes=$this->getAttributes();
+$value=$attributes->remove('value');
+if($attributes->getCount())
+{
+$writer->addAttributes($attributes);
+$needSpan=true;
+}
+if($value!==null)
+$attributes->add('value',$value);
+}
+if($needSpan)
+$writer->renderBeginTag('span');
+$clientID=$this->getClientID();
+if(($text=$this->getText())!=='')
+{
+if($this->getTextAlign()==='Left')
+{
+$this->renderLabel($writer,$clientID,$text);
+$this->renderInputTag($writer,$clientID);
+}
+else
+{
+$this->renderInputTag($writer,$clientID);
+$this->renderLabel($writer,$clientID,$text);
+}
+}
+else
+$this->renderInputTag($writer,$clientID);
+if($needSpan)
+$writer->renderEndTag();
+} +public function getLabelAttributes()
+{
+if($attributes=$this->getViewState('LabelAttributes',null))
+return $attributes;
+else
+{
+$attributes=new TAttributeCollection;
+$this->setViewState('LabelAttributes',$attributes,null);
+return $attributes;
+}
+} +public function getInputAttributes()
+{
+if($attributes=$this->getViewState('InputAttributes',null))
+return $attributes;
+else
+{
+$attributes=new TAttributeCollection;
+$this->setViewState('InputAttributes',$attributes,null);
+return $attributes;
+}
+} +protected function getValueAttribute()
+{
+$attributes=$this->getViewState('InputAttributes',null);
+if($attributes && $attributes->contains('value'))
+$value=$attributes->itemAt('value');
+else if($this->hasAttribute('value'))
+$value=$this->getAttribute('value');
+else
+$value='';
+return $value===''?$this->getUniqueID():$value;
+} +protected function renderLabel($writer,$clientID,$text)
+{
+$writer->addAttribute('for',$clientID);
+if($attributes=$this->getViewState('LabelAttributes',null))
+$writer->addAttributes($attributes);
+$writer->renderBeginTag('label');
+$writer->write($text);
+$writer->renderEndTag();
+} +protected function renderInputTag($writer,$clientID)
+{
+if($clientID!=='')
+$writer->addAttribute('id',$clientID);
+$writer->addAttribute('type','checkbox');
+$writer->addAttribute('value',$this->getValueAttribute());
+if(($uniqueID=$this->getUniqueID())!=='')
+$writer->addAttribute('name',$uniqueID);
+if($this->getChecked())
+$writer->addAttribute('checked','checked');
+if(!$this->getEnabled(true))
+$writer->addAttribute('disabled','disabled'); +$page=$this->getPage();
+if($this->getEnabled(true) && $this->getAutoPostBack() && $page->getClientSupportsJavaScript())
+$page->getClientScript()->registerPostBackControl($this); +if(($accesskey=$this->getAccessKey())!=='')
+$writer->addAttribute('accesskey',$accesskey);
+if(($tabindex=$this->getTabIndex())>0)
+$writer->addAttribute('tabindex',"$tabindex");
+if($attributes=$this->getViewState('InputAttributes',null))
+$writer->addAttributes($attributes);
+$writer->renderBeginTag('input');
+$writer->renderEndTag();
+} +public function getPostBackOptions()
+{
+$options['ValidationGroup'] = $this->getValidationGroup();
+$options['CausesValidation'] = $this->getCausesValidation();
+$options['EventTarget'] = $this->getUniqueID();
+return $options;
+} +} + +class TRadioButton extends TCheckBox
{ private $_uniqueGroupName=null; -public function loadPostData($key,$values) - { - $uniqueGroupName=$this->getUniqueGroupName(); - $value=isset($values[$uniqueGroupName])?$values[$uniqueGroupName]:null; - if($value!==null && $value===$this->getValueAttribute()) - { - if(!$this->getChecked()) - { - $this->setChecked(true); - return true; - } - else - return false; - } - else if($this->getChecked()) - $this->setChecked(false); - return false; - } -public function getGroupName() - { - return $this->getViewState('GroupName',''); - } -public function setGroupName($value) - { - $this->setViewState('GroupName',$value,''); - } -private function getUniqueGroupName() - { - if($this->_uniqueGroupName===null) - { - $groupName=$this->getGroupName(); - $uniqueID=$this->getUniqueID(); - if($uniqueID!=='') - { - if(($pos=strrpos($uniqueID,TControl::ID_SEPARATOR))!==false) - { - if($groupName!=='') - $groupName=substr($uniqueID,0,$pos+1).$groupName; - else if($this->getNamingContainer() instanceof TRadioButtonList) - $groupName=substr($uniqueID,0,$pos); - } - if($groupName==='') - $groupName=$uniqueID; - } - $this->_uniqueGroupName=$groupName; - } - return $this->_uniqueGroupName; - } -private function getValueAttribute() - { - if(($value=$this->getAttribute('value'))===null) - { - $value=$this->getID(); - return $value===''?$this->getUniqueID():$value; - } - else - return $value; - } -protected function renderInputTag($writer,$clientID,$onclick) - { - if($clientID!=='') - $writer->addAttribute('id',$clientID); - $writer->addAttribute('type','radio'); - $writer->addAttribute('name',$this->getUniqueGroupName()); - $writer->addAttribute('value',$this->getValueAttribute()); - if($this->getChecked()) - $writer->addAttribute('checked','checked'); - if(!$this->getEnabled(true)) - $writer->addAttribute('disabled','disabled'); -$page=$this->getPage(); - if($this->getAutoPostBack() && $page->getClientSupportsJavaScript()) - $page->getClientScript()->registerPostBackControl($this); -if(($accesskey=$this->getAccessKey())!=='') - $writer->addAttribute('accesskey',$accesskey); - if(($tabindex=$this->getTabIndex())>0) - $writer->addAttribute('tabindex',"$tabindex"); - if($attributes=$this->getViewState('InputAttributes',null)) - $writer->addAttributes($attributes); - $writer->renderBeginTag('input'); - $writer->renderEndTag(); - } -} -?><?php -class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable +public function loadPostData($key,$values)
+{
+$uniqueGroupName=$this->getUniqueGroupName();
+$value=isset($values[$uniqueGroupName])?$values[$uniqueGroupName]:null;
+if($value!==null && $value===$this->getValueAttribute())
+{
+if(!$this->getChecked())
+{
+$this->setChecked(true);
+return true;
+}
+else
+return false;
+}
+else if($this->getChecked())
+$this->setChecked(false);
+return false;
+} +public function getGroupName()
+{
+return $this->getViewState('GroupName','');
+} +public function setGroupName($value)
+{
+$this->setViewState('GroupName',$value,'');
+} +private function getUniqueGroupName()
+{
+if($this->_uniqueGroupName===null)
+{
+$groupName=$this->getGroupName();
+$uniqueID=$this->getUniqueID();
+if($uniqueID!=='')
+{
+if(($pos=strrpos($uniqueID,TControl::ID_SEPARATOR))!==false)
+{
+if($groupName!=='')
+$groupName=substr($uniqueID,0,$pos+1).$groupName;
+else if($this->getNamingContainer() instanceof TRadioButtonList)
+$groupName=substr($uniqueID,0,$pos);
+}
+if($groupName==='')
+$groupName=$uniqueID;
+}
+$this->_uniqueGroupName=$groupName;
+}
+return $this->_uniqueGroupName;
+} +protected function renderInputTag($writer,$clientID)
+{
+if($clientID!=='')
+$writer->addAttribute('id',$clientID);
+$writer->addAttribute('type','radio');
+$writer->addAttribute('name',$this->getUniqueGroupName());
+$writer->addAttribute('value',$this->getValueAttribute());
+if($this->getChecked())
+$writer->addAttribute('checked','checked');
+if(!$this->getEnabled(true))
+$writer->addAttribute('disabled','disabled'); +$page=$this->getPage();
+if($this->getEnabled(true) && $this->getAutoPostBack() && $page->getClientSupportsJavaScript())
+$page->getClientScript()->registerPostBackControl($this); +if(($accesskey=$this->getAccessKey())!=='')
+$writer->addAttribute('accesskey',$accesskey);
+if(($tabindex=$this->getTabIndex())>0)
+$writer->addAttribute('tabindex',"$tabindex");
+if($attributes=$this->getViewState('InputAttributes',null))
+$writer->addAttributes($attributes);
+$writer->renderBeginTag('input');
+$writer->renderEndTag();
+}
+} + +class TTextBox extends TWebControl implements IPostBackDataHandler, IValidatable
{ const DEFAULT_ROWS=4; const DEFAULT_COLUMNS=20; private static $_autoCompleteTypes=array('BusinessCity','BusinessCountryRegion','BusinessFax','BusinessPhone','BusinessState','BusinessStreetAddress','BusinessUrl','BusinessZipCode','Cellular','Company','Department','Disabled','DisplayName','Email','FirstName','Gender','HomeCity','HomeCountryRegion','HomeFax','Homepage','HomePhone','HomeState','HomeStreetAddress','HomeZipCode','JobTitle','LastName','MiddleName','None','Notes','Office','Pager','Search'); private static $_safeTextParser=null; private $_safeText; -protected function getTagName() - { - return ($this->getTextMode()==='MultiLine')?'textarea':'input'; - } -protected function addAttributesToRender($writer) - { - $page=$this->getPage(); - $page->ensureRenderInForm($this); - if(($uid=$this->getUniqueID())!=='') - $writer->addAttribute('name',$uid); - if(($textMode=$this->getTextMode())==='MultiLine') - { - if(($rows=$this->getRows())<=0) - $rows=self::DEFAULT_ROWS; - if(($cols=$this->getColumns())<=0) - $cols=self::DEFAULT_COLUMNS; - $writer->addAttribute('rows',"$rows"); - $writer->addAttribute('cols',"$cols"); - if(!$this->getWrap()) - $writer->addAttribute('wrap','off'); - } - else - { - if($textMode==='SingleLine') - { - $writer->addAttribute('type','text'); - if(($text=$this->getText())!=='') - $writer->addAttribute('value',$text); - if(($act=$this->getAutoCompleteType())!=='None') - { - if($act==='Disabled') - $writer->addAttribute('autocomplete','off'); - else if($act==='Search') - $writer->addAttribute('vcard_name','search'); - else if($act==='HomeCountryRegion') - $writer->addAttribute('vcard_name','HomeCountry'); - else if($act==='BusinessCountryRegion') - $writer->addAttribute('vcard_name','BusinessCountry'); - else - { - if(($pos=strpos($act,'Business'))===0) - $act='Business'.'.'.substr($act,8); - else if(($pos=strpos($act,'Home'))===0) - $act='Home'.'.'.substr($act,4); - $writer->addAttribute('vcard_name','vCard.'.$act); - } - } - } - else - { - $writer->addAttribute('type','password'); - } - if(($cols=$this->getColumns())>0) - $writer->addAttribute('size',"$cols"); - if(($maxLength=$this->getMaxLength())>0) - $writer->addAttribute('maxlength',"$maxLength"); - } - if($this->getReadOnly()) - $writer->addAttribute('readonly','readonly'); - if(!$this->getEnabled(true) && $this->getEnabled()) $writer->addAttribute('disabled','disabled'); - if($this->getAutoPostBack() && $page->getClientSupportsJavaScript()) - { - $writer->addAttribute('id',$this->getClientID()); - $this->getPage()->getClientScript()->registerPostBackControl($this); -} - parent::addAttributesToRender($writer); - } -public function getPostBackOptions() - { - $options['EventTarget'] = $this->getUniqueID(); - $options['CausesValidation'] = $this->getCausesValidation(); - $options['ValidationGroup'] = $this->getValidationGroup(); - $options['TextMode'] = $this->getTextMode(); - return $options; -} -public function loadPostData($key,$values) - { - $value=$values[$key]; - if(!$this->getReadOnly() && $this->getText()!==$value) - { - $this->setText($value); - return true; - } - else - return false; - } -public function getValidationPropertyValue() - { - return $this->getText(); - } -protected function onTextChanged($param) - { - $this->raiseEvent('OnTextChanged',$this,$param); - } -public function raisePostDataChangedEvent() - { - if($this->getAutoPostBack() && $this->getCausesValidation()) - $this->getPage()->validate($this->getValidationGroup()); - $this->onTextChanged(null); - } -protected function renderContents($writer) - { - if($this->getTextMode()==='MultiLine') - $writer->write(THttpUtility::htmlEncode($this->getText())); - } -public function getAutoCompleteType() - { - return $this->getViewState('AutoCompleteType','None'); - } -public function setAutoCompleteType($value) - { - $this->setViewState('AutoCompleteType',TPropertyValue::ensureEnum($value,self::$_autoCompleteTypes),'None'); - } -public function getAutoPostBack() - { - return $this->getViewState('AutoPostBack',false); - } -public function setAutoPostBack($value) - { - $this->setViewState('AutoPostBack',TPropertyValue::ensureBoolean($value),false); - } -public function getCausesValidation() - { - return $this->getViewState('CausesValidation',true); - } -public function setCausesValidation($value) - { - $this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true); - } -public function getColumns() - { - return $this->getViewState('Columns',0); - } -public function setColumns($value) - { - $this->setViewState('Columns',TPropertyValue::ensureInteger($value),0); - } -public function getMaxLength() - { - return $this->getViewState('MaxLength',0); - } -public function setMaxLength($value) - { - $this->setViewState('MaxLength',TPropertyValue::ensureInteger($value),0); - } -public function getReadOnly() - { - return $this->getViewState('ReadOnly',false); - } -public function setReadOnly($value) - { - $this->setViewState('ReadOnly',TPropertyValue::ensureBoolean($value),false); - } -public function getRows() - { - return $this->getViewState('Rows',self::DEFAULT_ROWS); - } -public function setRows($value) - { - $this->setViewState('Rows',TPropertyValue::ensureInteger($value),self::DEFAULT_ROWS); - } -public function getText() - { - return $this->getViewState('Text',''); - } -public function setText($value) - { - $this->setViewState('Text',$value,''); - $this->_safeText = null; - } -public function getSafeText() - { - if($this->_safeText===null) - $this->_safeText=$this->getSafeTextParser()->parse($this->getText()); - return $this->_safeText; - } -protected function getSafeTextParser() - { - if(!self::$_safeTextParser) - self::$_safeTextParser=Prado::createComponent('System.3rdParty.SafeHtml.TSafeHtmlParser'); - return self::$_safeTextParser; - } -public function getTextMode() - { - return $this->getViewState('TextMode','SingleLine'); - } -public function setTextMode($value) - { - $this->setViewState('TextMode',TPropertyValue::ensureEnum($value,array('SingleLine','MultiLine','Password')),'SingleLine'); - } -public function getValidationGroup() - { - return $this->getViewState('ValidationGroup',''); - } -public function setValidationGroup($value) - { - $this->setViewState('ValidationGroup',$value,''); - } -public function getWrap() - { - return $this->getViewState('Wrap',true); - } -public function setWrap($value) - { - $this->setViewState('Wrap',TPropertyValue::ensureBoolean($value),true); - } -} -?><?php -class TPanel extends TWebControl +protected function getTagName()
+{
+return ($this->getTextMode()==='MultiLine')?'textarea':'input';
+} +protected function addAttributesToRender($writer)
+{
+$page=$this->getPage();
+$page->ensureRenderInForm($this);
+if(($uid=$this->getUniqueID())!=='')
+$writer->addAttribute('name',$uid);
+if(($textMode=$this->getTextMode())==='MultiLine')
+{
+if(($rows=$this->getRows())<=0)
+$rows=self::DEFAULT_ROWS;
+if(($cols=$this->getColumns())<=0)
+$cols=self::DEFAULT_COLUMNS;
+$writer->addAttribute('rows',"$rows");
+$writer->addAttribute('cols',"$cols");
+if(!$this->getWrap())
+$writer->addAttribute('wrap','off');
+}
+else
+{
+if($textMode==='SingleLine')
+{
+$writer->addAttribute('type','text');
+if(($text=$this->getText())!=='')
+$writer->addAttribute('value',$text);
+if(($act=$this->getAutoCompleteType())!=='None')
+{
+if($act==='Disabled')
+$writer->addAttribute('autocomplete','off');
+else if($act==='Search')
+$writer->addAttribute('vcard_name','search');
+else if($act==='HomeCountryRegion')
+$writer->addAttribute('vcard_name','HomeCountry');
+else if($act==='BusinessCountryRegion')
+$writer->addAttribute('vcard_name','BusinessCountry');
+else
+{
+if(($pos=strpos($act,'Business'))===0)
+$act='Business'.'.'.substr($act,8);
+else if(($pos=strpos($act,'Home'))===0)
+$act='Home'.'.'.substr($act,4);
+$writer->addAttribute('vcard_name','vCard.'.$act);
+}
+}
+}
+else
+{
+$writer->addAttribute('type','password');
+}
+if(($cols=$this->getColumns())>0)
+$writer->addAttribute('size',"$cols");
+if(($maxLength=$this->getMaxLength())>0)
+$writer->addAttribute('maxlength',"$maxLength");
+}
+if($this->getReadOnly())
+$writer->addAttribute('readonly','readonly');
+if(!$this->getEnabled(true) && $this->getEnabled()) $writer->addAttribute('disabled','disabled');
+if($this->getEnabled(true) && $this->getAutoPostBack() && $page->getClientSupportsJavaScript())
+{
+$writer->addAttribute('id',$this->getClientID());
+$this->getPage()->getClientScript()->registerPostBackControl($this);
+}
+parent::addAttributesToRender($writer);
+} +public function getPostBackOptions()
+{
+$options['EventTarget'] = $this->getUniqueID();
+$options['CausesValidation'] = $this->getCausesValidation();
+$options['ValidationGroup'] = $this->getValidationGroup();
+$options['TextMode'] = $this->getTextMode();
+return $options;
+} +public function loadPostData($key,$values)
+{
+$value=$values[$key];
+if(!$this->getReadOnly() && $this->getText()!==$value)
+{
+$this->setText($value);
+return true;
+}
+else
+return false;
+} +public function getValidationPropertyValue()
+{
+return $this->getText();
+} +public function onTextChanged($param)
+{
+$this->raiseEvent('OnTextChanged',$this,$param);
+} +public function raisePostDataChangedEvent()
+{
+if($this->getAutoPostBack() && $this->getCausesValidation())
+$this->getPage()->validate($this->getValidationGroup());
+$this->onTextChanged(null);
+} +protected function renderContents($writer)
+{
+if($this->getTextMode()==='MultiLine')
+$writer->write(THttpUtility::htmlEncode($this->getText()));
+} +public function getAutoCompleteType()
+{
+return $this->getViewState('AutoCompleteType','None');
+} +public function setAutoCompleteType($value)
+{
+$this->setViewState('AutoCompleteType',TPropertyValue::ensureEnum($value,self::$_autoCompleteTypes),'None');
+} +public function getAutoPostBack()
+{
+return $this->getViewState('AutoPostBack',false);
+} +public function setAutoPostBack($value)
+{
+$this->setViewState('AutoPostBack',TPropertyValue::ensureBoolean($value),false);
+} +public function getCausesValidation()
+{
+return $this->getViewState('CausesValidation',true);
+} +public function setCausesValidation($value)
+{
+$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);
+} +public function getColumns()
+{
+return $this->getViewState('Columns',0);
+} +public function setColumns($value)
+{
+$this->setViewState('Columns',TPropertyValue::ensureInteger($value),0);
+} +public function getMaxLength()
+{
+return $this->getViewState('MaxLength',0);
+} +public function setMaxLength($value)
+{
+$this->setViewState('MaxLength',TPropertyValue::ensureInteger($value),0);
+} +public function getReadOnly()
+{
+return $this->getViewState('ReadOnly',false);
+} +public function setReadOnly($value)
+{
+$this->setViewState('ReadOnly',TPropertyValue::ensureBoolean($value),false);
+} +public function getRows()
+{
+return $this->getViewState('Rows',self::DEFAULT_ROWS);
+} +public function setRows($value)
+{
+$this->setViewState('Rows',TPropertyValue::ensureInteger($value),self::DEFAULT_ROWS);
+} +public function getText()
+{
+return $this->getViewState('Text','');
+} +public function setText($value)
+{
+$this->setViewState('Text',$value,'');
+$this->_safeText = null;
+} +public function getSafeText()
+{
+if($this->_safeText===null)
+$this->_safeText=$this->getSafeTextParser()->parse($this->getText());
+return $this->_safeText;
+} +protected function getSafeTextParser()
+{
+if(!self::$_safeTextParser)
+self::$_safeTextParser=Prado::createComponent('System.3rdParty.SafeHtml.TSafeHtmlParser');
+return self::$_safeTextParser;
+} +public function getTextMode()
+{
+return $this->getViewState('TextMode','SingleLine');
+} +public function setTextMode($value)
+{
+$this->setViewState('TextMode',TPropertyValue::ensureEnum($value,array('SingleLine','MultiLine','Password')),'SingleLine');
+} +public function getValidationGroup()
+{
+return $this->getViewState('ValidationGroup','');
+} +public function setValidationGroup($value)
+{
+$this->setViewState('ValidationGroup',$value,'');
+} +public function getWrap()
+{
+return $this->getViewState('Wrap',true);
+} +public function setWrap($value)
+{
+$this->setViewState('Wrap',TPropertyValue::ensureBoolean($value),true);
+}
+} + +class TPanel extends TWebControl
{ private $_defaultButton=''; -protected function getTagName() - { - return 'div'; - } -protected function createStyle() - { - return new TPanelStyle; - } -protected function addAttributesToRender($writer) - { - parent::addAttributesToRender($writer); - if(($butt=$this->getDefaultButton())!=='') - { - if(($button=$this->findControl($butt))===null) - throw new TInvalidDataValueException('panel_defaultbutton_invalid',$butt); - else - { - $writer->addAttribute('id',$this->getClientID()); - $this->getPage()->getClientScript()->registerDefaultButton($this, $button); - } - } - } -public function getWrap() - { - return $this->getStyle()->getWrap(); - } -public function setWrap($value) - { - $this->getStyle()->setWrap($value); - } -public function getHorizontalAlign() - { - return $this->getStyle()->getHorizontalAlign(); - } -public function setHorizontalAlign($value) - { - $this->getStyle()->setHorizontalAlign($value); - } -public function getBackImageUrl() - { - return $this->getStyle()->getBackImageUrl(); - } -public function setBackImageUrl($value) - { - $this->getStyle()->setBackImageUrl($value); - } -public function getDirection() - { - return $this->getStyle()->getDirection(); - } -public function setDirection($value) - { - $this->getStyle()->setDirection($value); - } -public function getDefaultButton() - { - return $this->_defaultButton; - } -public function setDefaultButton($value) - { - $this->_defaultButton=$value; - } -public function getGroupingText() - { - return $this->getViewState('GroupingText',''); - } -public function setGroupingText($value) - { - $this->setViewState('GroupingText',$value,''); - } -public function getScrollBars() - { - return $this->getStyle()->getScrollBars(); - } -public function setScrollBars($value) - { - $this->getStyle()->setScrollBars($value); - } -public function renderBeginTag($writer) - { - parent::renderBeginTag($writer); - if(($text=$this->getGroupingText())!=='') - { - $writer->renderBeginTag('fieldset'); - $writer->renderBeginTag('legend'); - $writer->write($text); - $writer->renderEndTag(); - } - } -public function renderEndTag($writer) - { - if($this->getGroupingText()!=='') - $writer->renderEndTag(); - parent::renderEndTag($writer); - } -} -class TPanelStyle extends TStyle +protected function getTagName()
+{
+return 'div';
+} +protected function createStyle()
+{
+return new TPanelStyle;
+} +protected function addAttributesToRender($writer)
+{
+parent::addAttributesToRender($writer);
+if(($butt=$this->getDefaultButton())!=='')
+{
+if(($button=$this->findControl($butt))===null)
+throw new TInvalidDataValueException('panel_defaultbutton_invalid',$butt);
+else
+{
+$writer->addAttribute('id',$this->getClientID());
+$this->getPage()->getClientScript()->registerDefaultButton($this, $button);
+}
+}
+} +public function getWrap()
+{
+return $this->getStyle()->getWrap();
+} +public function setWrap($value)
+{
+$this->getStyle()->setWrap($value);
+} +public function getHorizontalAlign()
+{
+return $this->getStyle()->getHorizontalAlign();
+} +public function setHorizontalAlign($value)
+{
+$this->getStyle()->setHorizontalAlign($value);
+} +public function getBackImageUrl()
+{
+return $this->getStyle()->getBackImageUrl();
+} +public function setBackImageUrl($value)
+{
+$this->getStyle()->setBackImageUrl($value);
+} +public function getDirection()
+{
+return $this->getStyle()->getDirection();
+} +public function setDirection($value)
+{
+$this->getStyle()->setDirection($value);
+} +public function getDefaultButton()
+{
+return $this->_defaultButton;
+} +public function setDefaultButton($value)
+{
+$this->_defaultButton=$value;
+} +public function getGroupingText()
+{
+return $this->getViewState('GroupingText','');
+} +public function setGroupingText($value)
+{
+$this->setViewState('GroupingText',$value,'');
+} +public function getScrollBars()
+{
+return $this->getStyle()->getScrollBars();
+} +public function setScrollBars($value)
+{
+$this->getStyle()->setScrollBars($value);
+} +public function renderBeginTag($writer)
+{
+parent::renderBeginTag($writer);
+if(($text=$this->getGroupingText())!=='')
+{
+$writer->renderBeginTag('fieldset');
+$writer->renderBeginTag('legend');
+$writer->write($text);
+$writer->renderEndTag();
+}
+} +public function renderEndTag($writer)
+{
+if($this->getGroupingText()!=='')
+$writer->renderEndTag();
+parent::renderEndTag($writer);
+}
+} +class TPanelStyle extends TStyle
{ private $_backImageUrl=''; private $_direction='NotSet'; private $_horizontalAlign='NotSet'; private $_scrollBars='None'; private $_wrap=true; -public function addAttributesToRender($writer) - { - if(($url=trim($this->_backImageUrl))!=='') - $this->setStyleField('background-image','url('.$url.')'); -switch($this->_scrollBars) - { - case 'Horizontal': $this->setStyleField('overflow-x','scroll'); break; - case 'Vertical': $this->setStyleField('overflow-y','scroll'); break; - case 'Both': $this->setStyleField('overflow','scroll'); break; - case 'Auto': $this->setStyleField('overflow','auto'); break; - } -if($this->_horizontalAlign!=='NotSet') - $this->setStyleField('text-align',strtolower($this->_horizontalAlign)); -if(!$this->_wrap) - $this->setStyleField('white-space','nowrap'); -if($this->_direction==='LeftToRight') - $this->setStyleField('direction','ltr'); - else if($this->_direction==='RightToLeft') - $this->setStyleField('direction','rtl'); -parent::addAttributesToRender($writer); - } -public function getBackImageUrl() - { - return $this->_backImageUrl; - } -public function setBackImageUrl($value) - { - $this->_backImageUrl=$value; - } -public function getDirection() - { - return $this->_direction; - } -public function setDirection($value) - { - $this->_direction=TPropertyValue::ensureEnum($value,array('NotSet','LeftToRight','RightToLeft')); - } -public function getWrap() - { - return $this->_wrap; - } -public function setWrap($value) - { - $this->_wrap=TPropertyValue::ensureBoolean($value); - } -public function getHorizontalAlign() - { - return $this->_horizontalAlign; - } -public function setHorizontalAlign($value) - { - $this->_horizontalAlign=TPropertyValue::ensureEnum($value,array('NotSet','Left','Right','Center','Justify')); - } -public function getScrollBars() - { - return $this->_scrollBars; - } -public function setScrollBars($value) - { - $this->_scrollBars=TPropertyValue::ensureEnum($value,array('None','Auto','Both','Horizontal','Vertical')); - } -} -?><?php -class TContent extends TControl implements INamingContainer -{ -public function createdOnTemplate($parent) - { - if(($id=$this->getID())==='') - throw new TConfigurationException('content_id_required'); - $this->getTemplateControl()->registerContent($this); - } -} -?><?php -class TContentPlaceHolder extends TControl -{ -public function createdOnTemplate($parent) - { - if(($id=$this->getID())==='') - throw new TConfigurationException('contentplaceholder_id_required'); - $loc=$parent->getHasControls()?$parent->getControls()->getCount():0; - $this->getTemplateControl()->registerContentPlaceHolder($id,$parent,$loc); - $parent->unregisterObject($id); - } -} -?><?php -class TExpression extends TControl +public function addAttributesToRender($writer)
+{
+if(($url=trim($this->_backImageUrl))!=='')
+$this->setStyleField('background-image','url('.$url.')'); +switch($this->_scrollBars)
+{
+case 'Horizontal': $this->setStyleField('overflow-x','scroll'); break;
+case 'Vertical': $this->setStyleField('overflow-y','scroll'); break;
+case 'Both': $this->setStyleField('overflow','scroll'); break;
+case 'Auto': $this->setStyleField('overflow','auto'); break;
+} +if($this->_horizontalAlign!=='NotSet')
+$this->setStyleField('text-align',strtolower($this->_horizontalAlign)); +if(!$this->_wrap)
+$this->setStyleField('white-space','nowrap'); +if($this->_direction==='LeftToRight')
+$this->setStyleField('direction','ltr');
+else if($this->_direction==='RightToLeft')
+$this->setStyleField('direction','rtl'); +parent::addAttributesToRender($writer);
+} +public function getBackImageUrl()
+{
+return $this->_backImageUrl;
+} +public function setBackImageUrl($value)
+{
+$this->_backImageUrl=$value;
+} +public function getDirection()
+{
+return $this->_direction;
+} +public function setDirection($value)
+{
+$this->_direction=TPropertyValue::ensureEnum($value,array('NotSet','LeftToRight','RightToLeft'));
+} +public function getWrap()
+{
+return $this->_wrap;
+} +public function setWrap($value)
+{
+$this->_wrap=TPropertyValue::ensureBoolean($value);
+} +public function getHorizontalAlign()
+{
+return $this->_horizontalAlign;
+} +public function setHorizontalAlign($value)
+{
+$this->_horizontalAlign=TPropertyValue::ensureEnum($value,array('NotSet','Left','Right','Center','Justify'));
+} +public function getScrollBars()
+{
+return $this->_scrollBars;
+} +public function setScrollBars($value)
+{
+$this->_scrollBars=TPropertyValue::ensureEnum($value,array('None','Auto','Both','Horizontal','Vertical'));
+}
+}
+ +class TContent extends TControl implements INamingContainer
+{ +public function createdOnTemplate($parent)
+{
+if(($id=$this->getID())==='')
+throw new TConfigurationException('content_id_required');
+$this->getTemplateControl()->registerContent($this);
+}
+} + +class TContentPlaceHolder extends TControl
+{ +public function createdOnTemplate($parent)
+{
+if(($id=$this->getID())==='')
+throw new TConfigurationException('contentplaceholder_id_required');
+$loc=$parent->getHasControls()?$parent->getControls()->getCount():0;
+$this->getTemplateControl()->registerContentPlaceHolder($id,$parent,$loc);
+$parent->unregisterObject($id);
+}
+} + +class TExpression extends TControl
{ private $_e=''; -public function getExpression() - { - return $this->_e; - } -public function setExpression($value) - { - $this->_e=$value; - } -protected function render($writer) - { - if($this->_e!=='') - $writer->write($this->evaluateExpression($this->_e)); - } -} -?><?php -class TStatements extends TControl +public function getExpression()
+{
+return $this->_e;
+} +public function setExpression($value)
+{
+$this->_e=$value;
+} +protected function render($writer)
+{
+if($this->_e!=='')
+$writer->write($this->evaluateExpression($this->_e));
+}
+} + +class TStatements extends TControl
{ private $_s=''; -public function getStatements() - { - return $this->_s; - } -public function setStatements($value) - { - $this->_s=$value; - } -protected function render($writer) - { - if($this->_s!=='') - $writer->write($this->evaluateStatements($this->_s)); - } -} -?><?php -class TFileUpload extends TWebControl implements IPostBackDataHandler, IValidatable +public function getStatements()
+{
+return $this->_s;
+} +public function setStatements($value)
+{
+$this->_s=$value;
+} +protected function render($writer)
+{
+if($this->_s!=='')
+$writer->write($this->evaluateStatements($this->_s));
+}
+} + +class TFileUpload extends TWebControl implements IPostBackDataHandler, IValidatable
{ const MAX_FILE_SIZE=1048576; private $_fileSize=0; @@ -8139,6272 +8440,6019 @@ private $_fileName=''; private $_localName=''; private $_fileType=''; private $_errorCode=UPLOAD_ERR_NO_FILE; -protected function getTagName() - { - return 'input'; - } -protected function addAttributesToRender($writer) - { - $this->getPage()->ensureRenderInForm($this); - parent::addAttributesToRender($writer); - $writer->addAttribute('type','file'); - $writer->addAttribute('name',$this->getUniqueID()); - } -protected function onPreRender($param) - { - parent::onPreRender($param); - if(($form=$this->getPage()->getForm())!==null) - $form->setEnctype('multipart/form-data'); - $this->getPage()->getClientScript()->registerHiddenField('MAX_FILE_SIZE',$this->getMaxFileSize()); - if($this->getEnabled(true)) - $this->getPage()->registerRequiresPostData($this); - } -public function getMaxFileSize() - { - return $this->getViewState('MaxFileSize',self::MAX_FILE_SIZE); - } -public function setMaxFileSize($size) - { - $this->setViewState('MaxFileSize',TPropertyValue::ensureInteger($size),self::MAX_FILE_SIZE); - } -public function getFileName() - { - return $this->_fileName; - } -public function getFileSize() - { - return $this->_fileSize; - } -public function getFileType() - { - return $this->_fileType; - } -public function getLocalName() - { - return $this->_localName; - } -public function getErrorCode() - { - return $this->_errorCode; - } -public function getHasFile() - { - return $this->_errorCode===UPLOAD_ERR_OK; - } -public function saveAs($fileName,$deleteTempFile=true) - { - if($this->_errorCode===UPLOAD_ERR_OK) - { - if($deleteTempFile) - move_uploaded_file($this->_localName,$fileName); - else if(is_uploaded_file($this->_localName)) - file_put_contents($fileName,file_get_contents($this->_localName)); - else - throw new TInvalidOperationException('fileupload_saveas_failed'); - } - else - throw new TInvalidOperation('fileupload_saveas_forbidden'); - } -public function loadPostData($key,$values) - { - if(isset($_FILES[$key])) - { - $this->_fileName=$_FILES[$key]['name']; - $this->_fileSize=$_FILES[$key]['size']; - $this->_fileType=$_FILES[$key]['type']; - $this->_errorCode=$_FILES[$key]['error']; - $this->_localName=$_FILES[$key]['tmp_name']; - return true; - } - else - return false; - } -public function raisePostDataChangedEvent() - { - $this->onFileUpload(null); - } -protected function onFileUpload($param) - { - $this->raiseEvent('OnFileUpload',$this,$param); - } -public function getValidationPropertyValue() - { - return $this->getFileName(); - } -} -?><?php -class THead extends TControl +protected function getTagName()
+{
+return 'input';
+} +protected function addAttributesToRender($writer)
+{
+$this->getPage()->ensureRenderInForm($this);
+parent::addAttributesToRender($writer);
+$writer->addAttribute('type','file');
+$writer->addAttribute('name',$this->getUniqueID());
+} +public function onPreRender($param)
+{
+parent::onPreRender($param);
+if(($form=$this->getPage()->getForm())!==null)
+$form->setEnctype('multipart/form-data');
+$this->getPage()->getClientScript()->registerHiddenField('MAX_FILE_SIZE',$this->getMaxFileSize());
+if($this->getEnabled(true))
+$this->getPage()->registerRequiresPostData($this);
+} +public function getMaxFileSize()
+{
+return $this->getViewState('MaxFileSize',self::MAX_FILE_SIZE);
+} +public function setMaxFileSize($size)
+{
+$this->setViewState('MaxFileSize',TPropertyValue::ensureInteger($size),self::MAX_FILE_SIZE);
+} +public function getFileName()
+{
+return $this->_fileName;
+} +public function getFileSize()
+{
+return $this->_fileSize;
+} +public function getFileType()
+{
+return $this->_fileType;
+} +public function getLocalName()
+{
+return $this->_localName;
+} +public function getErrorCode()
+{
+return $this->_errorCode;
+} +public function getHasFile()
+{
+return $this->_errorCode===UPLOAD_ERR_OK;
+} +public function saveAs($fileName,$deleteTempFile=true)
+{
+if($this->_errorCode===UPLOAD_ERR_OK)
+{
+if($deleteTempFile)
+move_uploaded_file($this->_localName,$fileName);
+else if(is_uploaded_file($this->_localName))
+file_put_contents($fileName,file_get_contents($this->_localName));
+else
+throw new TInvalidOperationException('fileupload_saveas_failed');
+}
+else
+throw new TInvalidOperation('fileupload_saveas_forbidden');
+} +public function loadPostData($key,$values)
+{
+if(isset($_FILES[$key]))
+{
+$this->_fileName=$_FILES[$key]['name'];
+$this->_fileSize=$_FILES[$key]['size'];
+$this->_fileType=$_FILES[$key]['type'];
+$this->_errorCode=$_FILES[$key]['error'];
+$this->_localName=$_FILES[$key]['tmp_name'];
+return true;
+}
+else
+return false;
+} +public function raisePostDataChangedEvent()
+{
+$this->onFileUpload(null);
+} +public function onFileUpload($param)
+{
+$this->raiseEvent('OnFileUpload',$this,$param);
+} +public function getValidationPropertyValue()
+{
+return $this->getFileName();
+}
+} + +class THead extends TControl
{ private $_metaTags=array(); -protected function onInit($param) - { - parent::onInit($param); - $this->getPage()->setHead($this); - } -public function getTitle() - { - return $this->getViewState('Title',''); - } -public function setTitle($value) - { - $this->setViewState('Title',$value,''); - } -public function registerMetaTag($key,$metaTag) - { - $this->_metaTags[$key]=$metaTag; - } -public function isMetaTagRegistered($key) - { - return isset($this->_metaTags[$key]); - } -public function render($writer) - { - $page=$this->getPage(); - if(($title=$page->getTitle())==='') - $title=$this->getTitle(); - $writer->write("<head>\n<title>".THttpUtility::htmlEncode($title)."</title>\n"); - foreach($this->_metaTags as $metaTag) - { - $metaTag->render($writer); - $writer->writeLine(); - } - $cs=$page->getClientScript(); - $cs->renderStyleSheetFiles($writer); - $cs->renderStyleSheets($writer); - $cs->renderScriptFiles($writer); - parent::render($writer); - $writer->write("</head>\n"); - } -} -class TMetaTag extends TComponent +public function onInit($param)
+{
+parent::onInit($param);
+$this->getPage()->setHead($this);
+} +public function getTitle()
+{
+return $this->getViewState('Title','');
+} +public function setTitle($value)
+{
+$this->setViewState('Title',$value,'');
+} +public function registerMetaTag($key,$metaTag)
+{
+$this->_metaTags[$key]=$metaTag;
+} +public function isMetaTagRegistered($key)
+{
+return isset($this->_metaTags[$key]);
+} +public function render($writer)
+{
+$page=$this->getPage();
+if(($title=$page->getTitle())==='')
+$title=$this->getTitle();
+$writer->write("<head>\n<title>".THttpUtility::htmlEncode($title)."</title>\n");
+foreach($this->_metaTags as $metaTag)
+{
+$metaTag->render($writer);
+$writer->writeLine();
+}
+$cs=$page->getClientScript();
+$cs->renderStyleSheetFiles($writer);
+$cs->renderStyleSheets($writer);
+$cs->renderScriptFiles($writer);
+parent::render($writer);
+$writer->write("</head>\n");
+}
+} +class TMetaTag extends TComponent
{ private $_id=''; private $_httpEquiv=''; private $_name=''; private $_content=''; private $_scheme=''; -public function getID() - { - return $this->_id; - } -public function setID($value) - { - $this->_id=$value; - } -public function getHttpEquiv() - { - return $this->_httpEquiv; - } -public function setHttpEquiv($value) - { - $this->_httpEquiv=$value; - } -public function getName() - { - return $this->_name; - } -public function setName($value) - { - $this->_name=$value; - } -public function getContent() - { - return $this->_content; - } -public function setContent($value) - { - $this->_content=$value; - } -public function getScheme() - { - return $this->_scheme; - } -public function setScheme($value) - { - $this->_scheme=$value; - } -public function render($writer) - { - if($this->_id!=='') - $writer->addAttribute('id',$this->_id); - if($this->_name!=='') - $writer->addAttribute('name',$this->_name); - if($this->_httpEquiv!=='') - $writer->addAttribute('http-equiv',$this->_name); - if($this->_scheme!=='') - $writer->addAttribute('scheme',$this->_name); - $writer->addAttribute('content',$this->_name); - $writer->renderBeginTag('meta'); - $writer->renderEndTag(); - } -} -?><?php -class THiddenField extends TControl implements IPostBackDataHandler -{ -protected function getTagName() - { - return 'input'; - } -public function focus() - { - throw new TNotSupportedException('hiddenfield_focus_unsupported'); - } -protected function render($writer) - { - $uniqueID=$this->getUniqueID(); - $this->getPage()->ensureRenderInForm($this); - $writer->addAttribute('type','hidden'); - if($uniqueID!=='') - $writer->addAttribute('name',$uniqueID); - if($this->getID()!=='') - $writer->addAttribute('id',$this->getClientID()); - if(($value=$this->getValue())!=='') - $writer->addAttribute('value',$value); - $writer->renderBeginTag('input'); - $writer->renderEndTag(); - } -public function loadPostData($key,$values) - { - $value=$values[$key]; - if($value===$this->getValue()) - return false; - else - { - $this->setValue($value); - return true; - } - } -public function raisePostDataChangedEvent() - { - $this->onValueChanged(null); - } -public function onValueChanged($param) - { - $this->raiseEvent('OnValueChanged',$this,$param); - } -public function getValue() - { - return $this->getViewState('Value',''); - } -public function setValue($value) - { - $this->setViewState('Value',$value,''); - } -public function getEnableTheming() - { - return false; - } -public function setEnableTheming($value) - { - throw new TNotSupportedException('hiddenfield_theming_unsupported'); - } -public function setSkinID($value) - { - throw new TNotSupportedException('hiddenfield_skinid_unsupported'); - } -} -?><?php -class THyperLink extends TWebControl -{ -protected function getTagName() - { - return 'a'; - } -protected function addAttributesToRender($writer) - { - $isEnabled=$this->getEnabled(true); - if($this->getEnabled() && !$isEnabled) - $writer->addAttribute('disabled','disabled'); - parent::addAttributesToRender($writer); - if(($url=$this->getNavigateUrl())!=='' && $isEnabled) - $writer->addAttribute('href',$url); - if(($target=$this->getTarget())!=='') - $writer->addAttribute('target',$target); - } -protected function renderContents($writer) - { - if(($imageUrl=$this->getImageUrl())==='') - { - if(($text=$this->getText())!=='') - $writer->write($text); - else - parent::renderContents($writer); - } - else - { - $image=Prado::createComponent('System.Web.UI.WebControls.TImage'); - $image->setImageUrl($imageUrl); - if(($toolTip=$this->getToolTip())!=='') - $image->setToolTip($toolTip); - if(($text=$this->getText())!=='') - $image->setAlternateText($text); - $image->renderControl($writer); - } - } -public function getText() - { - return $this->getViewState('Text',''); - } -public function setText($value) - { - $this->setViewState('Text',$value,''); - } -public function getImageUrl() - { - return $this->getViewState('ImageUrl',''); - } -public function setImageUrl($value) - { - $this->setViewState('ImageUrl',$value,''); - } -public function getNavigateUrl() - { - return $this->getViewState('NavigateUrl',''); - } -public function setNavigateUrl($value) - { - $this->setViewState('NavigateUrl',$value,''); - } -public function getTarget() - { - return $this->getViewState('Target',''); - } -public function setTarget($value) - { - $this->setViewState('Target',$value,''); - } -} -?><?php -class TTable extends TWebControl -{ -private $_rows=null; -protected function getTagName() - { - return 'table'; - } -public function addParsedObject($object) - { - if($object instanceof TTableRow) - $this->getRows()->add($object); - } -protected function createStyle() - { - return new TTableStyle; - } -protected function addAttributesToRender($writer) - { - parent::addAttributesToRender($writer); - $border=0; - if($this->getHasStyle()) - { - if($this->getGridLines()!=='None') - { - if(($border=$this->getBorderWidth())==='') - $border=1; - else - $border=(int)$border; - } - } - $writer->addAttribute('border',"$border"); - } -public function getRows() - { - if(!$this->_rows) - $this->_rows=new TTableRowCollection($this); - return $this->_rows; - } -public function getCaption() - { - return $this->getViewState('Caption',''); - } -public function setCaption($value) - { - $this->setViewState('Caption',$value,''); - } -public function getCaptionAlign() - { - return $this->getViewState('CaptionAlign','NotSet'); - } -public function setCaptionAlign($value) - { - $this->setViewState('CaptionAlign',TPropertyValue::ensureEnum($value,'NotSet','Top','Bottom','Left','Right'),'NotSet'); - } -public function getCellSpacing() - { - if($this->getHasStyle()) - return $this->getStyle()->getCellSpacing(); - else - return -1; - } -public function setCellSpacing($value) - { - $this->getStyle()->setCellSpacing($value); - } -public function getCellPadding() - { - if($this->getHasStyle()) - return $this->getStyle()->getCellPadding(); - else - return -1; - } -public function setCellPadding($value) - { - $this->getStyle()->setCellPadding($value); - } -public function getHorizontalAlign() - { - if($this->getHasStyle()) - return $this->getStyle()->getHorizontalAlign(); - else - return 'NotSet'; - } -public function setHorizontalAlign($value) - { - $this->getStyle()->setHorizontalAlign($value); - } -public function getGridLines() - { - if($this->getHasStyle()) - return $this->getStyle()->getGridLines(); - else - return 'None'; - } -public function setGridLines($value) - { - $this->getStyle()->setGridLines($value); - } -public function getBackImageUrl() - { - if($this->getHasStyle()) - return $this->getStyle()->getBackImageUrl(); - else - return ''; - } -public function setBackImageUrl($value) - { - $this->getStyle()->setBackImageUrl($value); - } -public function renderBeginTag($writer) - { - parent::renderBeginTag($writer); - if(($caption=$this->getCaption())!=='') - { - if(($align=$this->getCaptionAlign())!=='NotSet') - $writer->addAttribute('align',$align); - $writer->renderBeginTag('caption'); - $writer->write($caption); - $writer->renderEndTag(); - } - } -protected function renderContents($writer) - { - if($this->_rows) - { - $writer->writeLine(); - foreach($this->_rows as $row) - { - $row->renderControl($writer); - $writer->writeLine(); - } - } - } -} -class TTableRow extends TWebControl +public function getID()
+{
+return $this->_id;
+} +public function setID($value)
+{
+$this->_id=$value;
+} +public function getHttpEquiv()
+{
+return $this->_httpEquiv;
+} +public function setHttpEquiv($value)
+{
+$this->_httpEquiv=$value;
+} +public function getName()
+{
+return $this->_name;
+} +public function setName($value)
+{
+$this->_name=$value;
+} +public function getContent()
+{
+return $this->_content;
+} +public function setContent($value)
+{
+$this->_content=$value;
+} +public function getScheme()
+{
+return $this->_scheme;
+} +public function setScheme($value)
+{
+$this->_scheme=$value;
+} +public function render($writer)
+{
+if($this->_id!=='')
+$writer->addAttribute('id',$this->_id);
+if($this->_name!=='')
+$writer->addAttribute('name',$this->_name);
+if($this->_httpEquiv!=='')
+$writer->addAttribute('http-equiv',$this->_name);
+if($this->_scheme!=='')
+$writer->addAttribute('scheme',$this->_name);
+$writer->addAttribute('content',$this->_name);
+$writer->renderBeginTag('meta');
+$writer->renderEndTag();
+}
+} + +class THiddenField extends TControl implements IPostBackDataHandler
+{ +protected function getTagName()
+{
+return 'input';
+} +public function focus()
+{
+throw new TNotSupportedException('hiddenfield_focus_unsupported');
+} +protected function render($writer)
+{
+$uniqueID=$this->getUniqueID();
+$this->getPage()->ensureRenderInForm($this);
+$writer->addAttribute('type','hidden');
+if($uniqueID!=='')
+$writer->addAttribute('name',$uniqueID);
+if($this->getID()!=='')
+$writer->addAttribute('id',$this->getClientID());
+if(($value=$this->getValue())!=='')
+$writer->addAttribute('value',$value);
+$writer->renderBeginTag('input');
+$writer->renderEndTag();
+} +public function loadPostData($key,$values)
+{
+$value=$values[$key];
+if($value===$this->getValue())
+return false;
+else
+{
+$this->setValue($value);
+return true;
+}
+} +public function raisePostDataChangedEvent()
+{
+$this->onValueChanged(null);
+} +public function onValueChanged($param)
+{
+$this->raiseEvent('OnValueChanged',$this,$param);
+} +public function getValue()
+{
+return $this->getViewState('Value','');
+} +public function setValue($value)
+{
+$this->setViewState('Value',$value,'');
+} +public function getEnableTheming()
+{
+return false;
+} +public function setEnableTheming($value)
+{
+throw new TNotSupportedException('hiddenfield_theming_unsupported');
+} +public function setSkinID($value)
+{
+throw new TNotSupportedException('hiddenfield_skinid_unsupported');
+}
+} + +class THyperLink extends TWebControl
+{ +protected function getTagName()
+{
+return 'a';
+} +protected function addAttributesToRender($writer)
+{
+$isEnabled=$this->getEnabled(true);
+if($this->getEnabled() && !$isEnabled)
+$writer->addAttribute('disabled','disabled');
+parent::addAttributesToRender($writer);
+if(($url=$this->getNavigateUrl())!=='' && $isEnabled)
+$writer->addAttribute('href',$url);
+if(($target=$this->getTarget())!=='')
+$writer->addAttribute('target',$target);
+} +protected function renderContents($writer)
+{
+if(($imageUrl=$this->getImageUrl())==='')
+{
+if(($text=$this->getText())!=='')
+$writer->write($text);
+else
+parent::renderContents($writer);
+}
+else
+{
+$image=Prado::createComponent('System.Web.UI.WebControls.TImage');
+$image->setImageUrl($imageUrl);
+if(($toolTip=$this->getToolTip())!=='')
+$image->setToolTip($toolTip);
+if(($text=$this->getText())!=='')
+$image->setAlternateText($text);
+$image->renderControl($writer);
+}
+} +public function getText()
+{
+return $this->getViewState('Text','');
+} +public function setText($value)
+{
+$this->setViewState('Text',$value,'');
+} +public function getImageUrl()
+{
+return $this->getViewState('ImageUrl','');
+} +public function setImageUrl($value)
+{
+$this->setViewState('ImageUrl',$value,'');
+} +public function getNavigateUrl()
+{
+return $this->getViewState('NavigateUrl','');
+} +public function setNavigateUrl($value)
+{
+$this->setViewState('NavigateUrl',$value,'');
+} +public function getTarget()
+{
+return $this->getViewState('Target','');
+} +public function setTarget($value)
+{
+$this->setViewState('Target',$value,'');
+}
+} + +class TTableCell extends TWebControl
+{ +protected function getTagName()
+{
+return 'td';
+} +protected function createStyle()
+{
+return new TTableItemStyle;
+} +public function getHorizontalAlign()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getHorizontalAlign();
+else
+return 'NotSet';
+} +public function setHorizontalAlign($value)
+{
+$this->getStyle()->setHorizontalAlign($value);
+} +public function getVerticalAlign()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getVerticalAlign();
+else
+return 'NotSet';
+} +public function setVerticalAlign($value)
+{
+$this->getStyle()->setVerticalAlign($value);
+} +public function getColumnSpan()
+{
+return $this->getViewState('ColumnSpan', 0);
+} +public function setColumnSpan($value)
+{
+$this->setViewState('ColumnSpan', TPropertyValue::ensureInteger($value), 0);
+} +public function getRowSpan()
+{
+return $this->getViewState('RowSpan', 0);
+} +public function setRowSpan($value)
+{
+$this->setViewState('RowSpan', TPropertyValue::ensureInteger($value), 0);
+} +public function getWrap()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getWrap();
+else
+return true;
+} +public function setWrap($value)
+{
+$this->getStyle()->setWrap($value);
+} +public function getText()
+{
+return $this->getViewState('Text','');
+} +public function setText($value)
+{
+$this->setViewState('Text',$value,'');
+} +protected function addAttributesToRender($writer)
+{
+parent::addAttributesToRender($writer);
+if(($colspan=$this->getColumnSpan())>0)
+$writer->addAttribute('colspan',"$colspan");
+if(($rowspan=$this->getRowSpan())>0)
+$writer->addAttribute('rowspan',"$rowspan");
+} +protected function renderContents($writer)
+{
+if(($text=$this->getText())==='')
+parent::renderContents($writer);
+else
+$writer->write($text);
+}
+} + +class TTableHeaderCell extends TTableCell
+{ +protected function getTagName()
+{
+return 'th';
+} +protected function addAttributesToRender($writer)
+{
+parent::addAttributesToRender($writer);
+if(($scope=$this->getScope())!=='NotSet')
+$writer->addAttribute('scope',$scope==='Row'?'row':'col');
+if(($text=$this->getAbbreviatedText())!=='')
+$writer->addAttribute('abbr',$text);
+if(($text=$this->getCategoryText())!=='')
+$writer->addAttribute('axis',$text);
+} +public function getScope()
+{
+return $this->getViewState('Scope','NotSet');
+} +public function setScope($value)
+{
+$this->setViewState('Scope',TPropertyValue::ensureEnum($value,'NotSet','Row','Column'),'NotSet');
+} +public function getAbbreviatedText()
+{
+return $this->getViewState('AbbreviatedText','');
+} +public function setAbbreviatedText($value)
+{
+$this->setViewState('AbbreviatedText',$value,'');
+} +public function getCategoryText()
+{
+return $this->getViewState('CategoryText','');
+} +public function setCategoryText($value)
+{
+$this->setViewState('CategoryText',$value,'');
+}
+} + +class TTableRow extends TWebControl
{ private $_cells=null; -protected function getTagName() - { - return 'tr'; - } -public function addParsedObject($object) - { - if($object instanceof TTableCell) - $this->getCells()->add($object); - } -protected function createStyle() - { - return new TTableItemStyle; - } -public function getCells() - { - if(!$this->_cells) - $this->_cells=new TTableCellCollection($this); - return $this->_cells; - } -public function getHorizontalAlign() - { - if($this->getHasStyle()) - return $this->getStyle()->getHorizontalAlign(); - else - return 'NotSet'; - } -public function setHorizontalAlign($value) - { - $this->getStyle()->setHorizontalAlign($value); - } -public function getVerticalAlign() - { - if($this->getHasStyle()) - return $this->getStyle()->getVerticalAlign(); - else - return 'NotSet'; - } -public function setVerticalAlign($value) - { - $this->getStyle()->setVerticalAlign($value); - } -protected function renderContents($writer) - { - if($this->_cells) - { - $writer->writeLine(); - foreach($this->_cells as $cell) - { - $cell->renderControl($writer); - $writer->writeLine(); - } - } - } -} -class TTableCell extends TWebControl -{ -protected function getTagName() - { - return 'td'; - } -protected function createStyle() - { - return new TTableItemStyle; - } -public function getHorizontalAlign() - { - if($this->getHasStyle()) - return $this->getStyle()->getHorizontalAlign(); - else - return 'NotSet'; - } -public function setHorizontalAlign($value) - { - $this->getStyle()->setHorizontalAlign($value); - } -public function getVerticalAlign() - { - if($this->getHasStyle()) - return $this->getStyle()->getVerticalAlign(); - else - return 'NotSet'; - } -public function setVerticalAlign($value) - { - $this->getStyle()->setVerticalAlign($value); - } -public function getColumnSpan() - { - return $this->getViewState('ColumnSpan', 0); - } -public function setColumnSpan($value) - { - $this->setViewState('ColumnSpan', TPropertyValue::ensureInteger($value), 0); - } -public function getRowSpan() - { - return $this->getViewState('RowSpan', 0); - } -public function setRowSpan($value) - { - $this->setViewState('RowSpan', TPropertyValue::ensureInteger($value), 0); - } -public function getWrap() - { - if($this->getHasStyle()) - return $this->getStyle()->getWrap(); - else - return true; - } -public function setWrap($value) - { - $this->getStyle()->setWrap($value); - } -public function getText() - { - return $this->getViewState('Text',''); - } -public function setText($value) - { - $this->setViewState('Text',$value,''); - } -protected function addAttributesToRender($writer) - { - parent::addAttributesToRender($writer); - if(($colspan=$this->getColumnSpan())>0) - $writer->addAttribute('colspan',"$colspan"); - if(($rowspan=$this->getRowSpan())>0) - $writer->addAttribute('rowspan',"$rowspan"); - } -protected function renderContents($writer) - { - if(($text=$this->getText())==='') - parent::renderContents($writer); - else - $writer->write($text); - } -} -class TTableHeaderCell extends TTableCell -{ -protected function getTagName() - { - return 'th'; - } -protected function addAttributesToRender($writer) - { - parent::addAttributesToRender($writer); - if(($scope=$this->getScope())!=='NotSet') - $writer->addAttribute('scope',$scope==='Row'?'row':'col'); - if(($text=$this->getAbbreviatedText())!=='') - $writer->addAttribute('abbr',$text); - if(($text=$this->getCategoryText())!=='') - $writer->addAttribute('axis',$text); - } -public function getScope() - { - return $this->getViewState('Scope','NotSet'); - } -public function setScope($value) - { - $this->setViewState('Scope',TPropertyValue::ensureEnum($value,'NotSet','Row','Column'),'NotSet'); - } -public function getAbbreviatedText() - { - return $this->getViewState('AbbreviatedText',''); - } -public function setAbbreviatedText($value) - { - $this->setViewState('AbbreviatedText',$value,''); - } -public function getCategoryText() - { - return $this->getViewState('CategoryText',''); - } -public function setCategoryText($value) - { - $this->setViewState('CategoryText',$value,''); - } -} -class TTableRowCollection extends TList +protected function getTagName()
+{
+return 'tr';
+} +public function addParsedObject($object)
+{
+if($object instanceof TTableCell)
+$this->getCells()->add($object);
+} +protected function createStyle()
+{
+return new TTableItemStyle;
+} +public function getCells()
+{
+if(!$this->_cells)
+$this->_cells=new TTableCellCollection($this);
+return $this->_cells;
+} +public function getHorizontalAlign()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getHorizontalAlign();
+else
+return 'NotSet';
+} +public function setHorizontalAlign($value)
+{
+$this->getStyle()->setHorizontalAlign($value);
+} +public function getVerticalAlign()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getVerticalAlign();
+else
+return 'NotSet';
+} +public function setVerticalAlign($value)
+{
+$this->getStyle()->setVerticalAlign($value);
+} +protected function renderContents($writer)
+{
+if($this->_cells)
+{
+$writer->writeLine();
+foreach($this->_cells as $cell)
+{
+$cell->renderControl($writer);
+$writer->writeLine();
+}
+}
+}
+} +class TTableCellCollection extends TList
{ private $_owner=null; -public function __construct($owner=null) - { - $this->_owner=$owner; - } -protected function canAddItem($item) - { - return ($item instanceof TTableRow); - } -protected function addedItem($item) - { - if($this->_owner) - $this->_owner->getControls()->add($item); - } -protected function removedItem($item) - { - if($this->_owner) - $this->_owner->getControls()->remove($item); - } -} -class TTableCellCollection extends TList +public function __construct($owner=null)
+{
+$this->_owner=$owner;
+} +public function insertAt($index,$item)
+{
+if($item instanceof TTableCell)
+{
+parent::insertAt($index,$item);
+if($this->_owner)
+$this->_owner->getControls()->insertAt($index,$item);
+}
+else
+throw new TInvalidDataTypeException('tablecellcollection_tablecell_required');
+} +public function removeAt($index)
+{
+$item=parent::removeAt($index);
+if($item instanceof TTableCell)
+$this->_owner->getControls()->remove($item);
+return $item;
+}
+}
+ +class TTable extends TWebControl
+{ +private $_rows=null; +protected function getTagName()
+{
+return 'table';
+} +public function addParsedObject($object)
+{
+if($object instanceof TTableRow)
+$this->getRows()->add($object);
+} +protected function createStyle()
+{
+return new TTableStyle;
+} +protected function addAttributesToRender($writer)
+{
+parent::addAttributesToRender($writer);
+$border=0;
+if($this->getHasStyle())
+{
+if($this->getGridLines()!=='None')
+{
+if(($border=$this->getBorderWidth())==='')
+$border=1;
+else
+$border=(int)$border;
+}
+}
+$writer->addAttribute('border',"$border");
+} +public function getRows()
+{
+if(!$this->_rows)
+$this->_rows=new TTableRowCollection($this);
+return $this->_rows;
+} +public function getCaption()
+{
+return $this->getViewState('Caption','');
+} +public function setCaption($value)
+{
+$this->setViewState('Caption',$value,'');
+} +public function getCaptionAlign()
+{
+return $this->getViewState('CaptionAlign','NotSet');
+} +public function setCaptionAlign($value)
+{
+$this->setViewState('CaptionAlign',TPropertyValue::ensureEnum($value,'NotSet','Top','Bottom','Left','Right'),'NotSet');
+} +public function getCellSpacing()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getCellSpacing();
+else
+return -1;
+} +public function setCellSpacing($value)
+{
+$this->getStyle()->setCellSpacing($value);
+} +public function getCellPadding()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getCellPadding();
+else
+return -1;
+} +public function setCellPadding($value)
+{
+$this->getStyle()->setCellPadding($value);
+} +public function getHorizontalAlign()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getHorizontalAlign();
+else
+return 'NotSet';
+} +public function setHorizontalAlign($value)
+{
+$this->getStyle()->setHorizontalAlign($value);
+} +public function getGridLines()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getGridLines();
+else
+return 'None';
+} +public function setGridLines($value)
+{
+$this->getStyle()->setGridLines($value);
+} +public function getBackImageUrl()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getBackImageUrl();
+else
+return '';
+} +public function setBackImageUrl($value)
+{
+$this->getStyle()->setBackImageUrl($value);
+} +public function renderBeginTag($writer)
+{
+parent::renderBeginTag($writer);
+if(($caption=$this->getCaption())!=='')
+{
+if(($align=$this->getCaptionAlign())!=='NotSet')
+$writer->addAttribute('align',strtolower($align));
+$writer->renderBeginTag('caption');
+$writer->write($caption);
+$writer->renderEndTag();
+}
+} +protected function renderContents($writer)
+{
+if($this->_rows)
+{
+$writer->writeLine();
+foreach($this->_rows as $row)
+{
+$row->renderControl($writer);
+$writer->writeLine();
+}
+}
+}
+} +class TTableRowCollection extends TList
{ private $_owner=null; -public function __construct($owner=null) - { - $this->_owner=$owner; - } -protected function canAddItem($item) - { - return ($item instanceof TTableCell); - } -protected function addedItem($item) - { - if($this->_owner) - $this->_owner->getControls()->add($item); - } -protected function removedItem($item) - { - if($this->_owner) - $this->_owner->getControls()->remove($item); - } -} -?><?php -interface IDataSource -{ - public function getView($viewName); - public function getViewNames(); - public function onDataSourceChanged($param); -} -abstract class TDataSourceControl extends TControl implements IDataSource -{ - public function getView($viewName) - { - return null; - } -public function getViewNames() - { - return array(); - } -public function onDataSourceChanged($param) - { - $this->raiseEvent('OnDataSourceChanged',$this,$param); - } -public function focus() - { - throw new TNotSupportedException('datasourcecontrol_focus_unsupported'); - } -public function getEnableTheming() - { - return false; - } -public function setEnableTheming($value) - { - throw new TNotSupportedException('datasourcecontrol_enabletheming_unsupported'); - } -public function getSkinID() - { - return ''; - } -public function setSkinID($value) - { - throw new TNotSupportedException('datasourcecontrol_skinid_unsupported'); - } -public function getVisible($checkParents=true) - { - return false; - } -public function setVisible($value) - { - throw new TNotSupportedException('datasourcecontrol_visible_unsupported'); - } -} -class TReadOnlyDataSource extends TDataSourceControl -{ - private $_dataSource; - private $_dataMember; -public function __construct($dataSource,$dataMember) - { - if(!is_array($dataSource) && !($dataSource instanceof IDataSource) && !($dataSource instanceof Traversable)) - throw new TInvalidDataTypeException('readonlydatasource_datasource_invalid'); - $this->_dataSource=$dataSource; - $this->_dataMember=$dataMember; - } -public function getView($viewName) - { - if($this->_dataSource instanceof IDataSource) - return $this->_dataSource->getView($viewName); - else - return new TReadOnlyDataSourceView($this,$this->_dataMember,$this->_dataSource); - } -} -?><?php -class TDataSourceSelectParameters extends TComponent -{ - private $_retrieveTotalRowCount=false; - private $_startRowIndex=0; - private $_totalRowCount=0; - private $_maximumRows=0; -public function getStartRowIndex() - { - return $this->_startRowIndex; - } -public function setStartRowIndex($value) - { - if(($value=TPropertyValue::ensureInteger($value))<0) - $value=0; - $this->_startRowIndex=$value; - } -public function getMaximumRows() - { - return $this->_maximumRows; - } -public function setMaximumRows($value) - { - if(($value=TPropertyValue::ensureInteger($value))<0) - $value=0; - $this->_maximumRows=$value; - } -public function getRetrieveTotalRowCount() - { - return $this->_retrieveTotalRowCount; - } -public function setRetrieveTotalRowCount($value) - { - $this->_retrieveTotalRowCount=TPropertyValue::ensureBoolean($value); - } -public function getTotalRowCount() - { - return $this->_totalRowCount; - } -public function setTotalRowCount($value) - { - if(($value=TPropertyValue::ensureInteger($value))<0) - $value=0; - $this->_totalRowCount=$value; - } -} -abstract class TDataSourceView extends TComponent -{ - private $_owner; - private $_name; -public function __construct(IDataSource $owner,$viewName) - { - $this->_owner=$owner; - $this->_name=$viewName; - } -abstract public function select($parameters); -public function insert($values) - { - throw new TNotSupportedException('datasourceview_insert_unsupported'); - } -public function update($keys,$values) - { - throw new TNotSupportedException('datasourceview_update_unsupported'); - } -public function delete($keys) - { - throw new TNotSupportedException('datasourceview_delete_unsupported'); - } -public function getCanDelete() - { - return false; - } -public function getCanInsert() - { - return false; - } -public function getCanPage() - { - return false; - } -public function getCanGetRowCount() - { - return false; - } -public function getCanSort() - { - return false; - } -public function getCanUpdate() - { - return false; - } -public function getName() - { - return $this->_name; - } -public function getDataSource() - { - return $this->_owner; - } -protected function onDataSourceViewChanged($param) - { - $this->raiseEvent('OnDataSourceViewChanged',$this,$param); - } -} -class TReadOnlyDataSourceView extends TDataSourceView -{ - private $_dataSource=null; -public function __construct(IDataSource $owner,$viewName,$dataSource) - { - parent::__construct($owner,$viewName); - if($dataSource===null || is_array($dataSource)) - $this->_dataSource=new TMap($dataSource); - else if($dataSource instanceof Traversable) - $this->_dataSource=$dataSource; - else - throw new TInvalidDataTypeException('readonlydatasourceview_datasource_invalid'); - } -public function select($parameters) - { - return $this->_dataSource; - } -} -?><?php - - -abstract class TDataBoundControl extends TWebControl -{ - private $_initialized=false; - private $_dataSource=null; - private $_requiresBindToNull=false; - private $_requiresDataBinding=false; - private $_prerendered=false; - private $_currentView=null; - private $_currentDataSource=null; - private $_currentViewValid=false; - private $_currentDataSourceValid=false; - private $_currentViewIsFromDataSourceID=false; - private $_parameters=null; - private $_isDataBound=false; -public function getDataSource() - { - return $this->_dataSource; - } -public function setDataSource($value) - { - $this->_dataSource=$this->validateDataSource($value);; - $this->onDataSourceChanged(); - } -public function getDataSourceID() - { - return $this->getViewState('DataSourceID',''); - } -public function setDataSourceID($value) - { - $dsid=$this->getViewState('DataSourceID',''); - if($dsid!=='' && $value==='') - $this->_requiresBindToNull=true; - $this->setViewState('DataSourceID',$value,''); - $this->onDataSourceChanged(); - } -protected function getUsingDataSourceID() - { - return $this->getDataSourceID()!==''; - } -protected function onDataSourceChanged() - { - $this->_currentViewValid=false; - $this->_currentDataSourceValid=false; - if($this->getInitialized()) - $this->setRequiresDataBinding(true); - } -protected function getInitialized() - { - return $this->_initialized; - } -protected function setInitialized($value) - { - $this->_initialized=TPropertyValue::ensureBoolean($value); - } -protected function getIsDataBound() - { - return $this->_isDataBound; - } -protected function setIsDataBound($value) - { - $this->_isDataBound=$value; - } -protected function getRequiresDataBinding() - { - return $this->_requiresDataBinding; - } -protected function setRequiresDataBinding($value) - { - $value=TPropertyValue::ensureBoolean($value); - if($value && $this->_prerendered) - { - $this->_requiresDataBinding=true; - $this->ensureDataBound(); - } - else - $this->_requiresDataBinding=$value; - } -protected function ensureDataBound() - { - if($this->_requiresDataBinding && ($this->getUsingDataSourceID() || $this->_requiresBindToNull)) - { - $this->dataBind(); - $this->_requiresBindToNull=false; - } - } -public function dataBind() - { - $this->setRequiresDataBinding(false); - $this->dataBindProperties(); - $this->onDataBinding(null); - $data=$this->getData(); - if($data instanceof Traversable) - $this->performDataBinding($data); - else if($data!==null) - throw new TInvalidDataTypeException('databoundcontrol_data_nontraversable'); - $this->setIsDataBound(true); - $this->onDataBound(null); - } -public function dataSourceViewChanged($sender,$param) - { - if(!$this->_ignoreDataSourceViewChanged) - $this->setRequiresDataBinding(true); - } -protected function getData() - { - if(($view=$this->getDataSourceView())!==null) - return $view->select($this->getSelectParameters()); - else - return null; - } -protected function getDataSourceView() - { - if(!$this->_currentViewValid) - { - if($this->_currentView && $this->_currentViewIsFromDataSourceID) - $this->_currentView->detachEventHandler('DataSourceViewChanged',array($this,'dataSourceViewChanged')); - if(($dataSource=$this->determineDataSource())!==null) - { - if(($view=$dataSource->getView($this->getDataMember()))===null) - throw new TInvalidDataValueException('databoundcontrol_datamember_invalid',$this->getDataMember()); - if($this->_currentViewIsFromDataSourceID=$this->getUsingDataSourceID()) - $view->attachEventHandler('OnDataSourceViewChanged',array($this,'dataSourceViewChanged')); - $this->_currentView=$view; - } - else - $this->_currentView=null; - $this->_currentViewValid=true; - } - return $this->_currentView; - } -protected function determineDataSource() - { - if(!$this->_currentDataSourceValid) - { - if(($dsid=$this->getDataSourceID())!=='') - { - if(($dataSource=$this->getNamingContainer()->findControl($dsid))===null) - throw new TInvalidDataValueException('databoundcontrol_datasourceid_inexistent',$dsid); - else if(!($dataSource instanceof IDataSource)) - throw new TInvalidDataValueException('databoundcontrol_datasourceid_invalid',$dsid); - else - $this->_currentDataSource=$dataSource; - } - else if(($dataSource=$this->getDataSource())!==null) - $this->_currentDataSource=new TReadOnlyDataSource($dataSource,$this->getDataMember()); - else - $this->_currentDataSource=null; - $this->_currentDataSourceValid=true; - } - return $this->_currentDataSource; - } -abstract protected function performDataBinding($data); -public function onDataBound($param) - { - $this->raiseEvent('OnDataBound',$this,$param); - } -protected function onInit($param) - { - parent::onInit($param); - $page=$this->getPage(); - $page->attachEventHandler('OnPreLoad',array($this,'onPagePreLoad')); - } -protected function onPagePreLoad($sender,$param) - { - $this->_initialized=true; - $isPostBack=$this->getPage()->getIsPostBack(); - if(!$isPostBack || ($isPostBack && (!$this->getEnableViewState(true) || !$this->getIsDataBound()))) - $this->setRequiresDataBinding(true); - } -protected function onPreRender($param) - { - $this->_prerendered=true; - $this->ensureDataBound(); - parent::onPreRender($param); - } -protected function validateDataSource($value) - { - if(is_string($value)) - { - $list=new TList; - foreach(TPropertyValue::ensureArray($value) as $key=>$value) - { - if(is_array($value)) - $list->add($value); - else - $list->add(array($value,is_string($key)?$key:$value)); - } - return $list; - } - else if(is_array($value)) - return new TMap($value); - else if(($value instanceof Traversable) || $value===null) - return $value; - else - throw new TInvalidDataTypeException('databoundcontrol_datasource_invalid'); - } -public function getDataMember() - { - return $this->getViewState('DataMember',''); - } -public function setDataMember($value) - { - $this->setViewState('DataMember',$value,''); - } -public function getSelectParameters() - { - if(!$this->_parameters) - $this->_parameters=new TDataSourceSelectParameters; - return $this->_parameters; - } -} -?><?php +public function __construct($owner=null)
+{
+$this->_owner=$owner;
+} +public function insertAt($index,$item)
+{
+if($item instanceof TTableRow)
+{
+parent::insertAt($index,$item);
+if($this->_owner)
+$this->_owner->getControls()->insertAt($index,$item);
+}
+else
+throw new TInvalidDataTypeException('tablerowcollection_tablerow_required');
+} +public function removeAt($index)
+{
+$item=parent::removeAt($index);
+if($item instanceof TTableRow)
+$this->_owner->getControls()->remove($item);
+return $item;
+}
+} +interface IDataSource
+{
+public function getView($viewName);
+public function getViewNames();
+public function onDataSourceChanged($param);
+} +abstract class TDataSourceControl extends TControl implements IDataSource
+{
+public function getView($viewName)
+{
+return null;
+} +public function getViewNames()
+{
+return array();
+} +public function onDataSourceChanged($param)
+{
+$this->raiseEvent('OnDataSourceChanged',$this,$param);
+} +public function focus()
+{
+throw new TNotSupportedException('datasourcecontrol_focus_unsupported');
+} +public function getEnableTheming()
+{
+return false;
+} +public function setEnableTheming($value)
+{
+throw new TNotSupportedException('datasourcecontrol_enabletheming_unsupported');
+} +public function getSkinID()
+{
+return '';
+} +public function setSkinID($value)
+{
+throw new TNotSupportedException('datasourcecontrol_skinid_unsupported');
+} +public function getVisible($checkParents=true)
+{
+return false;
+} +public function setVisible($value)
+{
+throw new TNotSupportedException('datasourcecontrol_visible_unsupported');
+}
+} +class TReadOnlyDataSource extends TDataSourceControl
+{
+private $_dataSource;
+private $_dataMember; +public function __construct($dataSource,$dataMember)
+{
+if(!is_array($dataSource) && !($dataSource instanceof IDataSource) && !($dataSource instanceof Traversable))
+throw new TInvalidDataTypeException('readonlydatasource_datasource_invalid');
+$this->_dataSource=$dataSource;
+$this->_dataMember=$dataMember;
+} +public function getView($viewName)
+{
+if($this->_dataSource instanceof IDataSource)
+return $this->_dataSource->getView($viewName);
+else
+return new TReadOnlyDataSourceView($this,$this->_dataMember,$this->_dataSource);
+}
+} +class TDataSourceSelectParameters extends TComponent
+{
+private $_retrieveTotalRowCount=false;
+private $_startRowIndex=0;
+private $_totalRowCount=0;
+private $_maximumRows=0; +public function getStartRowIndex()
+{
+return $this->_startRowIndex;
+} +public function setStartRowIndex($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))<0)
+$value=0;
+$this->_startRowIndex=$value;
+} +public function getMaximumRows()
+{
+return $this->_maximumRows;
+} +public function setMaximumRows($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))<0)
+$value=0;
+$this->_maximumRows=$value;
+} +public function getRetrieveTotalRowCount()
+{
+return $this->_retrieveTotalRowCount;
+} +public function setRetrieveTotalRowCount($value)
+{
+$this->_retrieveTotalRowCount=TPropertyValue::ensureBoolean($value);
+} +public function getTotalRowCount()
+{
+return $this->_totalRowCount;
+} +public function setTotalRowCount($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))<0)
+$value=0;
+$this->_totalRowCount=$value;
+}
+} +abstract class TDataSourceView extends TComponent
+{
+private $_owner;
+private $_name; +public function __construct(IDataSource $owner,$viewName)
+{
+$this->_owner=$owner;
+$this->_name=$viewName;
+} +abstract public function select($parameters); +public function insertAt($values)
+{
+throw new TNotSupportedException('datasourceview_insert_unsupported');
+} +public function update($keys,$values)
+{
+throw new TNotSupportedException('datasourceview_update_unsupported');
+} +public function delete($keys)
+{
+throw new TNotSupportedException('datasourceview_delete_unsupported');
+} +public function getCanDelete()
+{
+return false;
+} +public function getCanInsert()
+{
+return false;
+} +public function getCanPage()
+{
+return false;
+} +public function getCanGetRowCount()
+{
+return false;
+} +public function getCanSort()
+{
+return false;
+} +public function getCanUpdate()
+{
+return false;
+} +public function getName()
+{
+return $this->_name;
+} +public function getDataSource()
+{
+return $this->_owner;
+} +public function onDataSourceViewChanged($param)
+{
+$this->raiseEvent('OnDataSourceViewChanged',$this,$param);
+}
+} +class TReadOnlyDataSourceView extends TDataSourceView
+{
+private $_dataSource=null; +public function __construct(IDataSource $owner,$viewName,$dataSource)
+{
+parent::__construct($owner,$viewName);
+if($dataSource===null || is_array($dataSource))
+$this->_dataSource=new TMap($dataSource);
+else if($dataSource instanceof Traversable)
+$this->_dataSource=$dataSource;
+else
+throw new TInvalidDataTypeException('readonlydatasourceview_datasource_invalid');
+} +public function select($parameters)
+{
+return $this->_dataSource;
+}
+} -class TCheckBoxList extends TListControl implements IRepeatInfoUser, INamingContainer, IPostBackDataHandler -{ - private $_repeatedControl; - private $_isEnabled; - private $_changedEventRaised=false; -public function __construct() - { - parent::__construct(); - $this->_repeatedControl=$this->createRepeatedControl(); - $this->_repeatedControl->setEnableViewState(false); - $this->_repeatedControl->setID('0'); - $this->getControls()->add($this->_repeatedControl); - } -protected function createRepeatedControl() - { - return new TCheckBox; - } -public function findControl($id) - { - return $this; - } -protected function getIsMultiSelect() - { - return true; - } -protected function createStyle() - { - return new TTableStyle; - } -public function getTextAlign() - { - return $this->getViewState('TextAlign','Right'); - } -public function setTextAlign($value) - { - $this->setViewState('TextAlign',TPropertyValue::ensureEnum($value,array('Left','Right')),'Right'); - } -protected function getRepeatInfo() - { - if(($repeatInfo=$this->getViewState('RepeatInfo',null))===null) - { - $repeatInfo=new TRepeatInfo; - $this->setViewState('RepeatInfo',$repeatInfo,null); - } - return $repeatInfo; - } -public function getRepeatColumns() - { - return $this->getRepeatInfo()->getRepeatColumns(); - } -public function setRepeatColumns($value) - { - $this->getRepeatInfo()->setRepeatColumns($value); - } -public function getRepeatDirection() - { - return $this->getRepeatInfo()->getRepeatDirection(); - } -public function setRepeatDirection($value) - { - $this->getRepeatInfo()->setRepeatDirection($value); - } -public function getRepeatLayout() - { - return $this->getRepeatInfo()->getRepeatLayout(); - } -public function setRepeatLayout($value) - { - $this->getRepeatInfo()->setRepeatLayout($value); - } -public function getCellSpacing() - { - if($this->getHasStyle()) - return $this->getStyle()->getCellSpacing(); - else - return -1; - } -public function setCellSpacing($value) - { - $this->getStyle()->setCellSpacing($value); - } -public function getCellPadding() - { - if($this->getHasStyle()) - return $this->getStyle()->getCellPadding(); - else - return -1; - } -public function setCellPadding($value) - { - $this->getStyle()->setCellPadding($value); - } -public function getHasHeader() - { - return false; - } -public function getHasFooter() - { - return false; - } -public function getHasSeparators() - { - return false; - } -public function generateItemStyle($itemType,$index) - { - return null; - } -public function renderItem($writer,$repeatInfo,$itemType,$index) - { - $item=$this->getItems()->itemAt($index); - if($item->getHasAttributes()) - $this->_repeatedControl->getAttributes()->copyFrom($item->getAttributes()); - else if($this->_repeatedControl->getHasAttributes()) - $this->_repeatedControl->getAttributes()->clear(); - $this->_repeatedControl->setID("$index"); - $this->_repeatedControl->setText($item->getText()); - $this->_repeatedControl->setChecked($item->getSelected()); - $this->_repeatedControl->setAttribute('value',$item->getValue()); - $this->_repeatedControl->setEnabled($this->_isEnabled && $item->getEnabled()); - $this->_repeatedControl->renderControl($writer); - } -public function loadPostData($key,$values) - { - if($this->getEnabled(true)) - { - $index=(int)substr($key,strlen($this->getUniqueID())+1); - $this->ensureDataBound(); - if($index>=0 && $index<$this->getItemCount()) - { - $item=$this->getItems()->itemAt($index); - if($item->getEnabled()) - { - $checked=isset($values[$key]); - if($item->getSelected()!=$checked) - { - $item->setSelected($checked); - if(!$this->_changedEventRaised) - { - $this->_changedEventRaised=true; - return true; - } - } - } - } - } - return false; - } -public function raisePostDataChangedEvent() - { - $page=$this->getPage(); - if($this->getAutoPostBack() && !$page->getPostBackEventTarget()) - { - $page->setPostBackEventTarget($this); - if($this->getCausesValidation()) - $page->validate($this->getValidationGroup()); - } - $this->onSelectedIndexChanged(null); - } -protected function onPreRender($param) - { - parent::onPreRender($param); - $this->_repeatedControl->setAutoPostBack($this->getAutoPostBack()); - $this->_repeatedControl->setCausesValidation($this->getCausesValidation()); - $this->_repeatedControl->setValidationGroup($this->getValidationGroup()); - $page=$this->getPage(); - $n=$this->getItemCount(); - for($i=0;$i<$n;++$i) - { - $this->_repeatedControl->setID("$i"); - $page->registerRequiresPostData($this->_repeatedControl); - } - } -protected function render($writer) - { - if($this->getItemCount()>0) - { - $this->_isEnabled=$this->getEnabled(true); - $repeatInfo=$this->getRepeatInfo(); - $accessKey=$this->getAccessKey(); - $tabIndex=$this->getTabIndex(); - $this->_repeatedControl->setTextAlign($this->getTextAlign()); - $this->_repeatedControl->setAccessKey($accessKey); - $this->_repeatedControl->setTabIndex($tabIndex); - $this->setAccessKey(''); - $this->setTabIndex(0); - $repeatInfo->renderRepeater($writer,$this); - $this->setAccessKey($accessKey); - $this->setTabIndex($tabIndex); - } - } -} -?><?php +abstract class TDataBoundControl extends TWebControl
+{
+private $_initialized=false;
+private $_dataSource=null;
+private $_requiresBindToNull=false;
+private $_requiresDataBinding=false;
+private $_prerendered=false;
+private $_currentView=null;
+private $_currentDataSource=null;
+private $_currentViewValid=false;
+private $_currentDataSourceValid=false;
+private $_currentViewIsFromDataSourceID=false;
+private $_parameters=null;
+private $_isDataBound=false; +public function getDataSource()
+{
+return $this->_dataSource;
+} +public function setDataSource($value)
+{
+$this->_dataSource=$this->validateDataSource($value);;
+$this->onDataSourceChanged();
+} +public function getDataSourceID()
+{
+return $this->getViewState('DataSourceID','');
+} +public function setDataSourceID($value)
+{
+$dsid=$this->getViewState('DataSourceID','');
+if($dsid!=='' && $value==='')
+$this->_requiresBindToNull=true;
+$this->setViewState('DataSourceID',$value,'');
+$this->onDataSourceChanged();
+} +protected function getUsingDataSourceID()
+{
+return $this->getDataSourceID()!=='';
+} +public function onDataSourceChanged()
+{
+$this->_currentViewValid=false;
+$this->_currentDataSourceValid=false;
+if($this->getInitialized())
+$this->setRequiresDataBinding(true);
+} +protected function getInitialized()
+{
+return $this->_initialized;
+} +protected function setInitialized($value)
+{
+$this->_initialized=TPropertyValue::ensureBoolean($value);
+} +protected function getIsDataBound()
+{
+return $this->_isDataBound;
+} +protected function setIsDataBound($value)
+{
+$this->_isDataBound=$value;
+} +protected function getRequiresDataBinding()
+{
+return $this->_requiresDataBinding;
+} +protected function setRequiresDataBinding($value)
+{
+$value=TPropertyValue::ensureBoolean($value);
+if($value && $this->_prerendered)
+{
+$this->_requiresDataBinding=true;
+$this->ensureDataBound();
+}
+else
+$this->_requiresDataBinding=$value;
+} +protected function ensureDataBound()
+{
+if($this->_requiresDataBinding && ($this->getUsingDataSourceID() || $this->_requiresBindToNull))
+{
+$this->dataBind();
+$this->_requiresBindToNull=false;
+}
+} +public function dataBind()
+{
+$this->setRequiresDataBinding(false);
+$this->dataBindProperties();
+$this->onDataBinding(null);
+$data=$this->getData();
+if($data instanceof Traversable)
+$this->performDataBinding($data);
+else if($data!==null)
+throw new TInvalidDataTypeException('databoundcontrol_data_nontraversable');
+$this->setIsDataBound(true);
+$this->onDataBound(null);
+} +public function dataSourceViewChanged($sender,$param)
+{
+if(!$this->_ignoreDataSourceViewChanged)
+$this->setRequiresDataBinding(true);
+} +protected function getData()
+{
+if(($view=$this->getDataSourceView())!==null)
+return $view->select($this->getSelectParameters());
+else
+return null;
+} +protected function getDataSourceView()
+{
+if(!$this->_currentViewValid)
+{
+if($this->_currentView && $this->_currentViewIsFromDataSourceID)
+$this->_currentView->detachEventHandler('DataSourceViewChanged',array($this,'dataSourceViewChanged'));
+if(($dataSource=$this->determineDataSource())!==null)
+{
+if(($view=$dataSource->getView($this->getDataMember()))===null)
+throw new TInvalidDataValueException('databoundcontrol_datamember_invalid',$this->getDataMember());
+if($this->_currentViewIsFromDataSourceID=$this->getUsingDataSourceID())
+$view->attachEventHandler('OnDataSourceViewChanged',array($this,'dataSourceViewChanged'));
+$this->_currentView=$view;
+}
+else
+$this->_currentView=null;
+$this->_currentViewValid=true;
+}
+return $this->_currentView;
+} +protected function determineDataSource()
+{
+if(!$this->_currentDataSourceValid)
+{
+if(($dsid=$this->getDataSourceID())!=='')
+{
+if(($dataSource=$this->getNamingContainer()->findControl($dsid))===null)
+throw new TInvalidDataValueException('databoundcontrol_datasourceid_inexistent',$dsid);
+else if(!($dataSource instanceof IDataSource))
+throw new TInvalidDataValueException('databoundcontrol_datasourceid_invalid',$dsid);
+else
+$this->_currentDataSource=$dataSource;
+}
+else if(($dataSource=$this->getDataSource())!==null)
+$this->_currentDataSource=new TReadOnlyDataSource($dataSource,$this->getDataMember());
+else
+$this->_currentDataSource=null;
+$this->_currentDataSourceValid=true;
+}
+return $this->_currentDataSource;
+} +abstract protected function performDataBinding($data); +public function onDataBound($param)
+{
+$this->raiseEvent('OnDataBound',$this,$param);
+} +public function onInit($param)
+{
+parent::onInit($param);
+$page=$this->getPage();
+$page->attachEventHandler('OnPreLoad',array($this,'onPagePreLoad'));
+} +public function onPagePreLoad($sender,$param)
+{
+$this->_initialized=true;
+$isPostBack=$this->getPage()->getIsPostBack();
+if(!$isPostBack || ($isPostBack && (!$this->getEnableViewState(true) || !$this->getIsDataBound())))
+$this->setRequiresDataBinding(true);
+} +public function onPreRender($param)
+{
+$this->_prerendered=true;
+$this->ensureDataBound();
+parent::onPreRender($param);
+} +protected function validateDataSource($value)
+{
+if(is_string($value))
+{
+$list=new TList;
+foreach(TPropertyValue::ensureArray($value) as $key=>$value)
+{
+if(is_array($value))
+$list->add($value);
+else
+$list->add(array($value,is_string($key)?$key:$value));
+}
+return $list;
+}
+else if(is_array($value))
+return new TMap($value);
+else if(($value instanceof Traversable) || $value===null)
+return $value;
+else
+throw new TInvalidDataTypeException('databoundcontrol_datasource_invalid');
+} +public function getDataMember()
+{
+return $this->getViewState('DataMember','');
+} +public function setDataMember($value)
+{
+$this->setViewState('DataMember',$value,'');
+} +public function getSelectParameters()
+{
+if(!$this->_parameters)
+$this->_parameters=new TDataSourceSelectParameters;
+return $this->_parameters;
+}
+} +class TCheckBoxList extends TListControl implements IRepeatInfoUser, INamingContainer, IPostBackDataHandler
+{
+private $_repeatedControl;
+private $_isEnabled;
+private $_changedEventRaised=false; +public function __construct()
+{
+parent::__construct();
+$this->_repeatedControl=$this->createRepeatedControl();
+$this->_repeatedControl->setEnableViewState(false);
+$this->_repeatedControl->setID('0');
+$this->getControls()->add($this->_repeatedControl);
+} +protected function createRepeatedControl()
+{
+return new TCheckBox;
+} +public function findControl($id)
+{
+return $this;
+} +protected function getIsMultiSelect()
+{
+return true;
+} +protected function createStyle()
+{
+return new TTableStyle;
+} +public function getTextAlign()
+{
+return $this->getViewState('TextAlign','Right');
+} +public function setTextAlign($value)
+{
+$this->setViewState('TextAlign',TPropertyValue::ensureEnum($value,array('Left','Right')),'Right');
+} +protected function getRepeatInfo()
+{
+if(($repeatInfo=$this->getViewState('RepeatInfo',null))===null)
+{
+$repeatInfo=new TRepeatInfo;
+$this->setViewState('RepeatInfo',$repeatInfo,null);
+}
+return $repeatInfo;
+} +public function getRepeatColumns()
+{
+return $this->getRepeatInfo()->getRepeatColumns();
+} +public function setRepeatColumns($value)
+{
+$this->getRepeatInfo()->setRepeatColumns($value);
+} +public function getRepeatDirection()
+{
+return $this->getRepeatInfo()->getRepeatDirection();
+} +public function setRepeatDirection($value)
+{
+$this->getRepeatInfo()->setRepeatDirection($value);
+} +public function getRepeatLayout()
+{
+return $this->getRepeatInfo()->getRepeatLayout();
+} +public function setRepeatLayout($value)
+{
+$this->getRepeatInfo()->setRepeatLayout($value);
+} +public function getCellSpacing()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getCellSpacing();
+else
+return -1;
+} +public function setCellSpacing($value)
+{
+$this->getStyle()->setCellSpacing($value);
+} +public function getCellPadding()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getCellPadding();
+else
+return -1;
+} +public function setCellPadding($value)
+{
+$this->getStyle()->setCellPadding($value);
+} +public function getHasHeader()
+{
+return false;
+} +public function getHasFooter()
+{
+return false;
+} +public function getHasSeparators()
+{
+return false;
+} +public function generateItemStyle($itemType,$index)
+{
+return null;
+} +public function renderItem($writer,$repeatInfo,$itemType,$index)
+{
+$item=$this->getItems()->itemAt($index);
+if($item->getHasAttributes())
+$this->_repeatedControl->getAttributes()->copyFrom($item->getAttributes());
+else if($this->_repeatedControl->getHasAttributes())
+$this->_repeatedControl->getAttributes()->clear();
+$this->_repeatedControl->setID("$index");
+$this->_repeatedControl->setText($item->getText());
+$this->_repeatedControl->setChecked($item->getSelected());
+$this->_repeatedControl->setAttribute('value',$item->getValue());
+$this->_repeatedControl->setEnabled($this->_isEnabled && $item->getEnabled());
+$this->_repeatedControl->renderControl($writer);
+} +public function loadPostData($key,$values)
+{
+if($this->getEnabled(true))
+{
+$index=(int)substr($key,strlen($this->getUniqueID())+1);
+$this->ensureDataBound();
+if($index>=0 && $index<$this->getItemCount())
+{
+$item=$this->getItems()->itemAt($index);
+if($item->getEnabled())
+{
+$checked=isset($values[$key]);
+if($item->getSelected()!=$checked)
+{
+$item->setSelected($checked);
+if(!$this->_changedEventRaised)
+{
+$this->_changedEventRaised=true;
+return true;
+}
+}
+}
+}
+}
+return false;
+} +public function raisePostDataChangedEvent()
+{
+if($this->getAutoPostBack() && $this->getCausesValidation())
+$this->getPage()->validate($this->getValidationGroup());
+$this->onSelectedIndexChanged(null);
+} +public function onPreRender($param)
+{
+parent::onPreRender($param);
+$this->_repeatedControl->setAutoPostBack($this->getAutoPostBack());
+$this->_repeatedControl->setCausesValidation($this->getCausesValidation());
+$this->_repeatedControl->setValidationGroup($this->getValidationGroup());
+$page=$this->getPage();
+$n=$this->getItemCount();
+for($i=0;$i<$n;++$i)
+{
+$this->_repeatedControl->setID("$i");
+$page->registerRequiresPostData($this->_repeatedControl);
+}
+} +protected function render($writer)
+{
+if($this->getItemCount()>0)
+{
+$this->_isEnabled=$this->getEnabled(true);
+$repeatInfo=$this->getRepeatInfo();
+$accessKey=$this->getAccessKey();
+$tabIndex=$this->getTabIndex();
+$this->_repeatedControl->setTextAlign($this->getTextAlign());
+$this->_repeatedControl->setAccessKey($accessKey);
+$this->_repeatedControl->setTabIndex($tabIndex);
+$this->setAccessKey('');
+$this->setTabIndex(0);
+$repeatInfo->renderRepeater($writer,$this);
+$this->setAccessKey($accessKey);
+$this->setTabIndex($tabIndex);
+}
+}
+} -class TRadioButtonList extends TCheckBoxList -{ -protected function getIsMultiSelect() - { - return false; - } -protected function createRepeatedControl() - { - return new TRadioButton; - } -public function loadPostData($key,$values) - { - $value=isset($values[$key])?$values[$key]:''; - $oldSelection=$this->getSelectedIndex(); - $this->ensureDataBound(); - foreach($this->getItems() as $index=>$item) - { - if($item->getEnabled() && $item->getValue()===$value) - { - if($index===$oldSelection) - return false; - else - { - $this->setSelectedIndex($index); - return true; - } - } - } - return false; - } -public function setSelectedIndices($indices) - { - throw new TNotSupportedException('radiobuttonlist_selectedindices_unsupported'); - } -} -?><?php +class TRadioButtonList extends TCheckBoxList
+{ +protected function getIsMultiSelect()
+{
+return false;
+} +protected function createRepeatedControl()
+{
+return new TRadioButton;
+} +public function loadPostData($key,$values)
+{
+$value=isset($values[$key])?$values[$key]:'';
+$oldSelection=$this->getSelectedIndex();
+$this->ensureDataBound();
+foreach($this->getItems() as $index=>$item)
+{
+if($item->getEnabled() && $item->getValue()===$value)
+{
+if($index===$oldSelection)
+return false;
+else
+{
+$this->setSelectedIndex($index);
+return true;
+}
+}
+}
+return false;
+} +public function setSelectedIndices($indices)
+{
+throw new TNotSupportedException('radiobuttonlist_selectedindices_unsupported');
+}
+} -class TBulletedList extends TListControl implements IPostBackEventHandler +class TBulletedList extends TListControl implements IPostBackEventHandler
{ private $_isEnabled; private $_postBackOptions; private $_currentRenderItemIndex; -public function raisePostBackEvent($param) - { - if($this->getCausesValidation()) - $this->getPage()->validate($this->getValidationGroup()); - $this->onClick(new TBulletedListEventParameter((int)$param)); - } -protected function getTagName() - { - switch($this->getBulletStyle()) - { - case 'Numbered': - case 'LowerAlpha': - case 'UpperAlpha': - case 'LowerRoman': - case 'UpperRoman': - return 'ol'; - } - return 'ul'; - } -protected function addAttributesToRender($writer) - { - $needStart=false; - switch($this->getBulletStyle()) - { - case 'Numbered': - $writer->addStyleAttribute('list-style-type','decimal'); - $needStart=true; - break; - case 'LowerAlpha': - $writer->addStyleAttribute('list-style-type','lower-alpha'); - $needStart=true; - break; - case 'UpperAlpha': - $writer->addStyleAttribute('list-style-type','upper-alpha'); - $needStart=true; - break; - case 'LowerRoman': - $writer->addStyleAttribute('list-style-type','lower-roman'); - $needStart=true; - break; - case 'UpperRoman': - $writer->addStyleAttribute('list-style-type','upper-roman'); - $needStart=true; - break; - case 'Disc': - $writer->addStyleAttribute('list-style-type','disc'); - break; - case 'Circle': - $writer->addStyleAttribute('list-style-type','circle'); - break; - case 'Square': - $writer->addStyleAttribute('list-style-type','square'); - break; - case 'CustomImage': - $url=$this->getBulletImageUrl(); - $writer->addStyleAttribute('list-style-image',"url($url)"); - break; - } - if($needStart && ($start=$this->getFirstBulletNumber())!=1) - $writer->addAttribute('start',"$start"); - parent::addAttributesToRender($writer); - } -public function getBulletImageUrl() - { - return $this->getViewState('BulletImageUrl',''); - } -public function setBulletImageUrl($value) - { - $this->setViewState('BulletImageUrl',$value,''); - } -public function getBulletStyle() - { - return $this->getViewState('BulletStyle','NotSet'); - } -public function setBulletStyle($value) - { - $this->setViewState('BulletStyle',TPropertyValue::ensureEnum($value,'NotSet','Numbered','LowerAlpha','UpperAlpha','LowerRoman','UpperRoman','Disc','Circle','Square','CustomImage'),'NotSet'); - } -public function getDisplayMode() - { - return $this->getViewState('DisplayMode','Text'); - } -public function setDisplayMode($value) - { - $this->setViewState('DisplayMode',TPropertyValue::ensureEnum($value,'Text','HyperLink','LinkButton'),'Text'); - } -public function getFirstBulletNumber() - { - return $this->getViewState('FirstBulletNumber',1); - } -public function setFirstBulletNumber($value) - { - $this->setViewState('FirstBulletNumber',TPropertyValue::ensureInteger($value),1); - } -public function onClick($param) - { - $this->raiseEvent('OnClick',$this,$param); - } -public function getTarget() - { - return $this->getViewState('Target',''); - } -public function setTarget($value) - { - $this->setViewState('Target',$value,''); - } -protected function render($writer) - { - if($this->getHasItems()) - parent::render($writer); - } -protected function renderContents($writer) - { - $this->_isEnabled=$this->getEnabled(true); - $this->_postBackOptions=$this->getPostBackOptions(); - $writer->writeLine(); - foreach($this->getItems() as $index=>$item) - { - if($item->getHasAttributes()) - { - foreach($item->getAttributes() as $name=>$value) - $writer->addAttribute($name,$value); - } - $writer->renderBeginTag('li'); - $this->renderBulletText($writer,$item,$index); - $writer->renderEndTag(); - $writer->writeLine(); - } - } -protected function renderBulletText($writer,$item,$index) - { - switch($this->getDisplayMode()) - { - case 'Text': - return $this->renderTextItem($writer, $item, $index); - case 'HyperLink': - $this->renderHyperLinkItem($writer, $item, $index); - break; - case 'LinkButton': - $this->renderLinkButtonItem($writer, $item, $index); - } - if(($accesskey=$this->getAccessKey())!=='') - $writer->addAttribute('accesskey',$accesskey); - $writer->renderBeginTag('a'); - $writer->write(THttpUtility::htmlEncode($item->getText())); - $writer->renderEndTag(); - } -protected function renderTextItem($writer, $item, $index) - { - if($item->getEnabled()) - $writer->write(THttpUtility::htmlEncode($item->getText())); - else - { - $writer->addAttribute('disabled','disabled'); - $writer->renderBeginTag('span'); - $writer->write(THttpUtility::htmlEncode($item->getText())); - $writer->renderEndTag(); - } - } -protected function renderHyperLinkItem($writer, $item, $index) - { - if(!$this->_isEnabled || !$item->getEnabled()) - $writer->addAttribute('disabled','disabled'); - else - { - $writer->addAttribute('href',$item->getValue()); - if(($target=$this->getTarget())!=='') - $writer->addAttribute('target',$target); - } - } -protected function renderLinkButtonItem($writer, $item, $index) - { - if(!$this->_isEnabled || !$item->getEnabled()) - $writer->addAttribute('disabled','disabled'); - else - { - $this->_currentRenderItemIndex = $index; - $this->getPage()->getClientScript()->registerPostbackControl($this); - $writer->addAttribute('id', $this->getClientID().$index); - $writer->addAttribute('href', "javascript:;//".$this->getClientID().$index); - } - } -public function getPostBackOptions() - { - $options['ValidationGroup'] = $this->getValidationGroup(); - $options['CausesValidation'] = $this->getCausesValidation(); - $options['EventTarget'] = $this->getUniqueID(); - $options['EventParameter'] = $this->_currentRenderItemIndex; - $options['ID'] = $this->getClientID().$this->_currentRenderItemIndex; - return $options; - } -protected function canCauseValidation() - { - $group = $this->getValidationGroup(); - $hasValidators = $this->getPage()->getValidators($group)->getCount()>0; - return $this->getCausesValidation() && $hasValidators; - } -public function setAutoPostBack($value) - { - throw new TNotSupportedException('bulletedlist_autopostback_unsupported'); - } -public function setSelectedIndex($index) - { - throw new TNotSupportedException('bulletedlist_selectedindex_unsupported'); - } -public function setSelectedIndices($indices) - { - throw new TNotSupportedException('bulletedlist_selectedindices_unsupported'); - } -public function setSelectedValue($value) - { - throw new TNotSupportedException('bulletedlist_selectedvalue_unsupported'); - } -} -class TBulletedListEventParameter extends TEventParameter +public function raisePostBackEvent($param)
+{
+if($this->getCausesValidation())
+$this->getPage()->validate($this->getValidationGroup());
+$this->onClick(new TBulletedListEventParameter((int)$param));
+} +protected function getTagName()
+{
+switch($this->getBulletStyle())
+{
+case 'Numbered':
+case 'LowerAlpha':
+case 'UpperAlpha':
+case 'LowerRoman':
+case 'UpperRoman':
+return 'ol';
+}
+return 'ul';
+} +protected function addAttributesToRender($writer)
+{
+$needStart=false;
+switch($this->getBulletStyle())
+{
+case 'Numbered':
+$writer->addStyleAttribute('list-style-type','decimal');
+$needStart=true;
+break;
+case 'LowerAlpha':
+$writer->addStyleAttribute('list-style-type','lower-alpha');
+$needStart=true;
+break;
+case 'UpperAlpha':
+$writer->addStyleAttribute('list-style-type','upper-alpha');
+$needStart=true;
+break;
+case 'LowerRoman':
+$writer->addStyleAttribute('list-style-type','lower-roman');
+$needStart=true;
+break;
+case 'UpperRoman':
+$writer->addStyleAttribute('list-style-type','upper-roman');
+$needStart=true;
+break;
+case 'Disc':
+$writer->addStyleAttribute('list-style-type','disc');
+break;
+case 'Circle':
+$writer->addStyleAttribute('list-style-type','circle');
+break;
+case 'Square':
+$writer->addStyleAttribute('list-style-type','square');
+break;
+case 'CustomImage':
+$url=$this->getBulletImageUrl();
+$writer->addStyleAttribute('list-style-image',"url($url)");
+break;
+}
+if($needStart && ($start=$this->getFirstBulletNumber())!=1)
+$writer->addAttribute('start',"$start");
+parent::addAttributesToRender($writer);
+} +public function getBulletImageUrl()
+{
+return $this->getViewState('BulletImageUrl','');
+} +public function setBulletImageUrl($value)
+{
+$this->setViewState('BulletImageUrl',$value,'');
+} +public function getBulletStyle()
+{
+return $this->getViewState('BulletStyle','NotSet');
+} +public function setBulletStyle($value)
+{
+$this->setViewState('BulletStyle',TPropertyValue::ensureEnum($value,'NotSet','Numbered','LowerAlpha','UpperAlpha','LowerRoman','UpperRoman','Disc','Circle','Square','CustomImage'),'NotSet');
+} +public function getDisplayMode()
+{
+return $this->getViewState('DisplayMode','Text');
+} +public function setDisplayMode($value)
+{
+$this->setViewState('DisplayMode',TPropertyValue::ensureEnum($value,'Text','HyperLink','LinkButton'),'Text');
+} +public function getFirstBulletNumber()
+{
+return $this->getViewState('FirstBulletNumber',1);
+} +public function setFirstBulletNumber($value)
+{
+$this->setViewState('FirstBulletNumber',TPropertyValue::ensureInteger($value),1);
+} +public function onClick($param)
+{
+$this->raiseEvent('OnClick',$this,$param);
+} +public function getTarget()
+{
+return $this->getViewState('Target','');
+} +public function setTarget($value)
+{
+$this->setViewState('Target',$value,'');
+} +protected function render($writer)
+{
+if($this->getHasItems())
+parent::render($writer);
+} +protected function renderContents($writer)
+{
+$this->_isEnabled=$this->getEnabled(true);
+$this->_postBackOptions=$this->getPostBackOptions();
+$writer->writeLine();
+foreach($this->getItems() as $index=>$item)
+{
+if($item->getHasAttributes())
+{
+foreach($item->getAttributes() as $name=>$value)
+$writer->addAttribute($name,$value);
+}
+$writer->renderBeginTag('li');
+$this->renderBulletText($writer,$item,$index);
+$writer->renderEndTag();
+$writer->writeLine();
+}
+} +protected function renderBulletText($writer,$item,$index)
+{
+switch($this->getDisplayMode())
+{
+case 'Text':
+return $this->renderTextItem($writer, $item, $index);
+case 'HyperLink':
+$this->renderHyperLinkItem($writer, $item, $index);
+break;
+case 'LinkButton':
+$this->renderLinkButtonItem($writer, $item, $index);
+}
+if(($accesskey=$this->getAccessKey())!=='')
+$writer->addAttribute('accesskey',$accesskey);
+$writer->renderBeginTag('a');
+$writer->write(THttpUtility::htmlEncode($item->getText()));
+$writer->renderEndTag();
+} +protected function renderTextItem($writer, $item, $index)
+{
+if($item->getEnabled())
+$writer->write(THttpUtility::htmlEncode($item->getText()));
+else
+{
+$writer->addAttribute('disabled','disabled');
+$writer->renderBeginTag('span');
+$writer->write(THttpUtility::htmlEncode($item->getText()));
+$writer->renderEndTag();
+}
+} +protected function renderHyperLinkItem($writer, $item, $index)
+{
+if(!$this->_isEnabled || !$item->getEnabled())
+$writer->addAttribute('disabled','disabled');
+else
+{
+$writer->addAttribute('href',$item->getValue());
+if(($target=$this->getTarget())!=='')
+$writer->addAttribute('target',$target);
+}
+} +protected function renderLinkButtonItem($writer, $item, $index)
+{
+if(!$this->_isEnabled || !$item->getEnabled())
+$writer->addAttribute('disabled','disabled');
+else
+{
+$this->_currentRenderItemIndex = $index;
+$this->getPage()->getClientScript()->registerPostbackControl($this);
+$writer->addAttribute('id', $this->getClientID().$index);
+$writer->addAttribute('href', "javascript:;//".$this->getClientID().$index);
+}
+} +public function getPostBackOptions()
+{
+$options['ValidationGroup'] = $this->getValidationGroup();
+$options['CausesValidation'] = $this->getCausesValidation();
+$options['EventTarget'] = $this->getUniqueID();
+$options['EventParameter'] = $this->_currentRenderItemIndex;
+$options['ID'] = $this->getClientID().$this->_currentRenderItemIndex;
+return $options;
+} +protected function canCauseValidation()
+{
+$group = $this->getValidationGroup();
+$hasValidators = $this->getPage()->getValidators($group)->getCount()>0;
+return $this->getCausesValidation() && $hasValidators;
+} +public function setAutoPostBack($value)
+{
+throw new TNotSupportedException('bulletedlist_autopostback_unsupported');
+} +public function setSelectedIndex($index)
+{
+throw new TNotSupportedException('bulletedlist_selectedindex_unsupported');
+} +public function setSelectedIndices($indices)
+{
+throw new TNotSupportedException('bulletedlist_selectedindices_unsupported');
+} +public function setSelectedValue($value)
+{
+throw new TNotSupportedException('bulletedlist_selectedvalue_unsupported');
+}
+} +class TBulletedListEventParameter extends TEventParameter
{ private $_index; -public function __construct($index) - { - $this->_index=$index; - } -public function getIndex() - { - return $this->_index; - } -} -?><?php +public function __construct($index)
+{
+$this->_index=$index;
+} +public function getIndex()
+{
+return $this->_index;
+}
+}
- -abstract class TListControl extends TDataBoundControl +abstract class TListControl extends TDataBoundControl
{ private $_items=null; private $_loadedFromState=false; -protected function getTagName() - { - return 'select'; - } -protected function addAttributesToRender($writer) - { - $page=$this->getPage(); - $page->ensureRenderInForm($this); - if($this->getIsMultiSelect()) - $writer->addAttribute('multiple','multiple'); - if($this->getAutoPostBack() && $page->getClientSupportsJavaScript()) - { - $writer->addAttribute('id',$this->getClientID()); - $this->getPage()->getClientScript()->registerPostBackControl($this); -} - if($this->getEnabled(true) && !$this->getEnabled()) - $writer->addAttribute('disabled','disabled'); - parent::addAttributesToRender($writer); - } -public function getPostBackOptions() - { -$options['CausesValidation'] = $this->getCausesValidation(); - $options['ValidationGroup'] = $this->getValidationGroup(); - $options['EventTarget'] = $this->getUniqueID(); - return $options; - } -public function addParsedObject($object) - { - if(!$this->_loadedFromState && ($object instanceof TListItem)) - $this->getItems()->add($object); - } -protected function performDataBinding($data) - { - $items=$this->getItems(); - if(!$this->getAppendDataBoundItems()) - $items->clear(); - $textField=$this->getDataTextField(); - if($textField==='') - $textField=0; - $valueField=$this->getDataValueField(); - if($valueField==='') - $valueField=1; - $textFormat=$this->getDataTextFormatString(); - foreach($data as $key=>$object) - { - $item=new TListItem; - if(!is_string($object) && isset($object[$textField])) - $text=$object[$textField]; - else - $text=TPropertyValue::ensureString($object); - $item->setText($textFormat===''?$text:sprintf($textFormat,$text)); - if(!is_string($object) && isset($object[$valueField])) - $item->setValue($object[$valueField]); - else if(!is_integer($key)) - $item->setValue($key); - $items->add($item); - } - } -protected function onSaveState($param) - { - if($this->_items) - $this->setViewState('Items',$this->_items->saveState(),null); - else - $this->clearViewState('Items'); - } -protected function onLoadState($param) - { - $this->_loadedFromState=true; - if(!$this->getIsDataBound()) - { - $this->_items=new TListItemCollection; - $this->_items->loadState($this->getViewState('Items',null)); - } - $this->clearViewState('Items'); - } -protected function getIsMultiSelect() - { - return false; - } -public function getAppendDataBoundItems() - { - return $this->getViewState('AppendDataBoundItems',false); - } -public function setAppendDataBoundItems($value) - { - $this->setViewState('AppendDataBoundItems',TPropertyValue::ensureBoolean($value),false); - } -public function getAutoPostBack() - { - return $this->getViewState('AutoPostBack',false); - } -public function setAutoPostBack($value) - { - $this->setViewState('AutoPostBack',TPropertyValue::ensureBoolean($value),false); - } -public function getCausesValidation() - { - return $this->getViewState('CausesValidation',true); - } -public function setCausesValidation($value) - { - $this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true); - } -public function getDataTextField() - { - return $this->getViewState('DataTextField',''); - } -public function setDataTextField($value) - { - $this->setViewState('DataTextField',$value,''); - } -public function getDataTextFormatString() - { - return $this->getViewState('DataTextFormatString',''); - } -public function setDataTextFormatString($value) - { - $this->setViewState('DataTextFormatString',$value,''); - } -public function getDataValueField() - { - return $this->getViewState('DataValueField',''); - } -public function setDataValueField($value) - { - $this->setViewState('DataValueField',$value,''); - } -public function getItemCount() - { - return $this->_items?$this->_items->getCount():0; - } -public function getHasItems() - { - return ($this->_items && $this->_items->getCount()>0); - } -public function getItems() - { - if(!$this->_items) - $this->_items=new TListItemCollection; - return $this->_items; - } -public function getSelectedIndex() - { - if($this->_items) - { - $n=$this->_items->getCount(); - for($i=0;$i<$n;++$i) - if($this->_items->itemAt($i)->getSelected()) - return $i; - } - return -1; - } -public function setSelectedIndex($index) - { - $index=TPropertyValue::ensureInteger($index); - if($this->_items) - { - $this->clearSelection(); - if($index>=0 && $index<$this->_items->getCount()) - $this->_items->itemAt($index)->setSelected(true); - } - } -public function getSelectedIndices() - { - $selections=array(); - if($this->_items) - { - $n=$this->_items->getCount(); - for($i=0;$i<$n;++$i) - if($this->_items->itemAt($i)->getSelected()) - $selections[]=$i; - } - return $selections; - } -public function setSelectedIndices($indices) - { - if($this->_items) - { - $this->clearSelection(); - $n=$this->_items->getCount(); - foreach($indices as $index) - { - if($index>=0 && $index<$n) - $this->_items->itemAt($index)->setSelected(true); - } - } - } -public function getSelectedItem() - { - if(($index=$this->getSelectedIndex())>=0) - return $this->_items->itemAt($index); - else - return null; - } -public function getSelectedValue() - { - $index=$this->getSelectedIndex(); - return $index>=0?$this->getItems()->itemAt($index)->getValue():''; - } -public function setSelectedValue($value) - { - if($this->_items) - { - if($value===null) - $this->clearSelection(); - else if(($item=$this->_items->findItemByValue($value))!==null) - { - $this->clearSelection(); - $item->setSelected(true); - } - } - } -public function getText() - { - return $this->getSelectedValue(); - } -public function setText($value) - { - $this->setSelectedValue($value); - } -public function clearSelection() - { - if($this->_items) - { - foreach($this->_items as $item) - $item->setSelected(false); - } - } -public function getValidationGroup() - { - return $this->getViewState('ValidationGroup',''); - } -public function setValidationGroup($value) - { - $this->setViewState('ValidationGroup',$value,''); - } -public function onSelectedIndexChanged($param) - { - $this->raiseEvent('OnSelectedIndexChanged',$this,$param); - } -public function onTextChanged($param) - { - $this->raiseEvent('OnTextChanged',$this,$param); - } -protected function renderContents($writer) - { - if($this->_items) - { - $writer->writeLine(); - foreach($this->_items as $item) - { - if($item->getEnabled()) - { - if($item->getSelected()) - $writer->addAttribute('selected','selected'); - $writer->addAttribute('value',$item->getValue()); - if($item->getHasAttributes()) - { - foreach($item->getAttributes() as $name=>$value) - $writer->addAttribute($name,$value); - } - $writer->renderBeginTag('option'); - $writer->write(THttpUtility::htmlEncode($item->getText())); - $writer->renderEndTag(); - $writer->writeLine(); - } - } - } - } -} -class TListItemCollection extends TList -{ -public function add($item) - { - if(is_string($item)) - parent::add(new TListItem($item)); - else if($item instanceof TListItem) - parent::add($item); - else - throw new TInvalidDataTypeException('listitemcollection_item_invalid'); - } -public function insert($index,$item) - { - if(is_string($item)) - parent::insert($index,new TListItem($item)); - else if($item instanceof TListItem) - parent::insert($index,$item); - else - throw new TInvalidDataTypeException('listitemcollection_item_invalid'); - } -public function findIndexByValue($value,$includeDisabled=true) - { - $value=TPropertyValue::ensureString($value); - $index=0; - foreach($this as $item) - { - if($item->getValue()===$value && ($includeDisabled || $item->getEnabled())) - return $index; - $index++; - } - return -1; - } -public function findIndexByText($text,$includeDisabled=true) - { - $text=TPropertyValue::ensureString($text); - $index=0; - foreach($this as $item) - { - if($item->getText()===$text && ($includeDisabled || $item->getEnabled())) - return $index; - $index++; - } - return -1; - } -public function findItemByValue($value,$includeDisabled=true) - { - if(($index=$this->findIndexByValue($value,$includeDisabled))>=0) - return $this->itemAt($index); - else - return null; - } -public function findItemByText($text,$includeDisabled=true) - { - if(($index=$this->findIndexByText($text,$includeDisabled))>=0) - return $this->itemAt($index); - else - return null; - } -public function loadState($state) - { - $this->clear(); - if($state!==null) - { - foreach($state as $item) - $this->add(new TListItem($item[0],$item[1],$item[2],$item[3])); - } - } -public function saveState() - { - if($this->getCount()>0) - { - $state=array(); - foreach($this as $item) - $state[]=array($item->getText(),$item->getValue(),$item->getEnabled(),$item->getSelected()); - return $state; - } - else - return null; - } -} -class TListItem extends TComponent +protected function getTagName()
+{
+return 'select';
+} +protected function addAttributesToRender($writer)
+{
+$page=$this->getPage();
+$page->ensureRenderInForm($this);
+if($this->getIsMultiSelect())
+$writer->addAttribute('multiple','multiple');
+if($this->getEnabled(true) && $this->getAutoPostBack() && $page->getClientSupportsJavaScript())
+{
+$writer->addAttribute('id',$this->getClientID());
+$this->getPage()->getClientScript()->registerPostBackControl($this);
+}
+if($this->getEnabled(true) && !$this->getEnabled())
+$writer->addAttribute('disabled','disabled');
+parent::addAttributesToRender($writer);
+} +public function getPostBackOptions()
+{
+$options['CausesValidation'] = $this->getCausesValidation();
+$options['ValidationGroup'] = $this->getValidationGroup();
+$options['EventTarget'] = $this->getUniqueID();
+return $options;
+} +public function addParsedObject($object)
+{
+if(!$this->_loadedFromState && ($object instanceof TListItem))
+$this->getItems()->add($object);
+} +protected function performDataBinding($data)
+{
+$items=$this->getItems();
+if(!$this->getAppendDataBoundItems())
+$items->clear();
+$textField=$this->getDataTextField();
+if($textField==='')
+$textField=0;
+$valueField=$this->getDataValueField();
+if($valueField==='')
+$valueField=1;
+$textFormat=$this->getDataTextFormatString();
+foreach($data as $key=>$object)
+{
+$item=new TListItem;
+if(!is_string($object) && isset($object[$textField]))
+$text=$object[$textField];
+else
+$text=TPropertyValue::ensureString($object);
+$item->setText($textFormat===''?$text:sprintf($textFormat,$text));
+if(!is_string($object) && isset($object[$valueField]))
+$item->setValue($object[$valueField]);
+else if(!is_integer($key))
+$item->setValue($key);
+$items->add($item);
+}
+} +public function saveState()
+{
+parent::saveState();
+if($this->_items)
+$this->setViewState('Items',$this->_items->saveState(),null);
+else
+$this->clearViewState('Items');
+} +public function loadState()
+{
+parent::loadState();
+$this->_loadedFromState=true;
+if(!$this->getIsDataBound())
+{
+$this->_items=new TListItemCollection;
+$this->_items->loadState($this->getViewState('Items',null));
+}
+$this->clearViewState('Items');
+} +protected function getIsMultiSelect()
+{
+return false;
+} +public function getAppendDataBoundItems()
+{
+return $this->getViewState('AppendDataBoundItems',false);
+} +public function setAppendDataBoundItems($value)
+{
+$this->setViewState('AppendDataBoundItems',TPropertyValue::ensureBoolean($value),false);
+} +public function getAutoPostBack()
+{
+return $this->getViewState('AutoPostBack',false);
+} +public function setAutoPostBack($value)
+{
+$this->setViewState('AutoPostBack',TPropertyValue::ensureBoolean($value),false);
+} +public function getCausesValidation()
+{
+return $this->getViewState('CausesValidation',true);
+} +public function setCausesValidation($value)
+{
+$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);
+} +public function getDataTextField()
+{
+return $this->getViewState('DataTextField','');
+} +public function setDataTextField($value)
+{
+$this->setViewState('DataTextField',$value,'');
+} +public function getDataTextFormatString()
+{
+return $this->getViewState('DataTextFormatString','');
+} +public function setDataTextFormatString($value)
+{
+$this->setViewState('DataTextFormatString',$value,'');
+} +public function getDataValueField()
+{
+return $this->getViewState('DataValueField','');
+} +public function setDataValueField($value)
+{
+$this->setViewState('DataValueField',$value,'');
+} +public function getItemCount()
+{
+return $this->_items?$this->_items->getCount():0;
+} +public function getHasItems()
+{
+return ($this->_items && $this->_items->getCount()>0);
+} +public function getItems()
+{
+if(!$this->_items)
+$this->_items=new TListItemCollection;
+return $this->_items;
+} +public function getSelectedIndex()
+{
+if($this->_items)
+{
+$n=$this->_items->getCount();
+for($i=0;$i<$n;++$i)
+if($this->_items->itemAt($i)->getSelected())
+return $i;
+}
+return -1;
+} +public function setSelectedIndex($index)
+{
+$index=TPropertyValue::ensureInteger($index);
+if($this->_items)
+{
+$this->clearSelection();
+if($index>=0 && $index<$this->_items->getCount())
+$this->_items->itemAt($index)->setSelected(true);
+}
+} +public function getSelectedIndices()
+{
+$selections=array();
+if($this->_items)
+{
+$n=$this->_items->getCount();
+for($i=0;$i<$n;++$i)
+if($this->_items->itemAt($i)->getSelected())
+$selections[]=$i;
+}
+return $selections;
+} +public function setSelectedIndices($indices)
+{
+if($this->_items)
+{
+$this->clearSelection();
+$n=$this->_items->getCount();
+foreach($indices as $index)
+{
+if($index>=0 && $index<$n)
+$this->_items->itemAt($index)->setSelected(true);
+}
+}
+} +public function getSelectedItem()
+{
+if(($index=$this->getSelectedIndex())>=0)
+return $this->_items->itemAt($index);
+else
+return null;
+} +public function getSelectedValue()
+{
+$index=$this->getSelectedIndex();
+return $index>=0?$this->getItems()->itemAt($index)->getValue():'';
+} +public function setSelectedValue($value)
+{
+if($this->_items)
+{
+if($value===null)
+$this->clearSelection();
+else if(($item=$this->_items->findItemByValue($value))!==null)
+{
+$this->clearSelection();
+$item->setSelected(true);
+}
+}
+} +public function getText()
+{
+return $this->getSelectedValue();
+} +public function setText($value)
+{
+$this->setSelectedValue($value);
+} +public function clearSelection()
+{
+if($this->_items)
+{
+foreach($this->_items as $item)
+$item->setSelected(false);
+}
+} +public function getValidationGroup()
+{
+return $this->getViewState('ValidationGroup','');
+} +public function setValidationGroup($value)
+{
+$this->setViewState('ValidationGroup',$value,'');
+} +public function onSelectedIndexChanged($param)
+{
+$this->raiseEvent('OnSelectedIndexChanged',$this,$param);
+} +public function onTextChanged($param)
+{
+$this->raiseEvent('OnTextChanged',$this,$param);
+} +protected function renderContents($writer)
+{
+if($this->_items)
+{
+$writer->writeLine();
+foreach($this->_items as $item)
+{
+if($item->getEnabled())
+{
+if($item->getSelected())
+$writer->addAttribute('selected','selected');
+$writer->addAttribute('value',$item->getValue());
+if($item->getHasAttributes())
+{
+foreach($item->getAttributes() as $name=>$value)
+$writer->addAttribute($name,$value);
+}
+$writer->renderBeginTag('option');
+$writer->write(THttpUtility::htmlEncode($item->getText()));
+$writer->renderEndTag();
+$writer->writeLine();
+}
+}
+}
+}
+} +class TListItemCollection extends TList
+{ +public function insertAt($index,$item)
+{
+if(is_string($item))
+parent::insertAt($index,new TListItem($item));
+else if($item instanceof TListItem)
+parent::insertAt($index,$item);
+else
+throw new TInvalidDataTypeException('listitemcollection_item_invalid');
+} +public function findIndexByValue($value,$includeDisabled=true)
+{
+$value=TPropertyValue::ensureString($value);
+$index=0;
+foreach($this as $item)
+{
+if($item->getValue()===$value && ($includeDisabled || $item->getEnabled()))
+return $index;
+$index++;
+}
+return -1;
+} +public function findIndexByText($text,$includeDisabled=true)
+{
+$text=TPropertyValue::ensureString($text);
+$index=0;
+foreach($this as $item)
+{
+if($item->getText()===$text && ($includeDisabled || $item->getEnabled()))
+return $index;
+$index++;
+}
+return -1;
+} +public function findItemByValue($value,$includeDisabled=true)
+{
+if(($index=$this->findIndexByValue($value,$includeDisabled))>=0)
+return $this->itemAt($index);
+else
+return null;
+} +public function findItemByText($text,$includeDisabled=true)
+{
+if(($index=$this->findIndexByText($text,$includeDisabled))>=0)
+return $this->itemAt($index);
+else
+return null;
+} +public function loadState($state)
+{
+$this->clear();
+if($state!==null)
+{
+foreach($state as $item)
+$this->add(new TListItem($item[0],$item[1],$item[2],$item[3]));
+}
+} +public function saveState()
+{
+if($this->getCount()>0)
+{
+$state=array();
+foreach($this as $item)
+$state[]=array($item->getText(),$item->getValue(),$item->getEnabled(),$item->getSelected());
+return $state;
+}
+else
+return null;
+}
+} +class TListItem extends TComponent
{ private $_attributes=null; private $_text; private $_value; private $_enabled; private $_selected; -public function __construct($text='',$value='',$enabled=true,$selected=false) - { - $this->setText($text); - $this->setValue($value); - $this->setEnabled($enabled); - $this->setSelected($selected); - } -public function getEnabled() - { - return $this->_enabled; - } -public function setEnabled($value) - { - $this->_enabled=TPropertyValue::ensureBoolean($value); - } -public function getSelected() - { - return $this->_selected; - } -public function setSelected($value) - { - $this->_selected=TPropertyValue::ensureBoolean($value); - } -public function getText() - { - return $this->_text===''?$this->_value:$this->_text; - } -public function setText($value) - { - $this->_text=TPropertyValue::ensureString($value); - } -public function getValue() - { - return $this->_value===''?$this->_text:$this->_value; - } -public function setValue($value) - { - $this->_value=TPropertyValue::ensureString($value); - } -public function getAttributes() - { - if(!$this->_attributes) - $this->_attributes=new TAttributeCollection; - return $this->_attributes; - } -public function getHasAttributes() - { - return $this->_attributes && $this->_attributes->getCount()>0; - } -public function hasAttribute($name) - { - return $this->_attributes?$this->_attributes->contains($name):false; - } -public function getAttribute($name) - { - return $this->_attributes?$this->_attributes->itemAt($name):null; - } -public function setAttribute($name,$value) - { - $this->getAttributes()->add($name,$value); - } -public function removeAttribute($name) - { - return $this->_attributes?$this->_attributes->remove($name):null; - } -} -?><?php +public function __construct($text='',$value='',$enabled=true,$selected=false)
+{
+$this->setText($text);
+$this->setValue($value);
+$this->setEnabled($enabled);
+$this->setSelected($selected);
+} +public function getEnabled()
+{
+return $this->_enabled;
+} +public function setEnabled($value)
+{
+$this->_enabled=TPropertyValue::ensureBoolean($value);
+} +public function getSelected()
+{
+return $this->_selected;
+} +public function setSelected($value)
+{
+$this->_selected=TPropertyValue::ensureBoolean($value);
+} +public function getText()
+{
+return $this->_text===''?$this->_value:$this->_text;
+} +public function setText($value)
+{
+$this->_text=TPropertyValue::ensureString($value);
+} +public function getValue()
+{
+return $this->_value===''?$this->_text:$this->_value;
+} +public function setValue($value)
+{
+$this->_value=TPropertyValue::ensureString($value);
+} +public function getAttributes()
+{
+if(!$this->_attributes)
+$this->_attributes=new TAttributeCollection;
+return $this->_attributes;
+} +public function getHasAttributes()
+{
+return $this->_attributes && $this->_attributes->getCount()>0;
+} +public function hasAttribute($name)
+{
+return $this->_attributes?$this->_attributes->contains($name):false;
+} +public function getAttribute($name)
+{
+return $this->_attributes?$this->_attributes->itemAt($name):null;
+} +public function setAttribute($name,$value)
+{
+$this->getAttributes()->add($name,$value);
+} +public function removeAttribute($name)
+{
+return $this->_attributes?$this->_attributes->remove($name):null;
+}
+} + +class TListBox extends TListControl implements IPostBackDataHandler, IValidatable
+{ +protected function addAttributesToRender($writer)
+{
+$rows=$this->getRows();
+$writer->addAttribute('size',"$rows");
+if($this->getSelectionMode()==='Multiple')
+$writer->addAttribute('name',$this->getUniqueID().'[]');
+else
+$writer->addAttribute('name',$this->getUniqueID());
+parent::addAttributesToRender($writer);
+} +public function onPreRender($param)
+{
+parent::onPreRender($param);
+if($this->getEnabled(true))
+$this->getPage()->registerRequiresPostData($this);
+} +public function loadPostData($key,$values)
+{
+if(!$this->getEnabled(true))
+return false;
+$this->ensureDataBound();
+$selections=isset($values[$key])?$values[$key]:null;
+if($selections!==null)
+{
+$items=$this->getItems();
+if($this->getSelectionMode()==='Single')
+{
+$selection=is_array($selections)?$selections[0]:$selections;
+$index=$items->findIndexByValue($selection,false);
+if($this->getSelectedIndex()!==$index)
+{
+$this->setSelectedIndex($index);
+return true;
+}
+else
+return false;
+}
+if(!is_array($selections))
+$selections=array($selections);
+$list=array();
+foreach($selections as $selection)
+$list[]=$items->findIndexByValue($selection,false);
+$list2=$this->getSelectedIndices();
+$n=count($list);
+$flag=false;
+if($n===count($list2))
+{
+sort($list,SORT_NUMERIC);
+for($i=0;$i<$n;++$i)
+{
+if($list[$i]!==$list2[$i])
+{
+$flag=true;
+break;
+}
+}
+}
+else
+$flag=true;
+if($flag)
+$this->setSelectedIndices($list);
+return $flag;
+}
+else if($this->getSelectedIndex()!==-1)
+{
+$this->clearSelection();
+return true;
+}
+else
+return false;
+} +public function raisePostDataChangedEvent()
+{
+if($this->getAutoPostBack() && $this->getCausesValidation())
+$this->getPage()->validate($this->getValidationGroup());
+$this->onSelectedIndexChanged(null);
+} +protected function getIsMultiSelect()
+{
+return $this->getSelectionMode()==='Multiple';
+} +public function getRows()
+{
+return $this->getViewState('Rows', 4);
+} +public function setRows($value)
+{
+$value=TPropertyValue::ensureInteger($value);
+if($value<=0)
+$value=4;
+$this->setViewState('Rows', $value, 4);
+} +public function getSelectionMode()
+{
+return $this->getViewState('SelectionMode', 'Single');
+} +public function setSelectionMode($value)
+{
+$this->setViewState('SelectionMode',TPropertyValue::ensureEnum($value,array('Single','Multiple')),'Single');
+} +public function getValidationPropertyValue()
+{
+return $this->getSelectedValue();
+}
+}
-class TListBox extends TListControl implements IPostBackDataHandler -{ -protected function addAttributesToRender($writer) - { - $rows=$this->getRows(); - $writer->addAttribute('size',"$rows"); - if($this->getSelectionMode()==='Multiple') - $writer->addAttribute('name',$this->getUniqueID().'[]'); - else - $writer->addAttribute('name',$this->getUniqueID()); - parent::addAttributesToRender($writer); - } -protected function onPreRender($param) - { - parent::onPreRender($param); - if($this->getEnabled(true)) - $this->getPage()->registerRequiresPostData($this); - } -public function loadPostData($key,$values) - { - if(!$this->getEnabled(true)) - return false; - $this->ensureDataBound(); - $selections=isset($values[$key])?$values[$key]:null; - if($selections!==null) - { - $items=$this->getItems(); - if($this->getSelectionMode()==='Single') - { - $selection=is_array($selections)?$selections[0]:$selections; - $index=$items->findIndexByValue($selection,false); - if($this->getSelectedIndex()!==$index) - { - $this->setSelectedIndex($index); - return true; - } - else - return false; - } - if(!is_array($selections)) - $selections=array($selections); - $list=array(); - foreach($selections as $selection) - $list[]=$items->findIndexByValue($selection,false); - $list2=$this->getSelectedIndices(); - $n=count($list); - $flag=false; - if($n===count($list2)) - { - sort($list,SORT_NUMERIC); - for($i=0;$i<$n;++$i) - { - if($list[$i]!==$list2[$i]) - { - $flag=true; - break; - } - } - } - else - $flag=true; - if($flag) - $this->setSelectedIndices($list); - return $flag; - } - else if($this->getSelectedIndex()!==-1) - { - $this->clearSelection(); - return true; - } - else - return false; - } -public function raisePostDataChangedEvent() - { - $page=$this->getPage(); - if($this->getAutoPostBack() && !$page->getPostBackEventTarget()) - { - $page->setPostBackEventTarget($this); - if($this->getCausesValidation()) - $page->validate($this->getValidationGroup()); - } - $this->onSelectedIndexChanged(null); - } -protected function getIsMultiSelect() - { - return $this->getSelectionMode()==='Multiple'; - } -public function getRows() - { - return $this->getViewState('Rows', 4); - } -public function setRows($value) - { - $value=TPropertyValue::ensureInteger($value); - if($value<=0) - $value=4; - $this->setViewState('Rows', $value, 4); - } -public function getSelectionMode() - { - return $this->getViewState('SelectionMode', 'Single'); - } -public function setSelectionMode($value) - { - $this->setViewState('SelectionMode',TPropertyValue::ensureEnum($value,array('Single','Multiple')),'Single'); - } -} -?><?php +class TDropDownList extends TListControl implements IPostBackDataHandler, IValidatable
+{ +protected function addAttributesToRender($writer)
+{
+$writer->addAttribute('name',$this->getUniqueID());
+parent::addAttributesToRender($writer);
+} +public function loadPostData($key,$values)
+{
+if(!$this->getEnabled(true))
+return false;
+$this->ensureDataBound();
+$selection=isset($values[$key])?$values[$key]:null;
+if($selection!==null)
+{
+$index=$this->getItems()->findIndexByValue($selection,false);
+if($this->getSelectedIndex()!==$index)
+{
+$this->setSelectedIndex($index);
+return true;
+}
+}
+return false;
+} +public function raisePostDataChangedEvent()
+{
+if($this->getAutoPostBack() && $this->getCausesValidation())
+$this->getPage()->validate($this->getValidationGroup());
+$this->onSelectedIndexChanged(null);
+} +public function getSelectedIndex()
+{
+$index=parent::getSelectedIndex();
+if($index<0 && $this->getHasItems())
+{
+$this->setSelectedIndex(0);
+return 0;
+}
+else
+return $index;
+} +public function setSelectedIndices($indices)
+{
+throw new TNotSupportedException('dropdownlist_selectedindices_unsupported');
+} +public function getValidationPropertyValue()
+{
+return $this->getSelectedValue();
+}
+}
+ +class TJavascriptLogger extends TWebControl
+{ +protected function getTagName()
+{
+return 'div';
+} +protected function renderContents($writer)
+{
+$this->Page->ClientScript->registerClientScript('logger');
+$info = '(<a href="http://gleepglop.com/javascripts/logger/" target="_blank">more info</a>).';
+$usage = 'Press ALT-D (Or CTRL-D on OS X) to toggle the javascript log console';
+$writer->write("{$usage} {$info}");
+parent::renderContents($writer);
+}
+} -class TDropDownList extends TListControl implements IPostBackDataHandler -{ -protected function addAttributesToRender($writer) - { - $writer->addAttribute('name',$this->getUniqueID()); - parent::addAttributesToRender($writer); - } -public function loadPostData($key,$values) - { - if(!$this->getEnabled(true)) - return false; - $this->ensureDataBound(); - $selection=isset($values[$key])?$values[$key]:null; - if($selection!==null) - { - $index=$this->getItems()->findIndexByValue($selection,false); - if($this->getSelectedIndex()!==$index) - { - $this->setSelectedIndex($index); - return true; - } - } - return false; - } -public function raisePostDataChangedEvent() - { - $page=$this->getPage(); - if($this->getAutoPostBack() && !$page->getPostBackEventTarget()) - { - $page->setPostBackEventTarget($this); - if($this->getCausesValidation()) - $page->validate($this->getValidationGroup()); - } - $this->onSelectedIndexChanged(null); - } -public function getSelectedIndex() - { - $index=parent::getSelectedIndex(); - if($index<0 && $this->getHasItems()) - { - $this->setSelectedIndex(0); - return 0; - } - else - return $index; - } -public function setSelectedIndices($indices) - { - throw new TNotSupportedException('dropdownlist_selectedindices_unsupported'); - } -} -?><?php -class TJavascriptLogger extends TWebControl -{ -protected function getTagName() - { - return 'div'; - } -protected function renderContents($writer) - { - $this->Page->ClientScript->registerClientScript('logger'); - $info = '(<a href="http://gleepglop.com/javascripts/logger/" target="_blank">more info</a>).'; - $usage = 'Press ALT-D (Or CTRL-D on OS X) to toggle the javascript log console'; - $writer->write("{$usage} {$info}"); - parent::renderContents($writer); - } -} -?><?php -class TLinkButton extends TWebControl implements IPostBackEventHandler -{ -protected function getTagName() - { - return 'a'; - } -protected function addAttributesToRender($writer) - { - $page=$this->getPage(); - $page->ensureRenderInForm($this); +class TLinkButton extends TWebControl implements IPostBackEventHandler
+{ +protected function getTagName()
+{
+return 'a';
+} +protected function addAttributesToRender($writer)
+{
+$page=$this->getPage();
+$page->ensureRenderInForm($this); $writer->addAttribute('id',$this->getClientID()); parent::addAttributesToRender($writer); -if($this->getEnabled(true)) - { - $nop = "#".$this->getClientID(); - $writer->addAttribute('href', $nop); - $this->getPage()->getClientScript()->registerPostBackControl($this); - } - else if($this->getEnabled()) $writer->addAttribute('disabled','disabled'); - } -public function getPostBackOptions() - { - $options['EventTarget'] = $this->getUniqueID(); - $options['CausesValidation'] = $this->getCausesValidation(); - $options['ValidationGroup'] = $this->getValidationGroup(); - $options['StopEvent'] = true; -return $options; - } -protected function renderContents($writer) - { - if(($text=$this->getText())==='') - parent::renderContents($writer); - else - $writer->write($text); - } -public function getText() - { - return $this->getViewState('Text',''); - } -public function setText($value) - { - $this->setViewState('Text',$value,''); - } -public function getCommandName() - { - return $this->getViewState('CommandName',''); - } -public function setCommandName($value) - { - $this->setViewState('CommandName',$value,''); - } -public function getCommandParameter() - { - return $this->getViewState('CommandParameter',''); - } -public function setCommandParameter($value) - { - $this->setViewState('CommandParameter',$value,''); - } -public function getCausesValidation() - { - return $this->getViewState('CausesValidation',true); - } -public function setCausesValidation($value) - { - $this->setViewState('CausesValidation',$value,true); - } -public function getValidationGroup() - { - return $this->getViewState('ValidationGroup',''); - } -public function setValidationGroup($value) - { - $this->setViewState('ValidationGroup',$value,''); - } -public function raisePostBackEvent($param) - { - if($this->getCausesValidation()) - $this->getPage()->validate($this->getValidationGroup()); - $this->onClick(null); - $this->onCommand(new TCommandEventParameter($this->getCommandName(),$this->getCommandParameter())); - } -public function onClick($param) - { - $this->raiseEvent('OnClick',$this,$param); - } -public function onCommand($param) - { - $this->raiseEvent('OnCommand',$this,$param); - $this->raiseBubbleEvent($this,$param); - } -} -?><?php +if($this->getEnabled(true))
+{
+$nop = "#".$this->getClientID();
+$writer->addAttribute('href', $nop);
+$this->getPage()->getClientScript()->registerPostBackControl($this);
+}
+else if($this->getEnabled()) $writer->addAttribute('disabled','disabled');
+} +public function getPostBackOptions()
+{
+$options['EventTarget'] = $this->getUniqueID();
+$options['CausesValidation'] = $this->getCausesValidation();
+$options['ValidationGroup'] = $this->getValidationGroup();
+$options['StopEvent'] = true; +return $options;
+} +protected function renderContents($writer)
+{
+if(($text=$this->getText())==='')
+parent::renderContents($writer);
+else
+$writer->write($text);
+} +public function getText()
+{
+return $this->getViewState('Text','');
+} +public function setText($value)
+{
+$this->setViewState('Text',$value,'');
+} +public function getCommandName()
+{
+return $this->getViewState('CommandName','');
+} +public function setCommandName($value)
+{
+$this->setViewState('CommandName',$value,'');
+} +public function getCommandParameter()
+{
+return $this->getViewState('CommandParameter','');
+} +public function setCommandParameter($value)
+{
+$this->setViewState('CommandParameter',$value,'');
+} +public function getCausesValidation()
+{
+return $this->getViewState('CausesValidation',true);
+} +public function setCausesValidation($value)
+{
+$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);
+} +public function getValidationGroup()
+{
+return $this->getViewState('ValidationGroup','');
+} +public function setValidationGroup($value)
+{
+$this->setViewState('ValidationGroup',$value,'');
+} +public function raisePostBackEvent($param)
+{
+if($this->getCausesValidation())
+$this->getPage()->validate($this->getValidationGroup());
+$this->onClick(null);
+$this->onCommand(new TCommandEventParameter($this->getCommandName(),$this->getCommandParameter()));
+} +public function onClick($param)
+{
+$this->raiseEvent('OnClick',$this,$param);
+} +public function onCommand($param)
+{
+$this->raiseEvent('OnCommand',$this,$param);
+$this->raiseBubbleEvent($this,$param);
+}
+} + abstract class TBaseValidator extends TLabel implements IValidator { private $_isValid=true; private $_registered=false; public function __construct() - { - parent::__construct(); - $this->setForeColor('red'); - } -protected function onInit($param) - { - parent::onInit($param); - $this->getPage()->getValidators()->add($this); - $this->_registered=true; - } -protected function onUnload($param) - { - if($this->_registered && ($page=$this->getPage())!==null) - $page->getValidators()->remove($this); - $this->_registered=false; - parent::onUnload($param); - } +{ +parent::__construct(); +$this->setForeColor('red'); +} +public function onInit($param) +{ +parent::onInit($param); +$this->getPage()->getValidators()->add($this); +$this->_registered=true; +} +public function onUnload($param) +{ +if($this->_registered && ($page=$this->getPage())!==null) +$page->getValidators()->remove($this); +$this->_registered=false; +parent::onUnload($param); +} protected function addAttributesToRender($writer) - { - $display=$this->getDisplay(); - $visible=$this->getEnabled(true) && !$this->getIsValid(); - if($display==='None' || (!$visible && $display==='Dynamic')) - $writer->addStyleAttribute('display','none'); - else if(!$visible) - $writer->addStyleAttribute('visibility','hidden'); - $writer->addAttribute('id',$this->getClientID()); - parent::addAttributesToRender($writer); - } +{ +$display=$this->getDisplay(); +$visible=$this->getEnabled(true) && !$this->getIsValid(); +if($display==='None' || (!$visible && $display==='Dynamic')) +$writer->addStyleAttribute('display','none'); +else if(!$visible) +$writer->addStyleAttribute('visibility','hidden'); +$writer->addAttribute('id',$this->getClientID()); +parent::addAttributesToRender($writer); +} protected function getClientScriptOptions() - { - $options['id'] = $this->getClientID(); - $options['display'] = $this->getDisplay(); - $options['errormessage'] = $this->getErrorMessage(); - $options['focusonerror'] = $this->getFocusOnError(); - $options['focuselementid'] = $this->getFocusElementID(); - $options['validationgroup'] = $this->getValidationGroup(); - $options['controltovalidate'] = $this->getValidationTarget()->getClientID(); - return $options; - } -protected function onPreRender($param) - { - $scripts = $this->getPage()->getClientScript(); - $formID=$this->getPage()->getForm()->getClientID(); - $scriptKey = "TBaseValidator:$formID"; - if($this->getEnableClientScript() && !$scripts->isEndScriptRegistered($scriptKey)) - { - $scripts->registerClientScript('validator'); - $scripts->registerEndScript($scriptKey, "Prado.Validation.AddForm('$formID');"); - } - if($this->getEnableClientScript()) - $this->registerClientScriptValidator(); - parent::onPreRender($param); - } +{ +$options['id'] = $this->getClientID(); +$options['display'] = $this->getDisplay(); +$options['errormessage'] = $this->getErrorMessage(); +$options['focusonerror'] = $this->getFocusOnError(); +$options['focuselementid'] = $this->getFocusElementID(); +$options['validationgroup'] = $this->getValidationGroup(); +$options['controltovalidate'] = $this->getValidationTarget()->getClientID(); +return $options; +} +public function onPreRender($param) +{ +$scripts = $this->getPage()->getClientScript(); +$formID=$this->getPage()->getForm()->getClientID(); +$scriptKey = "TBaseValidator:$formID"; +if($this->getEnableClientScript() && !$scripts->isEndScriptRegistered($scriptKey)) +{ +$scripts->registerClientScript('validator'); +$scripts->registerEndScript($scriptKey, "Prado.Validation.AddForm('$formID');"); +} +if($this->getEnableClientScript()) +$this->registerClientScriptValidator(); +parent::onPreRender($param); +} protected function registerClientScriptValidator() - { - if($this->getEnabled(true)) - { - $class = get_class($this); - $scriptKey = "prado:".$this->getClientID(); - $scripts = $this->getPage()->getClientScript(); - $serializer = new TJavascriptSerializer($this->getClientScriptOptions()); - $options = $serializer->toJavascript(); - $js = "new Prado.Validation(Prado.Validation.{$class}, {$options});"; - $scripts->registerEndScript($scriptKey, $js); - } - } -public function setAssociatedControlID($value) - { - throw new TNotSupportedException('basevalidator_associatedcontrolid_unsupported',get_class($this)); - } +{ +if($this->getEnabled(true)) +{ +$class = get_class($this); +$scriptKey = "prado:".$this->getClientID(); +$scripts = $this->getPage()->getClientScript(); +$serializer = new TJavascriptSerializer($this->getClientScriptOptions()); +$options = $serializer->toJavascript(); +$js = "new Prado.Validation(Prado.Validation.{$class}, {$options});"; +$scripts->registerEndScript($scriptKey, $js); +} +} +public function setForControl($value) +{ +throw new TNotSupportedException('basevalidator_forcontrol_unsupported',get_class($this)); +} public function setEnabled($value) - { - $value=TPropertyValue::ensureBoolean($value); - parent::setEnabled($value); - if(!$value) - $this->_isValid=true; - } +{ +$value=TPropertyValue::ensureBoolean($value); +parent::setEnabled($value); +if(!$value) +$this->_isValid=true; +} public function getDisplay() - { - return $this->getViewState('Display','Static'); - } +{ +return $this->getViewState('Display','Static'); +} public function setDisplay($value) - { - $this->setViewState('Display',TPropertyValue::ensureEnum($value,array('None','Static','Dynamic')),'Static'); - } +{ +$this->setViewState('Display',TPropertyValue::ensureEnum($value,array('None','Static','Dynamic')),'Static'); +} public function getEnableClientScript() - { - return $this->getViewState('EnableClientScript',true); - } +{ +return $this->getViewState('EnableClientScript',true); +} public function setEnableClientScript($value) - { - $this->setViewState('EnableClientScript',TPropertyValue::ensureBoolean($value),true); - } +{ +$this->setViewState('EnableClientScript',TPropertyValue::ensureBoolean($value),true); +} public function getErrorMessage() - { - return $this->getViewState('ErrorMessage',''); - } +{ +return $this->getViewState('ErrorMessage',''); +} public function setErrorMessage($value) - { - $this->setViewState('ErrorMessage',$value,''); - } +{ +$this->setViewState('ErrorMessage',$value,''); +} public function getControlToValidate() - { - return $this->getViewState('ControlToValidate',''); - } +{ +return $this->getViewState('ControlToValidate',''); +} public function setControlToValidate($value) - { - $this->setViewState('ControlToValidate',$value,''); - } +{ +$this->setViewState('ControlToValidate',$value,''); +} public function getFocusOnError() - { - return $this->getViewState('FocusOnError',false); - } +{ +return $this->getViewState('FocusOnError',false); +} public function setFocusOnError($value) - { - $this->setViewState('FocusOnError',TPropertyValue::ensureBoolean($value),false); - } +{ +$this->setViewState('FocusOnError',TPropertyValue::ensureBoolean($value),false); +} public function getFocusElementID() - { - if(($id=$this->getViewState('FocusElementID',''))==='') - $id=$this->getValidationTarget()->getClientID(); - return $id; - } +{ +if(($id=$this->getViewState('FocusElementID',''))==='') +$id=$this->getValidationTarget()->getClientID(); +return $id; +} public function setFocusElementID($value) - { - $this->setViewState('FocusElementID', $value, ''); - } +{ +$this->setViewState('FocusElementID', $value, ''); +} public function getValidationGroup() - { - return $this->getViewState('ValidationGroup',''); - } +{ +return $this->getViewState('ValidationGroup',''); +} public function setValidationGroup($value) - { - $this->setViewState('ValidationGroup',$value,''); - } +{ +$this->setViewState('ValidationGroup',$value,''); +} public function getIsValid() - { - return $this->_isValid; - } +{ +return $this->_isValid; +} public function setIsValid($value) - { - $this->_isValid=TPropertyValue::ensureBoolean($value); - } +{ +$this->_isValid=TPropertyValue::ensureBoolean($value); +} protected function getValidationTarget() - { - if(($id=$this->getControlToValidate())!=='' && ($control=$this->findControl($id))!==null) - return $control; - else - throw new TConfigurationException('basevalidator_controltovalidate_invalid'); - } +{ +if(($id=$this->getControlToValidate())!=='' && ($control=$this->findControl($id))!==null) +return $control; +else +throw new TConfigurationException('basevalidator_controltovalidate_invalid'); +} protected function getValidationValue($control) - { - if($control instanceof IValidatable) - { - $value=$control->getValidationPropertyValue(); - return TPropertyValue::ensureString($value); - } - else - throw new TInvalidDataTypeException('basevalidator_validatable_required'); - } +{ +if($control instanceof IValidatable) +return $control->getValidationPropertyValue(); +else +throw new TInvalidDataTypeException('basevalidator_validatable_required'); +} public function validate() - { - $this->setIsValid(true); - $control=$this->getValidationTarget(); - if($control && $this->getVisible(true) && $this->getEnabled()) - $this->setIsValid($this->evaluateIsValid()); - return $this->getIsValid(); - } +{ +$this->setIsValid(true); +$control=$this->getValidationTarget(); +if($control && $this->getVisible(true) && $this->getEnabled()) +$this->setIsValid($this->evaluateIsValid()); +return $this->getIsValid(); +} abstract protected function evaluateIsValid(); protected function renderContents($writer) - { - if(($text=$this->getText())!=='') - $writer->write($text); - else if(($text=$this->getErrorMessage())!=='') - $writer->write($text); - else - parent::renderContents($writer); - } -} -?><?php +{ +if(($text=$this->getText())!=='') +$writer->write($text); +else if(($text=$this->getErrorMessage())!=='') +$writer->write($text); +else +parent::renderContents($writer); +} +} -class TRequiredFieldValidator extends TBaseValidator -{ -public function getInitialValue() - { - return $this->getViewState('InitialValue',''); - } -public function setInitialValue($value) - { - $this->setViewState('InitialValue',TPropertyValue::ensureString($value),''); - } -protected function evaluateIsValid() - { - $value=$this->getValidationValue($this->getValidationTarget()); - return trim($value)!==trim($this->getInitialValue()); - } -protected function getClientScriptOptions() - { - $options = parent::getClientScriptOptions(); - $options['initialvalue']=$this->getInitialValue(); - return $options; - } -} -?><?php +class TRequiredFieldValidator extends TBaseValidator
+{ +public function getInitialValue()
+{
+return $this->getViewState('InitialValue','');
+} +public function setInitialValue($value)
+{
+$this->setViewState('InitialValue',TPropertyValue::ensureString($value),'');
+} +protected function evaluateIsValid()
+{
+$value=$this->getValidationValue($this->getValidationTarget());
+return trim($value)!==trim($this->getInitialValue()) || (is_bool($value) && $value);
+} +protected function getClientScriptOptions()
+{
+$options = parent::getClientScriptOptions();
+$options['initialvalue']=$this->getInitialValue();
+return $options;
+}
+} -class TCompareValidator extends TBaseValidator -{ -public function getValueType() - { - return $this->getViewState('ValueType','String'); - } -public function setValueType($value) - { - $this->setViewState('ValueType',TPropertyValue::ensureEnum($value,'Integer','Double','Date','Currency','String'),'String'); - } -public function getControlToCompare() - { - return $this->getViewState('ControlToCompare',''); - } -public function setControlToCompare($value) - { - $this->setViewState('ControlToCompare',$value,''); - } -public function getValueToCompare() - { - return $this->getViewState('ValueToCompare',''); - } -public function setValueToCompare($value) - { - $this->setViewState('ValueToCompare',$value,''); - } -public function getOperator() - { - return $this->getViewState('Operator','Equal'); - } -public function setOperator($value) - { - $this->setViewState('Operator',TPropertyValue::ensureEnum($value,'Equal','NotEqual','GreaterThan','GreaterThanEqual','LessThan','LessThanEqual','DataTypeCheck'),'Equal'); - } -public function setDateFormat($value) - { - $this->setViewState('DateFormat', $value, ''); - } -public function getDateFormat() - { - return $this->getViewState('DateFormat', ''); - } -public function evaluateIsValid() - { - if(($value=$this->getValidationValue($this->getValidationTarget()))==='') - return true; -if($this->getOperator()==='DataTypeCheck') - return $this->evaluateDataTypeCheck($value); -if(($controlToCompare=$this->getControlToCompare())!=='') - { - if(($control2=$this->findControl($controlToCompare))===null) - throw new TInvalidDataValueException('comparevalidator_controltocompare_invalid'); - if(($value2=$this->getValidationValue($control2))==='') - return false; - } - else - $value2=$this->getValueToCompare(); -$values = $this->getComparisonValues($value, $value2); - switch($this->getOperator()) - { - case 'Equal': - return $values[0] == $values[1]; - case 'NotEqual': - return $values[0] != $values[1]; - case 'GreaterThan': - return $values[0] > $values[1]; - case 'GreaterThanEqual': - return $values[0] >= $values[1]; - case 'LessThan': - return $values[0] < $values[1]; - case 'LessThanEqual': - return $values[0] <= $values[1]; - } -return false; - } -protected function evaluateDataTypeCheck($value) - { - switch($this->getValueType()) - { - case 'Integer': - return preg_match('/^[-+]?[0-9]+$/',trim($value)); - case 'Float': - case 'Double': - return preg_match('/^[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?$/',trim($value)); - case 'Currency': - return preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?$/',trim($value)); - case 'Date': - $dateFormat = $this->getDateFormat(); - if(strlen($dateFormat)) - return pradoParseDate($value, $dateFormat) !== null; - else - return strtotime($value) > 0; - } - return true; - } -protected function getComparisonValues($value1, $value2) - { - switch($this->getValueType()) - { - case 'Integer': - return array(intval($value1), intval($value2)); - case 'Float': - case 'Double': - return array(floatval($value1), floatval($value2)); - case 'Currency': - if(preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?/',$value1,$matches)) - $value1=floatval($matches[0]); - else - $value1=0; - if(preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?/',$value2,$matches)) - $value2=floatval($matches[0]); - else - $value2=0; - return array($value1, $value2); - case 'Date': - throw new TNotSupportedException('Date comparison for TCompareValidator is currently not supported. It will be supported in future.'); - $dateFormat = $this->getDateFormat(); - if (strlen($dateFormat)) - return array(pradoParseDate($value1, $dateFormat), pradoParseDate($value2, $dateFormat)); - else - return array(strtotime($value1), strtotime($value2)); - } - return array($value1, $value2); - } -protected function getClientScriptOptions() - { - $options = parent::getClientScriptOptions(); - if(($name=$this->getControlToCompare())!=='') - { - if(($control=$this->findControl($name))!==null) - $options['controltocompare']=$options['controlhookup']=$control->getClientID(); - } - if(($value=$this->getValueToCompare())!=='') - $options['valuetocompare']=$value; - if(($operator=$this->getOperator())!=='Equal') - $options['operator']=$operator; - $options['type']=$this->getValueType(); - if(($dateFormat=$this->getDateFormat())!=='') - $options['dateformat']=$dateFormat; - return $options; - } -} -?><?php +class TCompareValidator extends TBaseValidator
+{ +public function getValueType()
+{
+return $this->getViewState('ValueType','String');
+} +public function setValueType($value)
+{
+$this->setViewState('ValueType',TPropertyValue::ensureEnum($value,'Integer','Double','Date','Currency','String'),'String');
+} +public function getControlToCompare()
+{
+return $this->getViewState('ControlToCompare','');
+} +public function setControlToCompare($value)
+{
+$this->setViewState('ControlToCompare',$value,'');
+} +public function getValueToCompare()
+{
+return $this->getViewState('ValueToCompare','');
+} +public function setValueToCompare($value)
+{
+$this->setViewState('ValueToCompare',$value,'');
+} +public function getOperator()
+{
+return $this->getViewState('Operator','Equal');
+} +public function setOperator($value)
+{
+$this->setViewState('Operator',TPropertyValue::ensureEnum($value,'Equal','NotEqual','GreaterThan','GreaterThanEqual','LessThan','LessThanEqual'),'Equal');
+} +public function setDateFormat($value)
+{
+$this->setViewState('DateFormat', $value, '');
+} +public function getDateFormat()
+{
+return $this->getViewState('DateFormat', '');
+} +public function evaluateIsValid()
+{
+if(($value=$this->getValidationValue($this->getValidationTarget()))==='')
+return true; +if(($controlToCompare=$this->getControlToCompare())!=='')
+{
+if(($control2=$this->findControl($controlToCompare))===null)
+throw new TInvalidDataValueException('comparevalidator_controltocompare_invalid');
+if(($value2=$this->getValidationValue($control2))==='')
+return false;
+}
+else
+$value2=$this->getValueToCompare(); +$values = $this->getComparisonValues($value, $value2);
+switch($this->getOperator())
+{
+case 'Equal':
+return $values[0] == $values[1];
+case 'NotEqual':
+return $values[0] != $values[1];
+case 'GreaterThan':
+return $values[0] > $values[1];
+case 'GreaterThanEqual':
+return $values[0] >= $values[1];
+case 'LessThan':
+return $values[0] < $values[1];
+case 'LessThanEqual':
+return $values[0] <= $values[1];
+} +return false;
+} +protected function getComparisonValues($value1, $value2)
+{
+switch($this->getValueType())
+{
+case 'Integer':
+return array(intval($value1), intval($value2));
+case 'Float':
+case 'Double':
+return array(floatval($value1), floatval($value2));
+case 'Currency':
+if(preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?/',$value1,$matches))
+$value1=floatval($matches[0]);
+else
+$value1=0;
+if(preg_match('/[-+]?([0-9]*\.)?[0-9]+([eE][-+]?[0-9]+)?/',$value2,$matches))
+$value2=floatval($matches[0]);
+else
+$value2=0;
+return array($value1, $value2);
+case 'Date':
+throw new TNotSupportedException('Date comparison for TCompareValidator is currently not supported. It will be supported in future.');
+$dateFormat = $this->getDateFormat();
+if (strlen($dateFormat))
+return array(pradoParseDate($value1, $dateFormat), pradoParseDate($value2, $dateFormat));
+else
+return array(strtotime($value1), strtotime($value2));
+}
+return array($value1, $value2);
+} +protected function getClientScriptOptions()
+{
+$options = parent::getClientScriptOptions();
+if(($name=$this->getControlToCompare())!=='')
+{
+if(($control=$this->findControl($name))!==null)
+$options['controltocompare']=$options['controlhookup']=$control->getClientID();
+}
+if(($value=$this->getValueToCompare())!=='')
+$options['valuetocompare']=$value;
+if(($operator=$this->getOperator())!=='Equal')
+$options['operator']=$operator;
+$options['type']=$this->getValueType();
+if(($dateFormat=$this->getDateFormat())!=='')
+$options['dateformat']=$dateFormat;
+return $options;
+}
+} -class TRegularExpressionValidator extends TBaseValidator -{ -public function getRegularExpression() - { - return $this->getViewState('RegularExpression',''); - } -public function setRegularExpression($value) - { - $this->setViewState('RegularExpression',$value,''); - } -public function evaluateIsValid() - { - if(($value=$this->getValidationValue($this->getValidationTarget()))==='') - return true; - if(($expression=$this->getRegularExpression())!=='') - return preg_match("/^$expression\$/",$value); - else - return true; - } -protected function getClientScriptOptions() - { - $options = parent::getClientScriptOptions(); - $options['validationexpression']=$this->getRegularExpression(); - return $options; - } -} -?><?php +class TRegularExpressionValidator extends TBaseValidator
+{ +public function getRegularExpression()
+{
+return $this->getViewState('RegularExpression','');
+} +public function setRegularExpression($value)
+{
+$this->setViewState('RegularExpression',$value,'');
+} +public function evaluateIsValid()
+{
+if(($value=$this->getValidationValue($this->getValidationTarget()))==='')
+return true;
+if(($expression=$this->getRegularExpression())!=='')
+return preg_match("/^$expression\$/",$value);
+else
+return true;
+} +protected function getClientScriptOptions()
+{
+$options = parent::getClientScriptOptions();
+$options['validationexpression']=$this->getRegularExpression();
+return $options;
+}
+} -class TEmailAddressValidator extends TRegularExpressionValidator +class TEmailAddressValidator extends TRegularExpressionValidator
{ const EMAIL_REGEXP="\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"; -public function getRegularExpression() - { - $regex=parent::getRegularExpression(); - return $regex===''?self::EMAIL_REGEXP:$regex; - } -public function evaluateIsValid() - { - $valid=parent::evaluateIsValid(); - if($valid && function_exists('checkdnsrr')) - { - if(($value=$this->getValidationValue($this->getValidationTarget()))!=='') - { - if(($pos=strpos($value,'@'))!==false) - { - $domain=substr($value,$pos+1); - return $domain===''?false:checkdnsrr($domain,'MX'); - } - else - return false; - } - } - return $valid; - } -} -?><?php +public function getRegularExpression()
+{
+$regex=parent::getRegularExpression();
+return $regex===''?self::EMAIL_REGEXP:$regex;
+} +public function evaluateIsValid()
+{
+$valid=parent::evaluateIsValid();
+if($valid && function_exists('checkdnsrr'))
+{
+if(($value=$this->getValidationValue($this->getValidationTarget()))!=='')
+{
+if(($pos=strpos($value,'@'))!==false)
+{
+$domain=substr($value,$pos+1);
+return $domain===''?false:checkdnsrr($domain,'MX');
+}
+else
+return false;
+}
+}
+return $valid;
+}
+} -class TCustomValidator extends TBaseValidator -{ -public function getClientValidationFunction() - { - return $this->getViewState('ClientValidationFunction',''); - } -public function setClientValidationFunction($value) - { - $this->setViewState('ClientValidationFunction',$value,''); - } -public function evaluateIsValid() - { - $value=$this->getValidationValue($this->getValidationTarget()); - return $this->onServerValidate($value); - } -public function onServerValidate($value) - { - $param=new TServerValidateEventParameter($value,true); - $this->raiseEvent('OnServerValidate',$this,$param); - return $param->getIsValid(); - } -protected function getClientScriptOptions() - { - $options=parent::getClientScriptOptions(); - if(($clientJs=$this->getClientValidationFunction())!=='') - $options['clientvalidationfunction']=$clientJs; - return $options; - } -} -class TServerValidateEventParameter extends TEventParameter +class TCustomValidator extends TBaseValidator
+{ +public function getClientValidationFunction()
+{
+return $this->getViewState('ClientValidationFunction','');
+} +public function setClientValidationFunction($value)
+{
+$this->setViewState('ClientValidationFunction',$value,'');
+} +public function evaluateIsValid()
+{
+$value=$this->getValidationValue($this->getValidationTarget());
+return $this->onServerValidate($value);
+} +public function onServerValidate($value)
+{
+$param=new TServerValidateEventParameter($value,true);
+$this->raiseEvent('OnServerValidate',$this,$param);
+return $param->getIsValid();
+} +protected function getClientScriptOptions()
+{
+$options=parent::getClientScriptOptions();
+if(($clientJs=$this->getClientValidationFunction())!=='')
+$options['clientvalidationfunction']=$clientJs;
+return $options;
+}
+} +class TServerValidateEventParameter extends TEventParameter
{ private $_value=''; private $_isValid=true; -public function __construct($value,$isValid) - { - $this->_value=$value; - $this->setIsValid($isValid); - } -public function getValue() - { - return $this->_value; - } -public function getIsValid() - { - return $this->_isValid; - } -public function setIsValid($value) - { - $this->_isValid=TPropertyValue::ensureBoolean($value); - } -} -?><?php -class TValidationSummary extends TWebControl -{ -public function getHeaderText() - { - return $this->getViewState('HeaderText',''); - } -public function setHeaderText($value) - { - $this->setViewState('HeaderText',$value,''); - } -public function getDisplayMode() - { - return $this->getViewState('DisplayMode','BulletList'); - } -public function setDisplayMode($value) - { - $this->setViewState('DisplayMode',TPropertyValue::ensureEnum($value,'List','SingleParagraph','BulletList'),'BulletList'); - } -public function getEnableClientScript() - { - return $this->getViewState('EnableClientScript',true); - } -public function setEnableClientScript($value) - { - $this->setViewState('EnableClientScript',TPropertyValue::ensureBoolean($value),true); - } -public function getShowMessageBox() - { - return $this->getViewState('ShowMessageBox',false); - } -public function setShowMessageBox($value) - { - $this->setViewState('ShowMessageBox',TPropertyValue::ensureBoolean($value),false); - } -public function getShowSummary() - { - return $this->getViewState('ShowSummary',true); - } -public function setShowSummary($value) - { - $this->setViewState('ShowSummary',TPropertyValue::ensureBoolean($value),true); - } -public function getShowAnchor() - { - return $this->getViewState('ShowAnchor',false); - } -public function setShowAnchor($value) - { - $this->setViewState('ShowAnchor',TPropertyValue::ensureBoolean($value),false); - } -public function getAutoUpdate() - { - return $this->getViewState('AutoUpdate', true); - } -public function setAutoUpdate($value) - { - $this->setViewState('AutoUpdate', TPropertyValue::ensureBoolean($value), true); - } -public function getValidationGroup() - { - return $this->getViewState('ValidationGroup',''); - } -public function setValidationGroup($value) - { - $this->setViewState('ValidationGroup',$value,''); - } -protected function addAttributesToRender($writer) - { - $writer->addAttribute('id',$this->getClientID()); - parent::addAttributesToRender($writer); - } -protected function renderJsSummary() - { - if(!$this->getEnabled(true) || !$this->getEnableClientScript()) - return; - $serializer = new TJavascriptSerializer($this->getClientScriptOptions()); - $options = $serializer->toJavascript(); - $script = "new Prado.Validation.Summary({$options});"; - $this->getPage()->getClientScript()->registerEndScript($this->getClientID(), $script); - } -protected function getClientScriptOptions() - { - $options['id'] = $this->ClientID; - $options['form'] = $this->Page->Form->ClientID; - if($this->getShowMessageBox()) - $options['showmessagebox']='True'; - if(!$this->getShowSummary()) - $options['showsummary']='False'; -$options['headertext']=$this->getHeaderText(); - $options['displaymode']=$this->getDisplayMode(); -$options['refresh'] = $this->getAutoUpdate(); - $options['validationgroup'] = $this->getValidationGroup(); - return $options; - } -protected function getErrorMessages() - { - $validators=$this->getPage()->getValidators($this->getValidationGroup()); - $messages = array(); - foreach($validators as $validator) - { - if(!$validator->getIsValid() && ($msg=$validator->getErrorMessage())!=='') - $messages[] = $msg; - } - return $messages; - } -protected function renderContents($writer) - { - $this->renderJsSummary(); - if($this->getShowSummary()) - { - switch($this->getDisplayMode()) - { - case 'List': - $content = $this->renderList($writer); - break; - case 'SingleParagraph': - $content = $this->renderSingleParagraph($writer); - break; - case 'BulletList': - default: - $content = $this->renderBulletList($writer); - } - } - } -protected function renderList($writer) - { - $header=$this->getHeaderText(); - $messages=$this->getErrorMessages(); - $content = ''; - if(strlen($header)) - $content.= $header."<br/>\n"; - foreach($messages as $message) - $content.="$message<br/>\n"; - $writer->write($content); - } -protected function renderSingleParagraph($writer) - { - $header=$this->getHeaderText(); - $messages=$this->getErrorMessages(); - $content = $header; - foreach($messages as $message) - $content.= ' '.$message; - $writer->write($content); - } -protected function renderBulletList($writer) - { - $header=$this->getHeaderText(); - $messages=$this->getErrorMessages(); - $content = $header; - if(count($messages)>0) - { - $content .= "<ul>\n"; - foreach($messages as $message) - $content.= '<li>'.$message."</li>\n"; - $content .= "</ul>\n"; - } - $writer->write($content); - } -} -?><?php -interface IRepeatInfoUser +public function __construct($value,$isValid)
+{
+$this->_value=$value;
+$this->setIsValid($isValid);
+} +public function getValue()
+{
+return $this->_value;
+} +public function getIsValid()
+{
+return $this->_isValid;
+} +public function setIsValid($value)
+{
+$this->_isValid=TPropertyValue::ensureBoolean($value);
+}
+}
+ +class TValidationSummary extends TWebControl
+{ +public function getHeaderText()
+{
+return $this->getViewState('HeaderText','');
+} +public function setHeaderText($value)
+{
+$this->setViewState('HeaderText',$value,'');
+} +public function getDisplayMode()
+{
+return $this->getViewState('DisplayMode','BulletList');
+} +public function setDisplayMode($value)
+{
+$this->setViewState('DisplayMode',TPropertyValue::ensureEnum($value,'List','SingleParagraph','BulletList'),'BulletList');
+} +public function getEnableClientScript()
+{
+return $this->getViewState('EnableClientScript',true);
+} +public function setEnableClientScript($value)
+{
+$this->setViewState('EnableClientScript',TPropertyValue::ensureBoolean($value),true);
+} +public function getShowMessageBox()
+{
+return $this->getViewState('ShowMessageBox',false);
+} +public function setShowMessageBox($value)
+{
+$this->setViewState('ShowMessageBox',TPropertyValue::ensureBoolean($value),false);
+} +public function getShowSummary()
+{
+return $this->getViewState('ShowSummary',true);
+} +public function setShowSummary($value)
+{
+$this->setViewState('ShowSummary',TPropertyValue::ensureBoolean($value),true);
+} +public function getShowAnchor()
+{
+return $this->getViewState('ShowAnchor',false);
+} +public function setShowAnchor($value)
+{
+$this->setViewState('ShowAnchor',TPropertyValue::ensureBoolean($value),false);
+} +public function getAutoUpdate()
+{
+return $this->getViewState('AutoUpdate', true);
+} +public function setAutoUpdate($value)
+{
+$this->setViewState('AutoUpdate', TPropertyValue::ensureBoolean($value), true);
+} +public function getValidationGroup()
+{
+return $this->getViewState('ValidationGroup','');
+} +public function setValidationGroup($value)
+{
+$this->setViewState('ValidationGroup',$value,'');
+} +protected function addAttributesToRender($writer)
+{
+$writer->addAttribute('id',$this->getClientID());
+parent::addAttributesToRender($writer);
+} +protected function renderJsSummary()
+{
+if(!$this->getEnabled(true) || !$this->getEnableClientScript())
+return;
+$serializer = new TJavascriptSerializer($this->getClientScriptOptions());
+$options = $serializer->toJavascript();
+$script = "new Prado.Validation.Summary({$options});";
+$this->getPage()->getClientScript()->registerEndScript($this->getClientID(), $script);
+} +protected function getClientScriptOptions()
+{
+$options['id'] = $this->ClientID;
+$options['form'] = $this->Page->Form->ClientID;
+if($this->getShowMessageBox())
+$options['showmessagebox']='True';
+if(!$this->getShowSummary())
+$options['showsummary']='False'; +$options['headertext']=$this->getHeaderText();
+$options['displaymode']=$this->getDisplayMode(); +$options['refresh'] = $this->getAutoUpdate();
+$options['validationgroup'] = $this->getValidationGroup();
+return $options;
+} +protected function getErrorMessages()
+{
+$validators=$this->getPage()->getValidators($this->getValidationGroup());
+$messages = array();
+foreach($validators as $validator)
+{
+if(!$validator->getIsValid() && ($msg=$validator->getErrorMessage())!=='')
+$messages[] = $msg;
+}
+return $messages;
+} +protected function renderContents($writer)
+{
+$this->renderJsSummary();
+if($this->getShowSummary())
+{
+switch($this->getDisplayMode())
+{
+case 'List':
+$content = $this->renderList($writer);
+break;
+case 'SingleParagraph':
+$content = $this->renderSingleParagraph($writer);
+break;
+case 'BulletList':
+default:
+$content = $this->renderBulletList($writer);
+}
+}
+} +protected function renderList($writer)
+{
+$header=$this->getHeaderText();
+$messages=$this->getErrorMessages();
+$content = '';
+if(strlen($header))
+$content.= $header."<br/>\n";
+foreach($messages as $message)
+$content.="$message<br/>\n";
+$writer->write($content);
+} +protected function renderSingleParagraph($writer)
+{
+$header=$this->getHeaderText();
+$messages=$this->getErrorMessages();
+$content = $header;
+foreach($messages as $message)
+$content.= ' '.$message;
+$writer->write($content);
+} +protected function renderBulletList($writer)
+{
+$header=$this->getHeaderText();
+$messages=$this->getErrorMessages();
+$content = $header;
+if(count($messages)>0)
+{
+$content .= "<ul>\n";
+foreach($messages as $message)
+$content.= '<li>'.$message."</li>\n";
+$content .= "</ul>\n";
+}
+$writer->write($content);
+}
+} + +interface IRepeatInfoUser
{ public function getHasFooter(); public function getHasHeader(); public function getHasSeparators(); public function getItemCount(); public function generateItemStyle($itemType,$index); -public function renderItem($writer,$repeatInfo,$itemType,$index); +public function renderItem($writer,$repeatInfo,$itemType,$index);
} -class TRepeatInfo extends TComponent +class TRepeatInfo extends TComponent
{ private $_caption=''; private $_captionAlign='NotSet'; private $_repeatColumns=0; private $_repeatDirection='Vertical'; private $_repeatLayout='Table'; -public function getCaption() - { - return $this->_caption; - } -public function setCaption($value) - { - $this->_caption=$value; - } -public function getCaptionAlign() - { - return $this->_captionAlign; - } -public function setCaptionAlign($value) - { - $this->_captionAlign=TPropertyValue::ensureEnum($value,array('NotSet','Top','Bottom','Left','Right')); - } -public function getRepeatColumns() - { - return $this->_repeatColumns; - } -public function setRepeatColumns($value) - { - if(($value=TPropertyValue::ensureInteger($value))<0) - throw new TInvalidDataValueException('repeatinfo_repeatcolumns_invalid'); - $this->_repeatColumns=$value; - } -public function getRepeatDirection() - { - return $this->_repeatDirection; - } -public function setRepeatDirection($value) - { - $this->_repeatDirection=TPropertyValue::ensureEnum($value,array('Horizontal','Vertical')); - } -public function getRepeatLayout() - { - return $this->_repeatLayout; - } -public function setRepeatLayout($value) - { - $this->_repeatLayout=TPropertyValue::ensureEnum($value,array('Table','Flow')); - } -public function renderRepeater($writer, IRepeatInfoUser $user) - { - if($this->_repeatLayout==='Table') - { - $control=new TTable; - if($this->_caption!=='') - { - $control->setCaption($this->_caption); - $control->setCaptionAlign($this->_captionAlign); - } - } - else - $control=new TWebControl; - $control->setID($user->getClientID()); - $control->copyBaseAttributes($user); - if($user->getHasStyle()) - $control->getStyle()->copyFrom($user->getStyle()); - $control->renderBeginTag($writer); - $writer->writeLine(); -if($this->_repeatDirection==='Vertical') - $this->renderVerticalContents($writer,$user); - else - $this->renderHorizontalContents($writer,$user); -$control->renderEndTag($writer); - } -protected function renderHorizontalContents($writer,$user) - { - $tableLayout=($this->_repeatLayout==='Table'); - $hasSeparators=$user->getHasSeparators(); - $itemCount=$user->getItemCount(); - $columns=$this->_repeatColumns===0?$itemCount:$this->_repeatColumns; - $totalColumns=$hasSeparators?$columns+$columns:$columns; - $needBreak=$columns<$itemCount; -if($user->getHasHeader()) - $this->renderHeader($writer,$user,$tableLayout,$totalColumns,$needBreak); -if($tableLayout) - { - $column=0; - for($i=0;$i<$itemCount;++$i) - { - if($column==0) - $writer->renderBeginTag('tr'); - if(($style=$user->generateItemStyle('Item',$i))!==null) - $style->addAttributesToRender($writer); - $writer->renderBeginTag('td'); - $user->renderItem($writer,$this,'Item',$i); - $writer->renderEndTag(); - $writer->writeLine(); - if($hasSeparators && $i!=$itemCount-1) - { - if(($style=$user->generateItemStyle('Separator',$i))!==null) - $style->addAttributesToRender($writer); - $writer->renderBeginTag('td'); - $user->renderItem($writer,$this,'Separator',$i); - $writer->renderEndTag(); - $writer->writeLine(); - } - $column++; - if($i==$itemCount-1) - { - $restColumns=$columns-$column; - if($hasSeparators) - $restColumns=$restColumns?$restColumns+$restColumns+1:1; - for($j=0;$j<$restColumns;++$j) - $writer->write("<td></td>\n"); - } - if($column==$columns || $i==$itemCount-1) - { - $writer->renderEndTag(); - $writer->writeLine(); - $column=0; - } - } - } - else - { - $column=0; - for($i=0;$i<$itemCount;++$i) - { - $user->renderItem($writer,$this,'Item',$i); - if($hasSeparators && $i!=$itemCount-1) - $user->renderItem($writer,$this,'Separator',$i); - $column++; - if($column==$columns || $i==$itemCount-1) - { - if($needBreak) - $writer->writeBreak(); - $column=0; - } - $writer->writeLine(); - } - } -if($user->getHasFooter()) - $this->renderFooter($writer,$user,$tableLayout,$totalColumns,$needBreak); - } -protected function renderVerticalContents($writer,$user) - { - $tableLayout=($this->_repeatLayout==='Table'); - $hasSeparators=$user->getHasSeparators(); - $itemCount=$user->getItemCount(); - if($this->_repeatColumns<=1) - { - $rows=$itemCount; - $columns=1; - $lastColumns=1; - } - else - { - $columns=$this->_repeatColumns; - $rows=(int)(($itemCount+$columns-1)/$columns); - if($rows==0 && $itemCount>0) - $rows=1; - if(($lastColumns=$itemCount%$columns)==0) - $lastColumns=$columns; - } - $totalColumns=$hasSeparators?$columns+$columns:$columns; -if($user->getHasHeader()) - $this->renderHeader($writer,$user,$tableLayout,$totalColumns,false); -if($tableLayout) - { - $renderedItems=0; - for($row=0;$row<$rows;++$row) - { - $index=$row; - $writer->renderBeginTag('tr'); - for($col=0;$col<$columns;++$col) - { - if($renderedItems>=$itemCount) - break; - if($col>0) - { - $index+=$rows; - if($col-1>=$lastColumns) - $index--; - } - if($index>=$itemCount) - continue; - $renderedItems++; - if(($style=$user->generateItemStyle('Item',$index))!==null) - $style->addAttributesToRender($writer); - $writer->renderBeginTag('td'); - $user->renderItem($writer,$this,'Item',$index); - $writer->renderEndTag(); - $writer->writeLine(); - if(!$hasSeparators) - continue; - if($renderedItems<$itemCount-1) - { - if($columns==1) - { - $writer->renderEndTag(); - $writer->renderBeginTag('tr'); - } - if(($style=$user->generateItemStyle('Separator',$index))!==null) - $style->addAttributesToRender($writer); - $writer->renderBeginTag('td'); - $user->renderItem($writer,$this,'Separator',$index); - $writer->renderEndTag(); - $writer->writeLine(); - } - else if($columns>1) - $writer->write("<td></td>\n"); - } - if($row==$rows-1) - { - $restColumns=$columns-$lastColumns; - if($hasSeparators) - $restColumns+=$restColumns; - for($col=0;$col<$restColumns;++$col) - $writer->write("<td></td>\n"); - } - $writer->renderEndTag(); - $writer->writeLine(); - } - } - else - { - $renderedItems=0; - for($row=0;$row<$rows;++$row) - { - $index=$row; - for($col=0;$col<$columns;++$col) - { - if($renderedItems>=$itemCount) - break; - if($col>0) - { - $index+=$rows; - if($col-1>=$lastColumns) - $index--; - } - if($index>=$itemCount) - continue; - $renderedItems++; - $user->renderItem($writer,$this,'Item',$index); - $writer->writeLine(); - if(!$hasSeparators) - continue; - if($renderedItems<$itemCount-1) - { - if($columns==1) - $writer->writeBreak(); - $user->renderItem($writer,$this,'Separator',$index); - } - $writer->writeLine(); - } - if($row<$rows-1 || $user->getHasFooter()) - $writer->writeBreak(); - } - } -if($user->getHasFooter()) - $this->renderFooter($writer,$user,$tableLayout,$totalColumns,false); -} -protected function renderHeader($writer,$user,$tableLayout,$columns,$needBreak) - { - if($tableLayout) - { - $writer->renderBeginTag('tr'); - if($columns>1) - $writer->addAttribute('colspan',"$columns"); - $writer->addAttribute('scope','col'); - if(($style=$user->generateItemStyle('Header',-1))!==null) - $style->addAttributesToRender($writer); - $writer->renderBeginTag('th'); - $user->renderItem($writer,$this,'Header',-1); - $writer->renderEndTag(); - $writer->renderEndTag(); - } - else - { - $user->renderItem($writer,$this,'Header',-1); - if($needBreak) - $writer->writeBreak(); - } - $writer->writeLine(); - } -protected function renderFooter($writer,$user,$tableLayout,$columns) - { - if($tableLayout) - { - $writer->renderBeginTag('tr'); - if($columns>1) - $writer->addAttribute('colspan',"$columns"); - if(($style=$user->generateItemStyle('Footer',-1))!==null) - $style->addAttributesToRender($writer); - $writer->renderBeginTag('td'); - $user->renderItem($writer,$this,'Footer',-1); - $writer->renderEndTag(); - $writer->renderEndTag(); - } - else - $user->renderItem($writer,$this,'Footer',-1); - $writer->writeLine(); - } -} -?><?php +public function getCaption()
+{
+return $this->_caption;
+} +public function setCaption($value)
+{
+$this->_caption=$value;
+} +public function getCaptionAlign()
+{
+return $this->_captionAlign;
+} +public function setCaptionAlign($value)
+{
+$this->_captionAlign=TPropertyValue::ensureEnum($value,array('NotSet','Top','Bottom','Left','Right'));
+} +public function getRepeatColumns()
+{
+return $this->_repeatColumns;
+} +public function setRepeatColumns($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))<0)
+throw new TInvalidDataValueException('repeatinfo_repeatcolumns_invalid');
+$this->_repeatColumns=$value;
+} +public function getRepeatDirection()
+{
+return $this->_repeatDirection;
+} +public function setRepeatDirection($value)
+{
+$this->_repeatDirection=TPropertyValue::ensureEnum($value,array('Horizontal','Vertical'));
+} +public function getRepeatLayout()
+{
+return $this->_repeatLayout;
+} +public function setRepeatLayout($value)
+{
+$this->_repeatLayout=TPropertyValue::ensureEnum($value,array('Table','Flow'));
+} +public function renderRepeater($writer, IRepeatInfoUser $user)
+{
+if($this->_repeatLayout==='Table')
+{
+$control=new TTable;
+if($this->_caption!=='')
+{
+$control->setCaption($this->_caption);
+$control->setCaptionAlign($this->_captionAlign);
+}
+}
+else
+$control=new TWebControl;
+$control->setID($user->getClientID());
+$control->copyBaseAttributes($user);
+if($user->getHasStyle())
+$control->getStyle()->copyFrom($user->getStyle());
+$control->renderBeginTag($writer);
+$writer->writeLine(); +if($this->_repeatDirection==='Vertical')
+$this->renderVerticalContents($writer,$user);
+else
+$this->renderHorizontalContents($writer,$user); +$control->renderEndTag($writer);
+} +protected function renderHorizontalContents($writer,$user)
+{
+$tableLayout=($this->_repeatLayout==='Table');
+$hasSeparators=$user->getHasSeparators();
+$itemCount=$user->getItemCount();
+$columns=$this->_repeatColumns===0?$itemCount:$this->_repeatColumns;
+$totalColumns=$hasSeparators?$columns+$columns:$columns;
+$needBreak=$columns<$itemCount; +if($user->getHasHeader())
+$this->renderHeader($writer,$user,$tableLayout,$totalColumns,$needBreak); +if($tableLayout)
+{
+$column=0;
+for($i=0;$i<$itemCount;++$i)
+{
+if($column==0)
+$writer->renderBeginTag('tr');
+if(($style=$user->generateItemStyle('Item',$i))!==null)
+$style->addAttributesToRender($writer);
+$writer->renderBeginTag('td');
+$user->renderItem($writer,$this,'Item',$i);
+$writer->renderEndTag();
+$writer->writeLine();
+if($hasSeparators && $i!=$itemCount-1)
+{
+if(($style=$user->generateItemStyle('Separator',$i))!==null)
+$style->addAttributesToRender($writer);
+$writer->renderBeginTag('td');
+$user->renderItem($writer,$this,'Separator',$i);
+$writer->renderEndTag();
+$writer->writeLine();
+}
+$column++;
+if($i==$itemCount-1)
+{
+$restColumns=$columns-$column;
+if($hasSeparators)
+$restColumns=$restColumns?$restColumns+$restColumns+1:1;
+for($j=0;$j<$restColumns;++$j)
+$writer->write("<td></td>\n");
+}
+if($column==$columns || $i==$itemCount-1)
+{
+$writer->renderEndTag();
+$writer->writeLine();
+$column=0;
+}
+}
+}
+else
+{
+$column=0;
+for($i=0;$i<$itemCount;++$i)
+{
+$user->renderItem($writer,$this,'Item',$i);
+if($hasSeparators && $i!=$itemCount-1)
+$user->renderItem($writer,$this,'Separator',$i);
+$column++;
+if($column==$columns || $i==$itemCount-1)
+{
+if($needBreak)
+$writer->writeBreak();
+$column=0;
+}
+$writer->writeLine();
+}
+} +if($user->getHasFooter())
+$this->renderFooter($writer,$user,$tableLayout,$totalColumns,$needBreak);
+} +protected function renderVerticalContents($writer,$user)
+{
+$tableLayout=($this->_repeatLayout==='Table');
+$hasSeparators=$user->getHasSeparators();
+$itemCount=$user->getItemCount();
+if($this->_repeatColumns<=1)
+{
+$rows=$itemCount;
+$columns=1;
+$lastColumns=1;
+}
+else
+{
+$columns=$this->_repeatColumns;
+$rows=(int)(($itemCount+$columns-1)/$columns);
+if($rows==0 && $itemCount>0)
+$rows=1;
+if(($lastColumns=$itemCount%$columns)==0)
+$lastColumns=$columns;
+}
+$totalColumns=$hasSeparators?$columns+$columns:$columns; +if($user->getHasHeader())
+$this->renderHeader($writer,$user,$tableLayout,$totalColumns,false); +if($tableLayout)
+{
+$renderedItems=0;
+for($row=0;$row<$rows;++$row)
+{
+$index=$row;
+$writer->renderBeginTag('tr');
+for($col=0;$col<$columns;++$col)
+{
+if($renderedItems>=$itemCount)
+break;
+if($col>0)
+{
+$index+=$rows;
+if($col-1>=$lastColumns)
+$index--;
+}
+if($index>=$itemCount)
+continue;
+$renderedItems++;
+if(($style=$user->generateItemStyle('Item',$index))!==null)
+$style->addAttributesToRender($writer);
+$writer->renderBeginTag('td');
+$user->renderItem($writer,$this,'Item',$index);
+$writer->renderEndTag();
+$writer->writeLine();
+if(!$hasSeparators)
+continue;
+if($renderedItems<$itemCount-1)
+{
+if($columns==1)
+{
+$writer->renderEndTag();
+$writer->renderBeginTag('tr');
+}
+if(($style=$user->generateItemStyle('Separator',$index))!==null)
+$style->addAttributesToRender($writer);
+$writer->renderBeginTag('td');
+$user->renderItem($writer,$this,'Separator',$index);
+$writer->renderEndTag();
+$writer->writeLine();
+}
+else if($columns>1)
+$writer->write("<td></td>\n");
+}
+if($row==$rows-1)
+{
+$restColumns=$columns-$lastColumns;
+if($hasSeparators)
+$restColumns+=$restColumns;
+for($col=0;$col<$restColumns;++$col)
+$writer->write("<td></td>\n");
+}
+$writer->renderEndTag();
+$writer->writeLine();
+}
+}
+else
+{
+$renderedItems=0;
+for($row=0;$row<$rows;++$row)
+{
+$index=$row;
+for($col=0;$col<$columns;++$col)
+{
+if($renderedItems>=$itemCount)
+break;
+if($col>0)
+{
+$index+=$rows;
+if($col-1>=$lastColumns)
+$index--;
+}
+if($index>=$itemCount)
+continue;
+$renderedItems++;
+$user->renderItem($writer,$this,'Item',$index);
+$writer->writeLine();
+if(!$hasSeparators)
+continue;
+if($renderedItems<$itemCount-1)
+{
+if($columns==1)
+$writer->writeBreak();
+$user->renderItem($writer,$this,'Separator',$index);
+}
+$writer->writeLine();
+}
+if($row<$rows-1 || $user->getHasFooter())
+$writer->writeBreak();
+}
+} +if($user->getHasFooter())
+$this->renderFooter($writer,$user,$tableLayout,$totalColumns,false); +} +protected function renderHeader($writer,$user,$tableLayout,$columns,$needBreak)
+{
+if($tableLayout)
+{
+$writer->renderBeginTag('tr');
+if($columns>1)
+$writer->addAttribute('colspan',"$columns");
+$writer->addAttribute('scope','col');
+if(($style=$user->generateItemStyle('Header',-1))!==null)
+$style->addAttributesToRender($writer);
+$writer->renderBeginTag('th');
+$user->renderItem($writer,$this,'Header',-1);
+$writer->renderEndTag();
+$writer->renderEndTag();
+}
+else
+{
+$user->renderItem($writer,$this,'Header',-1);
+if($needBreak)
+$writer->writeBreak();
+}
+$writer->writeLine();
+} +protected function renderFooter($writer,$user,$tableLayout,$columns)
+{
+if($tableLayout)
+{
+$writer->renderBeginTag('tr');
+if($columns>1)
+$writer->addAttribute('colspan',"$columns");
+if(($style=$user->generateItemStyle('Footer',-1))!==null)
+$style->addAttributesToRender($writer);
+$writer->renderBeginTag('td');
+$user->renderItem($writer,$this,'Footer',-1);
+$writer->renderEndTag();
+$writer->renderEndTag();
+}
+else
+$user->renderItem($writer,$this,'Footer',-1);
+$writer->writeLine();
+}
+} -class TRepeater extends TDataBoundControl implements INamingContainer -{ -const CACHE_EXPIRY=18000; -private static $_templates=array(); -private $_itemTemplate=''; -private $_alternatingItemTemplate=''; -private $_headerTemplate=''; -private $_footerTemplate=''; -private $_separatorTemplate=''; +class TRepeater extends TDataBoundControl implements INamingContainer
+{ +private $_itemTemplate=null; +private $_alternatingItemTemplate=null; +private $_headerTemplate=null; +private $_footerTemplate=null; +private $_separatorTemplate=null; private $_items=null; private $_header=null; private $_footer=null; -public function addParsedObject($object) - { - } -public function getItemTemplate() - { - return $this->_itemTemplate; - } -public function setItemTemplate($value) - { - $this->_itemTemplate=$value; - } -public function getAlternatingItemTemplate() - { - return $this->_alternatingItemTemplate; - } -public function setAlternatingItemTemplate($value) - { - $this->_alternatingItemTemplate=$value; - } -public function getHeaderTemplate() - { - return $this->_headerTemplate; - } -public function setHeaderTemplate($value) - { - $this->_headerTemplate=$value; - } -public function getFooterTemplate() - { - return $this->_footerTemplate; - } -public function setFooterTemplate($value) - { - $this->_footerTemplate=$value; - } -public function getSeparatorTemplate() - { - return $this->_separatorTemplate; - } -public function setSeparatorTemplate($value) - { - $this->_separatorTemplate=$value; - } -public function getHeader() - { - return $this->_header; - } -public function getFooter() - { - return $this->_footer; - } -public function getItems() - { - if(!$this->_items) - $this->_items=new TRepeaterItemCollection; - return $this->_items; - } -protected function createItem($itemIndex,$itemType) - { - return new TRepeaterItem($itemIndex,$itemType); - } -private function createItemInternal($itemIndex,$itemType,$dataBind,$dataItem) - { - $item=$this->createItem($itemIndex,$itemType); - $this->initializeItem($item); - $param=new TRepeaterItemEventParameter($item); - if($dataBind) - { - $item->setDataItem($dataItem); - $this->onItemCreated($param); - $this->getControls()->add($item); - $item->dataBind(); - $this->onItemDataBound($param); - $item->setDataItem(null); - } - else - { - $this->onItemCreated($param); - $this->getControls()->add($item); - } - return $item; - } -protected function initializeItem($item) - { - $tplContent=''; - switch($item->getItemType()) - { - case 'Header': $tplContent=$this->_headerTemplate; break; - case 'Footer': $tplContent=$this->_footerTemplate; break; - case 'Item': $tplContent=$this->_itemTemplate; break; - case 'Separator': $tplContent=$this->_separatorTemplate; break; - case 'AlternatingItem': $tplContent=$this->_alternatingItemTemplate==='' ? $this->_itemTemplate : $this->_alternatingItemTemplate; break; - case 'SelectedItem': - case 'EditItem': - default: - break; - } - if($tplContent!=='') - $this->createTemplate($tplContent)->instantiateIn($item); - } -protected function createTemplate($str) - { - $key=md5($str); - if(isset(self::$_templates[$key])) - return self::$_templates[$key]; - else - { - $contextPath=$this->getTemplateControl()->getTemplate()->getContextPath(); - if(($cache=$this->getApplication()->getCache())!==null) - { - if(($template=$cache->get($key))===null) - { - $template=new TTemplate($str,$contextPath); - $cache->set($key,$template,self::CACHE_EXPIRY); - } - } - else - $template=new TTemplate($str,$contextPath); - self::$_templates[$key]=$template; - return $template; - } - } -protected function render($writer) - { - $this->renderContents($writer); - } -protected function onSaveState($param) - { - if($this->_items) - $this->setViewState('ItemCount',$this->_items->getCount(),0); - else - $this->clearViewState('ItemCount'); - } -protected function onLoadState($param) - { - if(!$this->getIsDataBound()) - $this->restoreItemsFromViewState(); - $this->clearViewState('ItemCount'); - } -public function reset() - { - $this->getControls()->clear(); - $this->getItems()->clear(); - $this->_header=null; - $this->_footer=null; - } -protected function restoreItemsFromViewState() - { - $this->reset(); - if(($itemCount=$this->getViewState('ItemCount',0))>0) - { - $items=$this->getItems(); - $hasSeparator=$this->_separatorTemplate!==''; - if($this->_headerTemplate!=='') - $this->_header=$this->createItemInternal(-1,'Header',false,null); - for($i=0;$i<$itemCount;++$i) - { - if($hasSeparator && $i>0) - $this->createItemInternal($i-1,'Separator',false,null); - $itemType=$i%2==0?'Item':'AlternatingItem'; - $items->add($this->createItemInternal($i,$itemType,false,null)); - } - if($this->_footerTemplate!=='') - $this->_footer=$this->createItemInternal(-1,'Footer',false,null); - } - $this->clearChildState(); - } -protected function performDataBinding($data) - { - $this->reset(); - $itemIndex=0; - $items=$this->getItems(); - $hasSeparator=$this->_separatorTemplate!==''; - foreach($data as $dataItem) - { - if($itemIndex===0 && $this->_headerTemplate!=='') - $this->_header=$this->createItemInternal(-1,'Header',true,null); - if($hasSeparator && $itemIndex>0) - $this->createItemInternal($itemIndex-1,'Separator',true,null); - $itemType=$itemIndex%2==0?'Item':'AlternatingItem'; - $items->add($this->createItemInternal($itemIndex,$itemType,true,$dataItem)); - $itemIndex++; - } - if($itemIndex>0 && $this->_footerTemplate!=='') - $this->_footer=$this->createItemInternal(-1,'Footer',true,null); - $this->setViewState('ItemCount',$itemIndex,0); - } -protected function onBubbleEvent($sender,$param) - { - if($param instanceof TRepeaterCommandEventParameter) - { - $this->onItemCommand($param); - return true; - } - else - return false; - } -protected function onItemCreated($param) - { - $this->raiseEvent('OnItemCreated',$this,$param); - } -protected function onItemDataBound($param) - { - $this->raiseEvent('OnItemDataBound',$this,$param); - } -protected function onItemCommand($param) - { - $this->raiseEvent('OnItemCommand',$this,$param); - } -} -class TRepeaterItemEventParameter extends TEventParameter +public function addParsedObject($object)
+{
+} +public function getItemTemplate()
+{
+return $this->_itemTemplate;
+} +public function setItemTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_itemTemplate=$value;
+else
+throw new TInvalidDataTypeException('repeater_template_required','ItemTemplate');
+} +public function getAlternatingItemTemplate()
+{
+return $this->_alternatingItemTemplate;
+} +public function setAlternatingItemTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_alternatingItemTemplate=$value;
+else
+throw new TInvalidDataTypeException('repeater_template_required','AlternatingItemTemplate');
+} +public function getHeaderTemplate()
+{
+return $this->_headerTemplate;
+} +public function setHeaderTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_headerTemplate=$value;
+else
+throw new TInvalidDataTypeException('repeater_template_required','HeaderTemplate');
+} +public function getFooterTemplate()
+{
+return $this->_footerTemplate;
+} +public function setFooterTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_footerTemplate=$value;
+else
+throw new TInvalidDataTypeException('repeater_template_required','FooterTemplate');
+} +public function getSeparatorTemplate()
+{
+return $this->_separatorTemplate;
+} +public function setSeparatorTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_separatorTemplate=$value;
+else
+throw new TInvalidDataTypeException('repeater_template_required','SeparatorTemplate');
+} +public function getHeader()
+{
+return $this->_header;
+} +public function getFooter()
+{
+return $this->_footer;
+} +public function getItems()
+{
+if(!$this->_items)
+$this->_items=new TRepeaterItemCollection;
+return $this->_items;
+} +protected function createItem($itemIndex,$itemType)
+{
+return new TRepeaterItem($itemIndex,$itemType);
+} +private function createItemInternal($itemIndex,$itemType,$dataBind,$dataItem)
+{
+$item=$this->createItem($itemIndex,$itemType);
+$this->initializeItem($item);
+$param=new TRepeaterItemEventParameter($item);
+if($dataBind)
+{
+$item->setDataItem($dataItem);
+$this->onItemCreated($param);
+$this->getControls()->add($item);
+$item->dataBind();
+$this->onItemDataBound($param);
+$item->setDataItem(null);
+}
+else
+{
+$this->onItemCreated($param);
+$this->getControls()->add($item);
+}
+return $item;
+} +protected function initializeItem($item)
+{
+$template=null;
+switch($item->getItemType())
+{
+case 'Header': $template=$this->_headerTemplate; break;
+case 'Footer': $template=$this->_footerTemplate; break;
+case 'Item': $template=$this->_itemTemplate; break;
+case 'Separator': $template=$this->_separatorTemplate; break;
+case 'AlternatingItem': $template=$this->_alternatingItemTemplate===null ? $this->_itemTemplate : $this->_alternatingItemTemplate; break;
+case 'SelectedItem':
+case 'EditItem':
+default:
+break;
+}
+if($template!==null)
+$template->instantiateIn($item);
+} +protected function render($writer)
+{
+$this->renderContents($writer);
+} +public function saveState()
+{
+parent::saveState();
+if($this->_items)
+$this->setViewState('ItemCount',$this->_items->getCount(),0);
+else
+$this->clearViewState('ItemCount');
+} +public function loadState()
+{
+parent::loadState();
+if(!$this->getIsDataBound())
+$this->restoreItemsFromViewState();
+$this->clearViewState('ItemCount');
+} +public function reset()
+{
+$this->getControls()->clear();
+$this->getItems()->clear();
+$this->_header=null;
+$this->_footer=null;
+} +protected function restoreItemsFromViewState()
+{
+$this->reset();
+if(($itemCount=$this->getViewState('ItemCount',0))>0)
+{
+$items=$this->getItems();
+$hasSeparator=$this->_separatorTemplate!==null;
+if($this->_headerTemplate!==null)
+$this->_header=$this->createItemInternal(-1,'Header',false,null);
+for($i=0;$i<$itemCount;++$i)
+{
+if($hasSeparator && $i>0)
+$this->createItemInternal($i-1,'Separator',false,null);
+$itemType=$i%2==0?'Item':'AlternatingItem';
+$items->add($this->createItemInternal($i,$itemType,false,null));
+}
+if($this->_footerTemplate!==null)
+$this->_footer=$this->createItemInternal(-1,'Footer',false,null);
+}
+$this->clearChildState();
+} +protected function performDataBinding($data)
+{
+$this->reset();
+$itemIndex=0;
+$items=$this->getItems();
+$hasSeparator=$this->_separatorTemplate!==null;
+foreach($data as $dataItem)
+{
+if($itemIndex===0 && $this->_headerTemplate!==null)
+$this->_header=$this->createItemInternal(-1,'Header',true,null);
+if($hasSeparator && $itemIndex>0)
+$this->createItemInternal($itemIndex-1,'Separator',true,null);
+$itemType=$itemIndex%2==0?'Item':'AlternatingItem';
+$items->add($this->createItemInternal($itemIndex,$itemType,true,$dataItem));
+$itemIndex++;
+}
+if($itemIndex>0 && $this->_footerTemplate!==null)
+$this->_footer=$this->createItemInternal(-1,'Footer',true,null);
+$this->setViewState('ItemCount',$itemIndex,0);
+} +public function onBubbleEvent($sender,$param)
+{
+if($param instanceof TRepeaterCommandEventParameter)
+{
+$this->onItemCommand($param);
+return true;
+}
+else
+return false;
+} +public function onItemCreated($param)
+{
+$this->raiseEvent('OnItemCreated',$this,$param);
+} +public function onItemDataBound($param)
+{
+$this->raiseEvent('OnItemDataBound',$this,$param);
+} +public function onItemCommand($param)
+{
+$this->raiseEvent('OnItemCommand',$this,$param);
+}
+} +class TRepeaterItemEventParameter extends TEventParameter
{ private $_item=null; -public function __construct(TRepeaterItem $item) - { - $this->_item=$item; - } -public function getItem() - { - return $this->_item; - } +public function __construct(TRepeaterItem $item)
+{
+$this->_item=$item;
+} +public function getItem()
+{
+return $this->_item;
+}
} -class TRepeaterCommandEventParameter extends TCommandEventParameter +class TRepeaterCommandEventParameter extends TCommandEventParameter
{ private $_item=null; private $_source=null; -public function __construct($item,$source,TCommandEventParameter $param) - { - $this->_item=$item; - $this->_source=$source; - parent::__construct($param->getCommandName(),$param->getCommandParameter()); - } -public function getItem() - { - return $this->_item; - } -public function getCommandSource() - { - return $this->_source; - } -} -class TRepeaterItem extends TControl implements INamingContainer +public function __construct($item,$source,TCommandEventParameter $param)
+{
+$this->_item=$item;
+$this->_source=$source;
+parent::__construct($param->getCommandName(),$param->getCommandParameter());
+} +public function getItem()
+{
+return $this->_item;
+} +public function getCommandSource()
+{
+return $this->_source;
+}
+} +class TRepeaterItem extends TControl implements INamingContainer
{ private $_itemIndex=''; private $_itemType=''; private $_dataItem=null; -public function __construct($itemIndex,$itemType) - { - $this->_itemIndex=$itemIndex; - $this->_itemType=TPropertyValue::ensureEnum($itemType,'Header','Footer','Item','AlternatingItem','SelectedItem','EditItem','Separator','Pager'); - } -public function getItemType() - { - return $this->_itemType; - } -public function getItemIndex() - { - return $this->_itemIndex; - } -public function getDataItem() - { - return $this->_dataItem; - } -public function setDataItem($value) - { - $this->_dataItem=$value; - } -protected function onBubbleEvent($sender,$param) - { - if($param instanceof TCommandEventParameter) - { - $this->raiseBubbleEvent($this,new TRepeaterCommandEventParameter($this,$sender,$param)); - return true; - } - else - return false; - } -} -class TRepeaterItemCollection extends TList -{ -protected function canAddItem($item) - { - return ($item instanceof TRepeaterItem); - } -} -?><?php - -abstract class TBaseDataList extends TDataBoundControl -{ -public function addParsedObject($object) - { - } -protected function createStyle() - { - return new TTableStyle; - } -public function getCaption() - { - return $this->getViewState('Caption',''); - } -public function setCaption($value) - { - $this->setViewState('Caption',''); - } -public function getCaptionAlign() - { - return $this->getViewState('CaptionAlign','NotSet'); - } -public function setCaptionAlign($value) - { - $this->setViewState('CaptionAlign',TPropertyValue::ensureEnum($value,'NotSet','Top','Bottom','Left','Right'),'NotSet'); - } -public function getCellSpacing() - { - if($this->getHasStyle()) - return $this->getStyle()->getCellSpacing(); - else - return -1; - } -public function setCellSpacing($value) - { - $this->getStyle()->setCellSpacing($value); - } -public function getCellPadding() - { - if($this->getHasStyle()) - return $this->getStyle()->getCellPadding(); - else - return -1; - } -public function setCellPadding($value) - { - $this->getStyle()->setCellPadding($value); - } -public function getHorizontalAlign() - { - if($this->getHasStyle()) - return $this->getStyle()->getHorizontalAlign(); - else - return 'NotSet'; - } -public function setHorizontalAlign($value) - { - $this->getStyle()->setHorizontalAlign($value); - } -public function getGridLines() - { - if($this->getHasStyle()) - return $this->getStyle()->getGridLines(); - else - return 'None'; - } -public function setGridLines($value) - { - $this->getStyle()->setGridLines($value); - } -public function getDataKeyField() - { - return $this->getViewState('DataKeyField',''); - } -public function setDataKeyField($value) - { - $this->setViewState('DataKeyField',$value,''); - } -public function getDataKeys() - { - if(($dataKeys=$this->getViewState('DataKeys',null))===null) - { - $dataKeys=new TList; - $this->setViewState('DataKeys',$dataKeys,null); - } - return $dataKeys; - } -protected function getDataFieldValue($data,$field) - { - if(is_array($data)) - return $data[$field]; - else if(($data instanceof TMap) || ($data instanceof TList)) - return $data->itemAt($field); - else if(($data instanceof TComponent) && $data->canGetProperty($field)) - { - $getter='get'.$field; - return $data->$getter(); - } - else - throw new TInvalidDataValueException('basedatalist_datafield_invalid'); - } -public function onSelectedIndexChanged($param) - { - $this->raiseEvent('OnSelectedIndexChanged',$this,$param); - } -} -?><?php +public function __construct($itemIndex,$itemType)
+{
+$this->_itemIndex=$itemIndex;
+$this->_itemType=TPropertyValue::ensureEnum($itemType,'Header','Footer','Item','AlternatingItem','SelectedItem','EditItem','Separator','Pager');
+} +public function getItemType()
+{
+return $this->_itemType;
+} +public function getItemIndex()
+{
+return $this->_itemIndex;
+} +public function getDataItem()
+{
+return $this->_dataItem;
+} +public function setDataItem($value)
+{
+$this->_dataItem=$value;
+} +public function onBubbleEvent($sender,$param)
+{
+if($param instanceof TCommandEventParameter)
+{
+$this->raiseBubbleEvent($this,new TRepeaterCommandEventParameter($this,$sender,$param));
+return true;
+}
+else
+return false;
+}
+} +class TRepeaterItemCollection extends TList
+{ +public function insertAt($index,$item)
+{
+if($item instanceof TRepeaterItem)
+parent::insertAt($index,$item);
+else
+throw new TInvalidDataTypeException('repeateritemcollection_repeateritem_required');
+}
+} +abstract class TBaseDataList extends TDataBoundControl
+{ +public function addParsedObject($object)
+{
+} +protected function createStyle()
+{
+return new TTableStyle;
+} +public function getCaption()
+{
+return $this->getViewState('Caption','');
+} +public function setCaption($value)
+{
+$this->setViewState('Caption','');
+} +public function getCaptionAlign()
+{
+return $this->getViewState('CaptionAlign','NotSet');
+} +public function setCaptionAlign($value)
+{
+$this->setViewState('CaptionAlign',TPropertyValue::ensureEnum($value,'NotSet','Top','Bottom','Left','Right'),'NotSet');
+} +public function getCellSpacing()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getCellSpacing();
+else
+return -1;
+} +public function setCellSpacing($value)
+{
+$this->getStyle()->setCellSpacing($value);
+} +public function getCellPadding()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getCellPadding();
+else
+return -1;
+} +public function setCellPadding($value)
+{
+$this->getStyle()->setCellPadding($value);
+} +public function getHorizontalAlign()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getHorizontalAlign();
+else
+return 'NotSet';
+} +public function setHorizontalAlign($value)
+{
+$this->getStyle()->setHorizontalAlign($value);
+} +public function getGridLines()
+{
+if($this->getHasStyle())
+return $this->getStyle()->getGridLines();
+else
+return 'None';
+} +public function setGridLines($value)
+{
+$this->getStyle()->setGridLines($value);
+} +public function getDataKeyField()
+{
+return $this->getViewState('DataKeyField','');
+} +public function setDataKeyField($value)
+{
+$this->setViewState('DataKeyField',$value,'');
+} +public function getDataKeys()
+{
+if(($dataKeys=$this->getViewState('DataKeys',null))===null)
+{
+$dataKeys=new TList;
+$this->setViewState('DataKeys',$dataKeys,null);
+}
+return $dataKeys;
+} +protected function getDataFieldValue($data,$field)
+{
+if(is_array($data))
+return $data[$field];
+else if(($data instanceof TMap) || ($data instanceof TList))
+return $data->itemAt($field);
+else if(($data instanceof TComponent) && $data->canGetProperty($field))
+{
+$getter='get'.$field;
+return $data->$getter();
+}
+else
+throw new TInvalidDataValueException('basedatalist_datafield_invalid');
+} +public function onSelectedIndexChanged($param)
+{
+$this->raiseEvent('OnSelectedIndexChanged',$this,$param);
+}
+} -class TDataList extends TBaseDataList implements INamingContainer, IRepeatInfoUser +class TDataList extends TBaseDataList implements INamingContainer, IRepeatInfoUser
{ -const CACHE_EXPIRY=18000; -private static $_templates=array(); private $_items=null; -private $_itemTemplate=''; - private $_alternatingItemTemplate=''; - private $_selectedItemTemplate=''; - private $_editItemTemplate=''; - private $_headerTemplate=''; - private $_footerTemplate=''; - private $_separatorTemplate=''; +private $_itemTemplate=null;
+private $_alternatingItemTemplate=null;
+private $_selectedItemTemplate=null;
+private $_editItemTemplate=null;
+private $_headerTemplate=null;
+private $_footerTemplate=null;
+private $_separatorTemplate=null; private $_header=null; private $_footer=null; -public function getItems() - { - if(!$this->_items) - $this->_items=new TDataListItemCollection; - return $this->_items; - } -public function getItemCount() - { - return $this->_items?$this->_items->getCount():0; - } -public function getItemTemplate() - { - return $this->_itemTemplate; - } -public function setItemTemplate($value) - { - $this->_itemTemplate=$value; - } -public function getItemStyle() - { - if(($style=$this->getViewState('ItemStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('ItemStyle',$style,null); - } - return $style; - } -public function getAlternatingItemTemplate() - { - return $this->_alternatingItemTemplate; - } -public function setAlternatingItemTemplate($value) - { - $this->_alternatingItemTemplate=$value; - } -public function getAlternatingItemStyle() - { - if(($style=$this->getViewState('AlternatingItemStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('AlternatingItemStyle',$style,null); - } - return $style; - } -public function getSelectedItemTemplate() - { - return $this->_selectedItemTemplate; - } -public function setSelectedItemTemplate($value) - { - $this->_selectedItemTemplate=$value; - } -public function getSelectedItemStyle() - { - if(($style=$this->getViewState('SelectedItemStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('SelectedItemStyle',$style,null); - } - return $style; - } -public function getEditItemTemplate() - { - return $this->_editItemTemplate; - } -public function setEditItemTemplate($value) - { - $this->_editItemTemplate=$value; - } -public function getEditItemStyle() - { - if(($style=$this->getViewState('EditItemStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('EditItemStyle',$style,null); - } - return $style; - } -public function getHeaderTemplate() - { - return $this->_headerTemplate; - } -public function setHeaderTemplate($value) - { - $this->_headerTemplate=$value; - } -public function getHeaderStyle() - { - if(($style=$this->getViewState('HeaderStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('HeaderStyle',$style,null); - } - return $style; - } -public function getHeader() - { - return $this->_header; - } -public function getFooterTemplate() - { - return $this->_footerTemplate; - } -public function setFooterTemplate($value) - { - $this->_footerTemplate=$value; - } -public function getFooterStyle() - { - if(($style=$this->getViewState('FooterStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('FooterStyle',$style,null); - } - return $style; - } -public function getFooter() - { - return $this->_footer; - } -public function getSeparatorTemplate() - { - return $this->_separatorTemplate; - } -public function setSeparatorTemplate($value) - { - $this->_separatorTemplate=$value; - } -public function getSeparatorStyle() - { - if(($style=$this->getViewState('SeparatorStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('SeparatorStyle',$style,null); - } - return $style; - } -public function getSelectedItemIndex() - { - return $this->getViewState('SelectedItemIndex',-1); - } -public function setSelectedItemIndex($value) - { - if(($value=TPropertyValue::ensureInteger($value))<0) - $value=-1; - if(($current=$this->getSelectedItemIndex())!==$value) - { - $this->setViewState('SelectedItemIndex',$value,-1); - $items=$this->getItems(); - $itemCount=$items->getCount(); - if($current>=0 && $current<$itemCount) - { - $item=$items->itemAt($current); - if($item->getItemType()!=='EditItem') - $item->setItemType($current%2?'AlternatingItem':'Item'); - } - if($value>=0 && $value<$itemCount) - { - $item=$items->itemAt($value); - if($item->getItemType()!=='EditItem') - $item->setItemType('SelectedItem'); - } - } - } -public function getSelectedItem() - { - $index=$this->getSelectedItemIndex(); - $items=$this->getItems(); - if($index>=0 && $index<$items->getCount()) - return $items->itemAt($index); - else - return null; - } -public function getSelectedDataKey() - { - if($this->getDataKeyField()==='') - throw new TInvalidOperationException('datalist_datakeyfield_required'); - $index=$this->getSelectedIndex(); - $dataKeys=$this->getDataKeys(); - if($index>=0 && $index<$dataKeys->getCount()) - return $dataKeys->itemAt($index); - else - return null; - } -public function getEditItemIndex() - { - return $this->getViewState('EditItemIndex',-1); - } -public function setEditItemIndex($value) - { - if(($value=TPropertyValue::ensureInteger($value))<0) - $value=-1; - if(($current=$this->getEditItemIndex())!==$value) - { - $this->setViewState('EditItemIndex',$value,-1); - $items=$this->getItems(); - $itemCount=$items->getCount(); - if($current>=0 && $current<$itemCount) - $items->itemAt($current)->setItemType($current%2?'AlternatingItem':'Item'); - if($value>=0 && $value<$itemCount) - $items->itemAt($value)->setItemType('EditItem'); - } - } -public function getEditItem() - { - $index=$this->getEditItemIndex(); - $items=$this->getItems(); - if($index>=0 && $index<$items->getCount()) - return $items->itemAt($index); - else - return null; - } -public function getShowHeader() - { - return $this->getViewState('ShowHeader',true); - } -public function setShowHeader($value) - { - $this->setViewState('ShowHeader',TPropertyValue::ensureBoolean($value),true); - } -public function getShowFooter() - { - return $this->getViewState('ShowFooter',true); - } -public function setShowFooter($value) - { - $this->setViewState('ShowFooter',TPropertyValue::ensureBoolean($value),true); - } -protected function getRepeatInfo() - { - if(($repeatInfo=$this->getViewState('RepeatInfo',null))===null) - { - $repeatInfo=new TRepeatInfo; - $this->setViewState('RepeatInfo',$repeatInfo,null); - } - return $repeatInfo; - } -public function getCaption() - { - return $this->getRepeatInfo()->getCaption(); - } -public function setCaption($value) - { - $this->getRepeatInfo()->setCaption($value); - } -public function getCaptionAlign() - { - return $this->getRepeatInfo()->getCaptionAlign(); - } -public function setCaptionAlign($value) - { - $this->getRepeatInfo()->setCaptionAlign($value); - } -public function getRepeatColumns() - { - return $this->getRepeatInfo()->getRepeatColumns(); - } -public function setRepeatColumns($value) - { - $this->getRepeatInfo()->setRepeatColumns($value); - } -public function getRepeatDirection() - { - return $this->getRepeatInfo()->getRepeatDirection(); - } -public function setRepeatDirection($value) - { - $this->getRepeatInfo()->setRepeatDirection($value); - } -public function getRepeatLayout() - { - return $this->getRepeatInfo()->getRepeatLayout(); - } -public function setRepeatLayout($value) - { - $this->getRepeatInfo()->setRepeatLayout($value); - } -protected function onBubbleEvent($sender,$param) - { - if($param instanceof TDataListCommandEventParameter) - { - $this->onItemCommand($param); - $command=$param->getCommandName(); - if(strcasecmp($command,'select')===0) - { - $this->setSelectedIndex($param->getItem()->getItemIndex()); - $this->onSelectedIndexChanged(null); - return true; - } - else if(strcasecmp($command,'edit')===0) - { - $this->onEditCommand($param); - return true; - } - else if(strcasecmp($command,'delete')===0) - { - $this->onDeleteCommand($param); - return true; - } - else if(strcasecmp($command,'update')===0) - { - $this->onUpdateCommand($param); - return true; - } - else if(strcasecmp($command,'cancel')===0) - { - $this->onCancelCommand($param); - return true; - } - } - return false; - } -public function onItemCreated($param) - { - $this->raiseEvent('OnItemCreated',$this,$param); - } -public function onItemDataBound($param) - { - $this->raiseEvent('OnItemDataBound',$this,$param); - } -protected function onItemCommand($param) - { - $this->raiseEvent('OnItemCommand',$this,$param); - } -protected function onEditCommand($param) - { - $this->raiseEvent('OnEditCommand',$this,$param); - } -protected function onDeleteCommand($param) - { - $this->raiseEvent('OnDeleteCommand',$this,$param); - } -protected function onUpdateCommand($param) - { - $this->raiseEvent('OnUpdateCommand',$this,$param); - } -protected function onCancelCommand($param) - { - $this->raiseEvent('OnCancelCommand',$this,$param); - } -public function getHasHeader() - { - return ($this->getShowHeader() && $this->_headerTemplate!==''); - } -public function getHasFooter() - { - return ($this->getShowFooter() && $this->_footerTemplate!==''); - } -public function getHasSeparators() - { - return $this->_separatorTemplate!==''; - } -public function generateItemStyle($itemType,$index) - { - if(($item=$this->getItem($itemType,$index))!==null && $item->getHasStyle()) - return $item->getStyle(); - else - return null; - } -public function renderItem($writer,$repeatInfo,$itemType,$index) - { - $item=$this->getItem($itemType,$index); - if($repeatInfo->getRepeatLayout()==='Table') - $item->renderContents($writer); - else - $item->renderControl($writer); - } -private function getItem($itemType,$index) - { - switch($itemType) - { - case 'Header': return $this->getControls()->itemAt(0); - case 'Footer': return $this->getControls()->itemAt($this->getControls()->getCount()-1); - case 'Item': - case 'AlternatingItem': - case 'SelectedItem': - case 'EditItem': - return $this->getItems()->itemAt($index); - case 'Separator': - $i=$index+$index+1; - if($this->_headerTemplate!=='') - $i++; - return $this->getControls->itemAt($i); - } - return null; - } -private function createItemInternal($itemIndex,$itemType,$dataBind,$dataItem) - { - $item=$this->createItem($itemIndex,$itemType); - $this->initializeItem($item); - $param=new TDataListItemEventParameter($item); - if($dataBind) - { - $item->setDataItem($dataItem); - $this->onItemCreated($param); - $this->getControls()->add($item); - $item->dataBind(); - $this->onItemDataBound($param); - $item->setDataItem(null); - } - else - { - $this->onItemCreated($param); - $this->getControls()->add($item); - } - return $item; - } -protected function createItem($itemIndex,$itemType) - { - return new TDataListItem($itemIndex,$itemType); - } -protected function applyItemStyles() - { - $headerStyle=$this->getViewState('HeaderStyle',null); - $footerStyle=$this->getViewState('FooterStyle',null); - $separatorStyle=$this->getViewState('SeparatorStyle',null); - $itemStyle=$this->getViewState('ItemStyle',null); - $alternatingItemStyle=$this->getViewState('AlternatingItemStyle',null); - if($itemStyle!==null) - { - if($alternatingItemStyle===null) - $alternatingItemStyle=new TTableItemStyle; - $alternatingItemStyle->mergeWith($itemStyle); - } - $selectedItemStyle=$this->getViewState('SelectedItemStyle',null); - if($alternatingItemStyle!==null) - { - if($selectedItemStyle===null) - $selectedItemStyle=new TTableItemStyle; - $selectedItemStyle->mergeWith($alternatingItemStyle); - } - $editItemStyle=$this->getViewState('EditItemStyle',null); - if($selectedItemStyle!==null) - { - if($editItemStyle===null) - $editItemStyle=new TTableItemStyle; - $editItemStyle->mergeWith($selectedItemStyle); - } -foreach($this->getControls() as $control) - { - switch($control->getItemType()) - { - case 'Header': - if($headerStyle) - $control->getStyle()->mergeWith($headerStyle); - break; - case 'Footer': - if($footerStyle) - $control->getStyle()->mergeWith($footerStyle); - break; - case 'Separator': - if($separatorStyle) - $control->getStyle()->mergeWith($separatorStyle); - break; - case 'Item': - if($itemStyle) - $control->getStyle()->mergeWith($itemStyle); - break; - case 'AlternatingItem': - if($alternatingItemStyle) - $control->getStyle()->mergeWith($alternatingItemStyle); - break; - case 'SelectedItem': - if($selectedItemStyle) - $control->getStyle()->mergeWith($selectedItemStyle); - break; - case 'EditItem': - if($editItemStyle) - $control->getStyle()->mergeWith($editItemStyle); - break; - default: - break; - } - } - } -protected function initializeItem($item) - { - $tplContent=''; - switch($item->getItemType()) - { - case 'Header': - $tplContent=$this->_headerTemplate; - break; - case 'Footer': - $tplContent=$this->_footerTemplate; - break; - case 'Item': - $tplContent=$this->_itemTemplate; - break; - case 'AlternatingItem': - if(($tplContent=$this->_alternatingItemTemplate)==='') - $tplContent=$this->_itemTemplate; - break; - case 'Separator': - $tplContent=$this->_separatorTemplate; - break; - case 'SelectedItem': - if(($tplContent=$this->_selectedItemTemplate)==='') - { - if(!($item->getItemIndex()%2) || ($tplContent=$this->_alternatingItemTemplate)==='') - $tplContent=$this->_itemTemplate; - } - break; - case 'EditItem': - if(($tplContent=$this->_editItemTemplate)==='') - { - if($item->getItemIndex()!==$this->getSelectedItemIndex() || ($tplContent=$this->_selectedItemTemplate)==='') - if(!($item->getItemIndex()%2) || ($tplContent=$this->_alternatingItemTemplate)==='') - $tplContent=$this->_itemTemplate; - } - break; - default: - break; - } - if($tplContent!=='') - $this->createTemplate($tplContent)->instantiateIn($item); - } -protected function createTemplate($str) - { - $key=md5($str); - if(isset(self::$_templates[$key])) - return self::$_templates[$key]; - else - { - $contextPath=$this->getTemplateControl()->getTemplate()->getContextPath(); - if(($cache=$this->getApplication()->getCache())!==null) - { - if(($template=$cache->get($key))===null) - { - $template=new TTemplate($str,$contextPath); - $cache->set($key,$template,self::CACHE_EXPIRY); - } - } - else - $template=new TTemplate($str,$contextPath); - self::$_templates[$key]=$template; - return $template; - } - } -protected function onSaveState($param) - { - if($this->_items) - $this->setViewState('ItemCount',$this->_items->getCount(),0); - else - $this->clearViewState('ItemCount'); - } -protected function onLoadState($param) - { - if(!$this->getIsDataBound()) - $this->restoreItemsFromViewState(); - $this->clearViewState('ItemCount'); - } -public function reset() - { - $this->getControls()->clear(); - $this->getItems()->clear(); - $this->_header=null; - $this->_footer=null; - } -protected function restoreItemsFromViewState() - { - $this->reset(); - if(($itemCount=$this->getViewState('ItemCount',0))>0) - { - $items=$this->getItems(); - $selectedIndex=$this->getSelectedItemIndex(); - $editIndex=$this->getEditItemIndex(); - if($this->_headerTemplate!=='') - $this->_header=$this->createItemInternal(-1,'Header',false,null); - $hasSeparator=$this->_separatorTemplate!==''; - for($i=0;$i<$itemCount;++$i) - { - if($hasSeparator && $i>0) - $this->createItemInternal($i-1,'Separator',false,null); - if($i===$editIndex) - $itemType='EditItem'; - else if($i===$selectedIndex) - $itemType='SelectedItem'; - else - $itemType=$i%2?'AlternatingItem':'Item'; - $items->add($this->createItemInternal($i,$itemType,false,null)); - } - if($this->_footerTemplate!=='') - $this->_footer=$this->createItemInternal(-1,'Footer',false,null); - } - $this->clearChildState(); - } -protected function performDataBinding($data) - { - $this->reset(); - $keys=$this->getDataKeys(); - $keys->clear(); - $keyField=$this->getDataKeyField(); - $itemIndex=0; - $items=$this->getItems(); - $hasSeparator=$this->_separatorTemplate!==''; - $selectedIndex=$this->getSelectedItemIndex(); - $editIndex=$this->getEditItemIndex(); - foreach($data as $dataItem) - { - if($keyField!=='') - $keys->add($this->getDataFieldValue($dataItem,$keyField)); - if($itemIndex===0 && $this->_headerTemplate!=='') - $this->_header=$this->createItemInternal(-1,'Header',true,null); - if($hasSeparator && $itemIndex>0) - $this->createItemInternal($itemIndex-1,'Separator',true,null); - if($itemIndex===$editIndex) - $itemType='EditItem'; - else if($itemIndex===$selectedIndex) - $itemType='SelectedItem'; - else - $itemType=$itemIndex%2?'AlternatingItem':'Item'; - $items->add($this->createItemInternal($itemIndex,$itemType,true,$dataItem)); - $itemIndex++; - } - if($itemIndex>0 && $this->_footerTemplate!=='') - $this->_footer=$this->createItemInternal(-1,'Footer',true,null); - $this->setViewState('ItemCount',$itemIndex,0); - } -protected function render($writer) - { - if($this->getHasControls()) - { - $this->applyItemStyles(); - $repeatInfo=$this->getRepeatInfo(); - $repeatInfo->renderRepeater($writer,$this); - } - } -} -class TDataListItemEventParameter extends TEventParameter +public function getItems()
+{
+if(!$this->_items)
+$this->_items=new TDataListItemCollection;
+return $this->_items;
+} +public function getItemCount()
+{
+return $this->_items?$this->_items->getCount():0;
+} +public function getItemTemplate()
+{
+return $this->_itemTemplate;
+} +public function setItemTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_itemTemplate=$value;
+else
+throw new TInvalidDataTypeException('datalist_template_required','ItemTemplate');
+} +public function getItemStyle()
+{
+if(($style=$this->getViewState('ItemStyle',null))===null)
+{
+$style=new TTableItemStyle;
+$this->setViewState('ItemStyle',$style,null);
+}
+return $style;
+} +public function getAlternatingItemTemplate()
+{
+return $this->_alternatingItemTemplate;
+} +public function setAlternatingItemTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_alternatingItemTemplate=$value;
+else
+throw new TInvalidDataTypeException('datalist_template_required','AlternatingItemType');
+} +public function getAlternatingItemStyle()
+{
+if(($style=$this->getViewState('AlternatingItemStyle',null))===null)
+{
+$style=new TTableItemStyle;
+$this->setViewState('AlternatingItemStyle',$style,null);
+}
+return $style;
+} +public function getSelectedItemTemplate()
+{
+return $this->_selectedItemTemplate;
+} +public function setSelectedItemTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_selectedItemTemplate=$value;
+else
+throw new TInvalidDataTypeException('datalist_template_required','SelectedItemTemplate');
+} +public function getSelectedItemStyle()
+{
+if(($style=$this->getViewState('SelectedItemStyle',null))===null)
+{
+$style=new TTableItemStyle;
+$this->setViewState('SelectedItemStyle',$style,null);
+}
+return $style;
+} +public function getEditItemTemplate()
+{
+return $this->_editItemTemplate;
+} +public function setEditItemTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_editItemTemplate=$value;
+else
+throw new TInvalidDataTypeException('datalist_template_required','EditItemTemplate');
+} +public function getEditItemStyle()
+{
+if(($style=$this->getViewState('EditItemStyle',null))===null)
+{
+$style=new TTableItemStyle;
+$this->setViewState('EditItemStyle',$style,null);
+}
+return $style;
+} +public function getHeaderTemplate()
+{
+return $this->_headerTemplate;
+} +public function setHeaderTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_headerTemplate=$value;
+else
+throw new TInvalidDataTypeException('datalist_template_required','HeaderTemplate');
+} +public function getHeaderStyle()
+{
+if(($style=$this->getViewState('HeaderStyle',null))===null)
+{
+$style=new TTableItemStyle;
+$this->setViewState('HeaderStyle',$style,null);
+}
+return $style;
+} +public function getHeader()
+{
+return $this->_header;
+} +public function getFooterTemplate()
+{
+return $this->_footerTemplate;
+} +public function setFooterTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_footerTemplate=$value;
+else
+throw new TInvalidDataTypeException('datalist_template_required','FooterTemplate');
+} +public function getFooterStyle()
+{
+if(($style=$this->getViewState('FooterStyle',null))===null)
+{
+$style=new TTableItemStyle;
+$this->setViewState('FooterStyle',$style,null);
+}
+return $style;
+} +public function getFooter()
+{
+return $this->_footer;
+} +public function getSeparatorTemplate()
+{
+return $this->_separatorTemplate;
+} +public function setSeparatorTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_separatorTemplate=$value;
+else
+throw new TInvalidDataTypeException('datalist_template_required','SeparatorTemplate');
+} +public function getSeparatorStyle()
+{
+if(($style=$this->getViewState('SeparatorStyle',null))===null)
+{
+$style=new TTableItemStyle;
+$this->setViewState('SeparatorStyle',$style,null);
+}
+return $style;
+} +public function getSelectedItemIndex()
+{
+return $this->getViewState('SelectedItemIndex',-1);
+} +public function setSelectedItemIndex($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))<0)
+$value=-1;
+if(($current=$this->getSelectedItemIndex())!==$value)
+{
+$this->setViewState('SelectedItemIndex',$value,-1);
+$items=$this->getItems();
+$itemCount=$items->getCount();
+if($current>=0 && $current<$itemCount)
+{
+$item=$items->itemAt($current);
+if($item->getItemType()!=='EditItem')
+$item->setItemType($current%2?'AlternatingItem':'Item');
+}
+if($value>=0 && $value<$itemCount)
+{
+$item=$items->itemAt($value);
+if($item->getItemType()!=='EditItem')
+$item->setItemType('SelectedItem');
+}
+}
+} +public function getSelectedItem()
+{
+$index=$this->getSelectedItemIndex();
+$items=$this->getItems();
+if($index>=0 && $index<$items->getCount())
+return $items->itemAt($index);
+else
+return null;
+} +public function getSelectedDataKey()
+{
+if($this->getDataKeyField()==='')
+throw new TInvalidOperationException('datalist_datakeyfield_required');
+$index=$this->getSelectedItemIndex();
+$dataKeys=$this->getDataKeys();
+if($index>=0 && $index<$dataKeys->getCount())
+return $dataKeys->itemAt($index);
+else
+return null;
+} +public function getEditItemIndex()
+{
+return $this->getViewState('EditItemIndex',-1);
+} +public function setEditItemIndex($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))<0)
+$value=-1;
+if(($current=$this->getEditItemIndex())!==$value)
+{
+$this->setViewState('EditItemIndex',$value,-1);
+$items=$this->getItems();
+$itemCount=$items->getCount();
+if($current>=0 && $current<$itemCount)
+$items->itemAt($current)->setItemType($current%2?'AlternatingItem':'Item');
+if($value>=0 && $value<$itemCount)
+$items->itemAt($value)->setItemType('EditItem');
+}
+} +public function getEditItem()
+{
+$index=$this->getEditItemIndex();
+$items=$this->getItems();
+if($index>=0 && $index<$items->getCount())
+return $items->itemAt($index);
+else
+return null;
+} +public function getShowHeader()
+{
+return $this->getViewState('ShowHeader',true);
+} +public function setShowHeader($value)
+{
+$this->setViewState('ShowHeader',TPropertyValue::ensureBoolean($value),true);
+} +public function getShowFooter()
+{
+return $this->getViewState('ShowFooter',true);
+} +public function setShowFooter($value)
+{
+$this->setViewState('ShowFooter',TPropertyValue::ensureBoolean($value),true);
+} +protected function getRepeatInfo()
+{
+if(($repeatInfo=$this->getViewState('RepeatInfo',null))===null)
+{
+$repeatInfo=new TRepeatInfo;
+$this->setViewState('RepeatInfo',$repeatInfo,null);
+}
+return $repeatInfo;
+} +public function getCaption()
+{
+return $this->getRepeatInfo()->getCaption();
+} +public function setCaption($value)
+{
+$this->getRepeatInfo()->setCaption($value);
+} +public function getCaptionAlign()
+{
+return $this->getRepeatInfo()->getCaptionAlign();
+} +public function setCaptionAlign($value)
+{
+$this->getRepeatInfo()->setCaptionAlign($value);
+} +public function getRepeatColumns()
+{
+return $this->getRepeatInfo()->getRepeatColumns();
+} +public function setRepeatColumns($value)
+{
+$this->getRepeatInfo()->setRepeatColumns($value);
+} +public function getRepeatDirection()
+{
+return $this->getRepeatInfo()->getRepeatDirection();
+} +public function setRepeatDirection($value)
+{
+$this->getRepeatInfo()->setRepeatDirection($value);
+} +public function getRepeatLayout()
+{
+return $this->getRepeatInfo()->getRepeatLayout();
+} +public function setRepeatLayout($value)
+{
+$this->getRepeatInfo()->setRepeatLayout($value);
+} +public function onBubbleEvent($sender,$param)
+{
+if($param instanceof TDataListCommandEventParameter)
+{
+$this->onItemCommand($param);
+$command=$param->getCommandName();
+if(strcasecmp($command,'select')===0)
+{
+$this->setSelectedItemIndex($param->getItem()->getItemIndex());
+$this->onSelectedIndexChanged(null);
+return true;
+}
+else if(strcasecmp($command,'edit')===0)
+{
+$this->onEditCommand($param);
+return true;
+}
+else if(strcasecmp($command,'delete')===0)
+{
+$this->onDeleteCommand($param);
+return true;
+}
+else if(strcasecmp($command,'update')===0)
+{
+$this->onUpdateCommand($param);
+return true;
+}
+else if(strcasecmp($command,'cancel')===0)
+{
+$this->onCancelCommand($param);
+return true;
+}
+}
+return false;
+} +public function onItemCreated($param)
+{
+$this->raiseEvent('OnItemCreated',$this,$param);
+} +public function onItemDataBound($param)
+{
+$this->raiseEvent('OnItemDataBound',$this,$param);
+} +public function onItemCommand($param)
+{
+$this->raiseEvent('OnItemCommand',$this,$param);
+} +public function onEditCommand($param)
+{
+$this->raiseEvent('OnEditCommand',$this,$param);
+} +public function onDeleteCommand($param)
+{
+$this->raiseEvent('OnDeleteCommand',$this,$param);
+} +public function onUpdateCommand($param)
+{
+$this->raiseEvent('OnUpdateCommand',$this,$param);
+} +public function onCancelCommand($param)
+{
+$this->raiseEvent('OnCancelCommand',$this,$param);
+} +public function getHasHeader()
+{
+return ($this->getShowHeader() && $this->_headerTemplate!==null);
+} +public function getHasFooter()
+{
+return ($this->getShowFooter() && $this->_footerTemplate!==null);
+} +public function getHasSeparators()
+{
+return $this->_separatorTemplate!==null;
+} +public function generateItemStyle($itemType,$index)
+{
+if(($item=$this->getItem($itemType,$index))!==null && $item->getHasStyle())
+return $item->getStyle();
+else
+return null;
+} +public function renderItem($writer,$repeatInfo,$itemType,$index)
+{
+$item=$this->getItem($itemType,$index);
+if($repeatInfo->getRepeatLayout()==='Table')
+$item->renderContents($writer);
+else
+$item->renderControl($writer);
+} +private function getItem($itemType,$index)
+{
+switch($itemType)
+{
+case 'Header': return $this->getControls()->itemAt(0);
+case 'Footer': return $this->getControls()->itemAt($this->getControls()->getCount()-1);
+case 'Item':
+case 'AlternatingItem':
+case 'SelectedItem':
+case 'EditItem':
+return $this->getItems()->itemAt($index);
+case 'Separator':
+$i=$index+$index+1;
+if($this->_headerTemplate!==null)
+$i++;
+return $this->getControls()->itemAt($i);
+}
+return null;
+} +private function createItemInternal($itemIndex,$itemType,$dataBind,$dataItem)
+{
+$item=$this->createItem($itemIndex,$itemType);
+$this->initializeItem($item);
+$param=new TDataListItemEventParameter($item);
+if($dataBind)
+{
+$item->setDataItem($dataItem);
+$this->onItemCreated($param);
+$this->getControls()->add($item);
+$item->dataBind();
+$this->onItemDataBound($param);
+$item->setDataItem(null);
+}
+else
+{
+$this->onItemCreated($param);
+$this->getControls()->add($item);
+}
+return $item;
+} +protected function createItem($itemIndex,$itemType)
+{
+return new TDataListItem($itemIndex,$itemType);
+} +protected function applyItemStyles()
+{
+$itemStyle=$this->getViewState('ItemStyle',null); +$alternatingItemStyle=new TTableItemStyle($itemStyle);
+if(($style=$this->getViewState('AlternatingItemStyle',null))!==null)
+$alternatingItemStyle->mergeWith($style); +$selectedItemStyle=$this->getViewState('SelectedItemStyle',null); +$editItemStyle=new TTableItemStyle($selectedItemStyle);
+if(($style=$this->getViewState('EditItemStyle',null))!==null)
+$editItemStyle->copyFrom($style); +$headerStyle=$this->getViewState('HeaderStyle',null);
+$footerStyle=$this->getViewState('FooterStyle',null);
+$pagerStyle=$this->getViewState('PagerStyle',null);
+$separatorStyle=$this->getViewState('SeparatorStyle',null); +foreach($this->getControls() as $index=>$item)
+{
+switch($item->getItemType())
+{
+case 'Header':
+if($headerStyle)
+$item->getStyle()->mergeWith($headerStyle);
+break;
+case 'Footer':
+if($footerStyle)
+$item->getStyle()->mergeWith($footerStyle);
+break;
+case 'Separator':
+if($separatorStyle)
+$item->getStyle()->mergeWith($separatorStyle);
+break;
+case 'Item':
+if($itemStyle)
+$item->getStyle()->mergeWith($itemStyle);
+break;
+case 'AlternatingItem':
+if($alternatingItemStyle)
+$item->getStyle()->mergeWith($alternatingItemStyle);
+break;
+case 'SelectedItem':
+if($index % 2==1)
+{
+if($itemStyle)
+$item->getStyle()->mergeWith($itemStyle);
+}
+else
+{
+if($alternatingItemStyle)
+$item->getStyle()->mergeWith($alternatingItemStyle);
+}
+if($selectedItemStyle)
+$item->getStyle()->mergeWith($selectedItemStyle);
+break;
+case 'EditItem':
+if($index % 2==1)
+{
+if($itemStyle)
+$item->getStyle()->mergeWith($itemStyle);
+}
+else
+{
+if($alternatingItemStyle)
+$item->getStyle()->mergeWith($alternatingItemStyle);
+}
+if($editItemStyle)
+$item->getStyle()->mergeWith($editItemStyle);
+break;
+default:
+break;
+}
+}
+} +protected function initializeItem($item)
+{
+$template=null;
+switch($item->getItemType())
+{
+case 'Header':
+$template=$this->_headerTemplate;
+break;
+case 'Footer':
+$template=$this->_footerTemplate;
+break;
+case 'Item':
+$template=$this->_itemTemplate;
+break;
+case 'AlternatingItem':
+if(($template=$this->_alternatingItemTemplate)===null)
+$template=$this->_itemTemplate;
+break;
+case 'Separator':
+$template=$this->_separatorTemplate;
+break;
+case 'SelectedItem':
+if(($template=$this->_selectedItemTemplate)===null)
+{
+if(!($item->getItemIndex()%2) || ($template=$this->_alternatingItemTemplate)===null)
+$template=$this->_itemTemplate;
+}
+break;
+case 'EditItem':
+if(($template=$this->_editItemTemplate)===null)
+{
+if($item->getItemIndex()!==$this->getSelectedItemIndex() || ($template=$this->_selectedItemTemplate)===null)
+if(!($item->getItemIndex()%2) || ($template=$this->_alternatingItemTemplate)===null)
+$template=$this->_itemTemplate;
+}
+break;
+default:
+break;
+}
+if($template!==null)
+$template->instantiateIn($item);
+} +public function saveState()
+{
+parent::saveState();
+if($this->_items)
+$this->setViewState('ItemCount',$this->_items->getCount(),0);
+else
+$this->clearViewState('ItemCount');
+} +public function loadState()
+{
+parent::loadState();
+if(!$this->getIsDataBound())
+$this->restoreItemsFromViewState();
+$this->clearViewState('ItemCount');
+} +public function reset()
+{
+$this->getControls()->clear();
+$this->getItems()->clear();
+$this->_header=null;
+$this->_footer=null;
+} +protected function restoreItemsFromViewState()
+{
+$this->reset();
+if(($itemCount=$this->getViewState('ItemCount',0))>0)
+{
+$items=$this->getItems();
+$selectedIndex=$this->getSelectedItemIndex();
+$editIndex=$this->getEditItemIndex();
+if($this->_headerTemplate!==null)
+$this->_header=$this->createItemInternal(-1,'Header',false,null);
+$hasSeparator=$this->_separatorTemplate!==null;
+for($i=0;$i<$itemCount;++$i)
+{
+if($hasSeparator && $i>0)
+$this->createItemInternal($i-1,'Separator',false,null);
+if($i===$editIndex)
+$itemType='EditItem';
+else if($i===$selectedIndex)
+$itemType='SelectedItem';
+else
+$itemType=$i%2?'AlternatingItem':'Item';
+$items->add($this->createItemInternal($i,$itemType,false,null));
+}
+if($this->_footerTemplate!==null)
+$this->_footer=$this->createItemInternal(-1,'Footer',false,null);
+}
+$this->clearChildState();
+} +protected function performDataBinding($data)
+{
+$this->reset();
+$keys=$this->getDataKeys();
+$keys->clear();
+$keyField=$this->getDataKeyField();
+$itemIndex=0;
+$items=$this->getItems();
+$hasSeparator=$this->_separatorTemplate!==null;
+$selectedIndex=$this->getSelectedItemIndex();
+$editIndex=$this->getEditItemIndex();
+foreach($data as $dataItem)
+{
+if($keyField!=='')
+$keys->add($this->getDataFieldValue($dataItem,$keyField));
+if($itemIndex===0 && $this->_headerTemplate!==null)
+$this->_header=$this->createItemInternal(-1,'Header',true,null);
+if($hasSeparator && $itemIndex>0)
+$this->createItemInternal($itemIndex-1,'Separator',true,null);
+if($itemIndex===$editIndex)
+$itemType='EditItem';
+else if($itemIndex===$selectedIndex)
+$itemType='SelectedItem';
+else
+$itemType=$itemIndex%2?'AlternatingItem':'Item';
+$items->add($this->createItemInternal($itemIndex,$itemType,true,$dataItem));
+$itemIndex++;
+}
+if($itemIndex>0 && $this->_footerTemplate!==null)
+$this->_footer=$this->createItemInternal(-1,'Footer',true,null);
+$this->setViewState('ItemCount',$itemIndex,0);
+} +protected function render($writer)
+{
+if($this->getHasControls())
+{
+$this->applyItemStyles();
+$repeatInfo=$this->getRepeatInfo();
+$repeatInfo->renderRepeater($writer,$this);
+}
+}
+} +class TDataListItemEventParameter extends TEventParameter
{ private $_item=null; -public function __construct(TDataListItem $item) - { - $this->_item=$item; - } -public function getItem() - { - return $this->_item; - } +public function __construct(TDataListItem $item)
+{
+$this->_item=$item;
+} +public function getItem()
+{
+return $this->_item;
+}
} -class TDataListCommandEventParameter extends TCommandEventParameter +class TDataListCommandEventParameter extends TCommandEventParameter
{ private $_item=null; private $_source=null; -public function __construct($item,$source,TCommandEventParameter $param) - { - $this->_item=$item; - $this->_source=$source; - parent::__construct($param->getCommandName(),$param->getCommandParameter()); - } -public function getItem() - { - return $this->_item; - } -public function getCommandSource() - { - return $this->_source; - } -} -class TDataListItem extends TWebControl implements INamingContainer +public function __construct($item,$source,TCommandEventParameter $param)
+{
+$this->_item=$item;
+$this->_source=$source;
+parent::__construct($param->getCommandName(),$param->getCommandParameter());
+} +public function getItem()
+{
+return $this->_item;
+} +public function getCommandSource()
+{
+return $this->_source;
+}
+} +class TDataListItem extends TWebControl implements INamingContainer
{ private $_itemIndex=''; private $_itemType=''; private $_dataItem=null; -public function __construct($itemIndex,$itemType) - { - $this->_itemIndex=$itemIndex; - $this->setItemType($itemType); - } -protected function createStyle() - { - return new TTableItemStyle; - } -public function getItemType() - { - return $this->_itemType; - } -public function setItemType($value) - { - $this->_itemType=TPropertyValue::ensureEnum($value,'Header','Footer','Item','AlternatingItem','SelectedItem','EditItem','Separator','Pager'); - } -public function getItemIndex() - { - return $this->_itemIndex; - } -public function getDataItem() - { - return $this->_dataItem; - } -public function setDataItem($value) - { - $this->_dataItem=$value; - } -protected function onBubbleEvent($sender,$param) - { - if($param instanceof TCommandEventParameter) - { - $this->raiseBubbleEvent($this,new TDataListCommandEventParameter($this,$sender,$param)); - return true; - } - else - return false; - } -} -class TDataListItemCollection extends TList -{ -protected function canAddItem($item) - { - return ($item instanceof TDataListItem); - } -} -?><?php -class TPagedDataSource extends TComponent implements IteratorAggregate -{ -private $_dataSource=null; -private $_pageSize=10; -private $_currentPageIndex=0; -private $_allowPaging=false; -private $_allowCustomPaging=false; -private $_virtualCount=0; -public function getDataSource() - { - return $this->_dataSource; - } -public function setDataSource($value) - { - if(!($value instanceof TMap) && !($value instanceof TList)) - { - if(is_array($value)) - $value=new TMap($value); - else if($value instanceof Traversable) - $value=new TList($value); - else if($value!==null) - throw new TInvalidDataTypeException('pageddatasource_datasource_invalid'); - } - $this->_dataSource=$value; - } -public function getPageSize() - { - return $this->_pageSize; - } -public function setPageSize($value) - { - if(($value=TPropertyValue::ensureInteger($value))>0) - $this->_pageSize=$value; - else - throw new TInvalidDataValueException('pageddatasource_pagesize_invalid'); - } -public function getCurrentPageIndex() - { - return $this->_currentPageIndex; - } -public function setCurrentPageIndex($value) - { - if(($value=TPropertyValue::ensureInteger($value))<0) - $value=0; - $this->_currentPageIndex=$value; - } -public function getAllowPaging() - { - return $this->_allowPaging; - } -public function setAllowPaging($value) - { - $this->_allowPaging=TPropertyValue::ensureBoolean($value); - } -public function getAllowCustomPaging() - { - return $this->_allowCustomPaging; - } -public function setAllowCustomPaging($value) - { - $this->_allowCustomPaging=TPropertyValue::ensureBoolean($value); - } -public function getVirtualCount() - { - return $this->_virtualCount; - } -public function setVirtualCount($value) - { - if(($value=TPropertyValue::ensureInteger($value))>=0) - $this->_virtualCount=$value; - else - throw new TInvalidDataValueException('pageddatasource_virtualcount_invalid'); - } -public function getCount() - { - if($this->_dataSource===null) - return 0; - if(!$this->_allowPaging) - return $this->getDataSourceCount(); - if(!$this->_allowCustomPaging && $this->getIsLastPage()) - return $this->getDataSourceCount()-$this->getFirstIndexInPage(); - return $this->_pageSize; - } -public function getPageCount() - { - if($this->_dataSource===null) - return 0; - $count=$this->getDataSourceCount(); - if(!$this->_allowPaging || $count<=0) - return 1; - return (int)(($count+$this->_pageSize-1)/$this->_pageSize); - } -public function getIsFirstPage() - { - if($this->_allowPaging) - return $this->_currentPageIndex===0; - else - return true; - } -public function getIsLastPage() - { - if($this->_allowPaging) - return $this->_currentPageIndex===$this->getPageCount()-1; - else - return true; - } -public function getFirstIndexInPage() - { - if($this->_dataSource!==null && $this->_allowPaging && !$this->_allowCustomPaging) - return $this->_currentPageIndex*$this->_pageSize; - else - return 0; - } -public function getDataSourceCount() - { - if($this->_dataSource===null) - return 0; - else if($this->_allowCustomPaging) - return $this->_virtualCount; - else - return $this->_dataSource->getCount(); - } -public function getIterator() - { - if($this->_dataSource instanceof TList) - return new TPagedListIterator($this->_dataSource,$this->getFirstIndexInPage(),$this->getCount()); - else if($this->_dataSource instanceof TMap) - return new TPagedMapIterator($this->_dataSource,$this->getFirstIndexInPage(),$this->getCount()); - else - return null; - } -} -class TPagedListIterator implements Iterator -{ - private $_list; - private $_startIndex; - private $_count; - private $_index; -public function __construct(TList $list,$startIndex,$count) - { - $this->_list=$list; - $this->_index=0; - $this->_startIndex=$startIndex; - if($startIndex+$count>$list->getCount()) - $this->_count=$list->getCount()-$startIndex; - else - $this->_count=$count; - } -public function rewind() - { - $this->_index=0; - } -public function key() - { - return $this->_index; - } -public function current() - { - return $this->_list->itemAt($this->_startIndex+$this->_index); - } -public function next() - { - $this->_index++; - } -public function valid() - { - return $this->_index<$this->_count; - } -} -class TPagedMapIterator implements Iterator -{ - private $_map; - private $_startIndex; - private $_count; - private $_index; - private $_iterator; -public function __construct(TMap $map,$startIndex,$count) - { - $this->_map=$map; - $this->_index=0; - $this->_startIndex=$startIndex; - if($startIndex+$count>$map->getCount()) - $this->_count=$map->getCount()-$startIndex; - else - $this->_count=$count; - $this->_iterator=$map->getIterator(); - } -public function rewind() - { - $this->_iterator->rewind(); - for($i=0;$i<$this->_startIndex;++$i) - $this->_iterator->next(); - $this->_index=0; - } -public function key() - { - return $this->_iterator->key(); - } -public function current() - { - return $this->_iterator->current(); - } -public function next() - { - $this->_index++; - $this->_iterator->next(); - } -public function valid() - { - return $this->_index<$this->_count; - } -} -?><?php -class TDummyDataSource extends TComponent implements IteratorAggregate -{ - private $_count; -public function __construct($count) - { - $this->_count=$count; - } -public function getCount() - { - return $this->_count; - } -public function getIterator() - { - return new TDummyDataSourceIterator($this->_count); - } -} -class TDummyDataSourceIterator implements Iterator -{ - private $_index; - private $_count; -public function __construct($count) - { - $this->_count=$count; - $this->_index=0; - } -public function rewind() - { - $this->_index=0; - } -public function key() - { - return $this->_index; - } -public function current() - { - return null; - } -public function next() - { - $this->_index++; - } -public function valid() - { - return $this->_index<$this->_count; - } -} -?><?php - - - +public function __construct($itemIndex,$itemType)
+{
+$this->_itemIndex=$itemIndex;
+$this->setItemType($itemType);
+} +protected function createStyle()
+{
+return new TTableItemStyle;
+} +public function getItemType()
+{
+return $this->_itemType;
+} +public function setItemType($value)
+{
+$this->_itemType=TPropertyValue::ensureEnum($value,'Header','Footer','Item','AlternatingItem','SelectedItem','EditItem','Separator','Pager');
+} +public function getItemIndex()
+{
+return $this->_itemIndex;
+} +public function getDataItem()
+{
+return $this->_dataItem;
+} +public function setDataItem($value)
+{
+$this->_dataItem=$value;
+} +public function onBubbleEvent($sender,$param)
+{
+if($param instanceof TCommandEventParameter)
+{
+$this->raiseBubbleEvent($this,new TDataListCommandEventParameter($this,$sender,$param));
+return true;
+}
+else
+return false;
+}
+} +class TDataListItemCollection extends TList
+{ +public function insertAt($index,$item)
+{
+if($item instanceof TDataListItem)
+parent::insertAt($index,$item);
+else
+throw new TInvalidDataTypeException('datalistitemcollection_datalistitem_required');
+}
+} -class TDataGrid extends TBaseDataList -{ - private $_columns=null; - private $_autoColumns=null; - private $_items=null; - private $_header=null; - private $_footer=null; - private $_pager=null; - private $_pagedDataSource=null; -protected function getTagName() - { - return 'table'; - } -public function addParsedObject($object) - { - if($object instanceof TDataGridColumn) - $this->getColumns()->add($object); - } -public function getColumns() - { - if(!$this->_columns) - $this->_columns=new TDataGridColumnCollection; - return $this->_columns; - } -public function getAutoColumns() - { - if(!$this->_autoColumns) - $this->_autoColumns=new TDataGridColumnCollection; - return $this->_autoColumns; - } -public function getItems() - { - if(!$this->_items) - $this->_items=new TDataGridItemCollection; - return $this->_items; - } -protected function createStyle() - { - $style=new TTableStyle; - $style->setGridLines('Both'); - $style->setCellSpacing(0); - return $style; - } -public function getBackImageUrl() - { - return $this->getStyle()->getBackImageUrl(); - } -public function setBackImageUrl($value) - { - $this->getStyle()->setBackImageUrl($value); - } -public function getAlternatingItemStyle() - { - if(($style=$this->getViewState('AlternatingItemStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('AlternatingItemStyle',$style,null); - } - return $style; - } -public function getItemStyle() - { - if(($style=$this->getViewState('ItemStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('ItemStyle',$style,null); - } - return $style; - } -public function getSelectedItemStyle() - { - if(($style=$this->getViewState('SelectedItemStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('SelectedItemStyle',$style,null); - } - return $style; - } -public function getEditItemStyle() - { - if(($style=$this->getViewState('EditItemStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('EditItemStyle',$style,null); - } - return $style; - } -public function getHeaderStyle() - { - if(($style=$this->getViewState('HeaderStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('HeaderStyle',$style,null); - } - return $style; - } -public function getHeader() - { - return $this->_header; - } -public function getFooterStyle() - { - if(($style=$this->getViewState('FooterStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('FooterStyle',$style,null); - } - return $style; - } -public function getFooter() - { - return $this->_footer; - } -public function getPagerStyle() - { - if(($style=$this->getViewState('PagerStyle',null))===null) - { - $style=new TDataGridPagerStyle; - $this->setViewState('PagerStyle',$style,null); - } - return $style; - } -public function getPager() - { - return $this->_pager; - } -public function getSelectedItem() - { - $index=$this->getSelectedItemIndex(); - $items=$this->getItems(); - if($index>=0 && $index<$items->getCount()) - return $items->itemAt($index); - else - return null; - } -public function getSelectedItemIndex() - { - return $this->getViewState('SelectedItemIndex',-1); - } -public function setSelectedItemIndex($value) - { - if(($value=TPropertyValue::ensureInteger($value))<0) - $value=-1; - if(($current=$this->getSelectedItemIndex())!==$value) - { - $this->setViewState('SelectedItemIndex',$value,-1); - $items=$this->getItems(); - $itemCount=$items->getCount(); - if($current>=0 && $current<$itemCount) - { - $item=$items->itemAt($current); - if($item->getItemType()!=='EditItem') - $item->setItemType($current%2?'AlternatingItem':'Item'); - } - if($value>=0 && $value<$itemCount) - { - $item=$items->itemAt($value); - if($item->getItemType()!=='EditItem') - $item->setItemType('SelectedItem'); - } - } - } -public function getEditItem() - { - $index=$this->getEditItemIndex(); - $items=$this->getItems(); - if($index>=0 && $index<$items->getCount()) - return $items->itemAt($index); - else - return null; - } -public function getEditItemIndex() - { - return $this->getViewState('EditItemIndex',-1); - } -public function setEditItemIndex($value) - { - if(($value=TPropertyValue::ensureInteger($value))<0) - $value=-1; - if(($current=$this->getEditItemIndex())!==$value) - { - $this->setViewState('EditItemIndex',$value,-1); - $items=$this->getItems(); - $itemCount=$items->getCount(); - if($current>=0 && $current<$itemCount) - $items->itemAt($current)->setItemType($current%2?'AlternatingItem':'Item'); - if($value>=0 && $value<$itemCount) - $items->itemAt($value)->setItemType('EditItem'); - } - } -public function getAllowCustomPaging() - { - return $this->getViewState('AllowCustomPaging',false); - } -public function setAllowCustomPaging($value) - { - $this->setViewState('AllowCustomPaging',TPropertyValue::ensureBoolean($value),false); - } -public function getAllowPaging() - { - return $this->getViewState('AllowPaging',false); - } -public function setAllowPaging($value) - { - $this->setViewState('AllowPaging',TPropertyValue::ensureBoolean($value),false); - } -public function getAllowSorting() - { - return $this->getViewState('AllowSorting',false); - } -public function setAllowSorting($value) - { - $this->setViewState('AllowSorting',TPropertyValue::ensureBoolean($value),false); - } -public function getAutoGenerateColumns() - { - return $this->getViewState('AutoGenerateColumns',false); - } -public function setAutoGenerateColumns($value) - { - $this->setViewState('AutoGenerateColumns',TPropertyValue::ensureBoolean($value),false); - } -public function getCurrentPageIndex() - { - return $this->getViewState('CurrentPageIndex',0); - } -public function setCurrentPageIndex($value) - { - if(($value=TPropertyValue::ensureInteger($value))<0) - throw new TInvalidDataValueException('datagrid_currentpageindex_invalid'); - $this->setViewState('CurrentPageIndex',$value,0); - } -public function getPageSize() - { - return $this->getViewState('PageSize',10); - } -public function setPageSize($value) - { - if(($value=TPropertyValue::ensureInteger($value))<1) - throw new TInvalidDataValueException('datagrid_pagesize_invalid'); - $this->setViewState('PageSize',TPropertyValue::ensureInteger($value),10); - } -public function getPageCount() - { - if($this->_pagedDataSource) - return $this->_pagedDataSource->getPageCount(); - return $this->getViewState('PageCount',0); - } -public function getVirtualCount() - { - return $this->getViewState('VirtualCount',0); - } -public function setVirtualCount($value) - { - if(($value=TPropertyValue::ensureInteger($value))<0) - throw new TInvalidDataValueException('datagrid_virtualcount_invalid'); - $this->setViewState('VirtualCount',$value,0); - } -public function getShowHeader() - { - return $this->getViewState('ShowHeader',true); - } -public function setShowHeader($value) - { - $this->setViewState('ShowHeader',TPropertyValue::ensureBoolean($value),true); - } -public function getShowFooter() - { - return $this->getViewState('ShowFooter',false); - } -public function setShowFooter($value) - { - $this->setViewState('ShowFooter',TPropertyValue::ensureBoolean($value),false); - } -protected function onBubbleEvent($sender,$param) - { - if($param instanceof TDataGridCommandEventParameter) - { - $this->onItemCommand($param); - $command=$param->getCommandName(); - if(strcasecmp($command,'select')===0) - { - $this->setSelectedIndex($param->getItem()->getItemIndex()); - $this->onSelectedIndexChanged(null); - return true; - } - else if(strcasecmp($command,'edit')===0) - { - $this->onEditCommand($param); - return true; - } - else if(strcasecmp($command,'delete')===0) - { - $this->onDeleteCommand($param); - return true; - } - else if(strcasecmp($command,'update')===0) - { - $this->onUpdateCommand($param); - return true; - } - else if(strcasecmp($command,'cancel')===0) - { - $this->onCancelCommand($param); - return true; - } - else if(strcasecmp($command,'sort')===0) - { - $this->onSortCommand(new TDataGridSortCommandEventParameter($sender,$param->getCommandParameter())); - return true; - } - else if(strcasecmp($command,'page')===0) - { - $p=$param->getCommandParameter(); - if(strcasecmp($p,'next')) - $pageIndex=$this->getCurrentPageIndex()+1; - else if(strcasecmp($p,'prev')) - $pageIndex=$this->getCurrentPageIndex()-1; - else - $pageIndex=TPropertyValue::ensureInteger($p)-1; - $this->onPageIndexChanged(new TDataGridPageChangedEventParameter($sender,$pageIndex)); - return true; - } - } - return false; - } -public function onCancelCommand($param) - { - $this->raiseEvent('OnCancelCommand',$this,$param); - } -public function onDeleteCommand($param) - { - $this->raiseEvent('OnDeleteCommand',$this,$param); - } -public function onEditCommand($param) - { - $this->raiseEvent('OnEditCommand',$this,$param); - } -public function onItemCommand($param) - { - $this->raiseEvent('OnItemCommand',$this,$param); - } -public function onSortCommand($param) - { - $this->raiseEvent('OnSortCommand',$this,$param); - } -public function onUpdateCommand($param) - { - $this->raiseEvent('OnUpdateCommand',$this,$param); - } -public function onItemCreated($param) - { - $this->raiseEvent('OnItemCreated',$this,$param); - } -public function onItemDataBound($param) - { - $this->raiseEvent('OnItemDataBound',$this,$param); - } -public function onPageIndexChanged($param) - { - $this->raiseEvent('OnPageIndexChanged',$this,$param); - } -protected function onSaveState($param) - { - if($this->_items) - $this->setViewState('ItemCount',$this->_items->getCount(),0); - else - $this->clearViewState('ItemCount'); - if($this->_autoColumns) - { - $state=array(); - foreach($this->_autoColumns as $column) - $state[]=$column->saveState(); - $this->setViewState('ColumnState',$state,array()); - } - else - $this->clearViewState('ColumnState'); - } -protected function onLoadState($param) - { - if(!$this->getIsDataBound()) - { - $state=$this->getViewState('ColumnState',array()); - $columns=$this->getAutoColumns(); - foreach($state as $st) - { - $column=new TBoundColumn; - $column->loadState($st); - $columns->add($column); - } - $this->restoreGridFromViewState(); - } - $this->clearViewState('ItemCount'); - } -private function createPagedDataSource() - { - $ds=new TPagedDataSource; - $ds->setCurrentPageIndex($this->getCurrentPageIndex()); - $ds->setPageSize($this->getPageSize()); - $ds->setAllowPaging($this->getAllowPaging()); - $ds->setAllowCustomPaging($this->getAllowCustomPaging()); - $ds->setVirtualCount($this->getVirtualCount()); - return $ds; - } -public function reset() - { - $this->getControls()->clear(); - $this->getItems()->clear(); - $this->_header=null; - $this->_footer=null; - } -protected function restoreGridFromViewState() - { - $this->reset(); - if(($itemCount=$this->getViewState('ItemCount',0))<=0) - return; - $this->_pagedDataSource=$ds=$this->createPagedDataSource(); - if($ds->getAllowCustomPaging()) - $ds->setDataSource(new TDummyDataSource($itemCount)); - else - $ds->setDataSource(new TDummyDataSource($this->getViewState('DataSourceCount',0))); -$columns=new TList($this->getColumns()); - $columns->mergeWith($this->_autoColumns); -if($columns->getCount()>0) - { - foreach($columns as $column) - $column->initialize(); - if($allowPaging) - $this->createPager(-1,-1,$columnCount,$ds); - $this->createItemInternal(-1,-1,'Header',false,null,$columns); - $selectedIndex=$this->getSelectedItemIndex(); - $editIndex=$this->getEditItemIndex(); - $index=0; - $dsIndex=$ds->getAllowPaging()?$ds->getFirstIndexInPage():0; - foreach($ds as $data) - { - if($index===$editIndex) - $itemType='EditItem'; - else if($index===$selectedIndex) - $itemType='SelectedItem'; - else if($index % 2) - $itemType='AlternatingItem'; - else - $itemType='Item'; - $items->add($this->createItemInternal($index,$dsIndex,$itemType,false,null,$columns)); - $index++; - $dsIndex++; - } - $this->createItemInternal(-1,-1,'Footer',false,null,$columns); - if($allowPaging) - $this->createPager(-1,-1,$columnCount,$ds); - } - $this->_pagedDataSource=null; - } -protected function performDataBinding($data) - { - $this->reset(); - $keys=$this->getDataKeys(); - $keys->clear(); - $keyField=$this->getDataKeyField(); - $this->_pagedDataSource=$ds=$this->createPagedDataSource(); - $ds->setDataSource($data); - $allowPaging=$ds->getAllowPaging(); - if($allowPaging && $ds->getCurrentPageIndex()>=$ds->getPageCount()) - throw new TInvalidDataValueException('datagrid_currentpageindex_invalid'); - $columns=new TList($this->getColumns()); - $autoColumns=$this->createAutoColumns($ds); - $columns->mergeWith($autoColumns); +class TDataGrid extends TBaseDataList
+{
+private $_columns=null;
+private $_autoColumns=null;
+private $_items=null;
+private $_header=null;
+private $_footer=null;
+private $_pager=null;
+private $_pagedDataSource=null; +protected function getTagName()
+{
+return 'table';
+} +public function addParsedObject($object)
+{
+if($object instanceof TDataGridColumn)
+$this->getColumns()->add($object);
+} +public function getColumns()
+{
+if(!$this->_columns)
+$this->_columns=new TDataGridColumnCollection;
+return $this->_columns;
+} +public function getAutoColumns()
+{
+if(!$this->_autoColumns)
+$this->_autoColumns=new TDataGridColumnCollection;
+return $this->_autoColumns;
+} +public function getItems()
+{
+if(!$this->_items)
+$this->_items=new TDataGridItemCollection;
+return $this->_items;
+} +protected function createStyle()
+{
+$style=new TTableStyle;
+$style->setGridLines('Both');
+$style->setCellSpacing(0);
+return $style;
+} +public function getBackImageUrl()
+{
+return $this->getStyle()->getBackImageUrl();
+} +public function setBackImageUrl($value)
+{
+$this->getStyle()->setBackImageUrl($value);
+} +public function getAlternatingItemStyle()
+{
+if(($style=$this->getViewState('AlternatingItemStyle',null))===null)
+{
+$style=new TTableItemStyle;
+$this->setViewState('AlternatingItemStyle',$style,null);
+}
+return $style;
+} +public function getItemStyle()
+{
+if(($style=$this->getViewState('ItemStyle',null))===null)
+{
+$style=new TTableItemStyle;
+$this->setViewState('ItemStyle',$style,null);
+}
+return $style;
+} +public function getSelectedItemStyle()
+{
+if(($style=$this->getViewState('SelectedItemStyle',null))===null)
+{
+$style=new TTableItemStyle;
+$this->setViewState('SelectedItemStyle',$style,null);
+}
+return $style;
+} +public function getEditItemStyle()
+{
+if(($style=$this->getViewState('EditItemStyle',null))===null)
+{
+$style=new TTableItemStyle;
+$this->setViewState('EditItemStyle',$style,null);
+}
+return $style;
+} +public function getHeaderStyle()
+{
+if(($style=$this->getViewState('HeaderStyle',null))===null)
+{
+$style=new TTableItemStyle;
+$this->setViewState('HeaderStyle',$style,null);
+}
+return $style;
+} +public function getHeader()
+{
+return $this->_header;
+} +public function getFooterStyle()
+{
+if(($style=$this->getViewState('FooterStyle',null))===null)
+{
+$style=new TTableItemStyle;
+$this->setViewState('FooterStyle',$style,null);
+}
+return $style;
+} +public function getFooter()
+{
+return $this->_footer;
+} +public function getPagerStyle()
+{
+if(($style=$this->getViewState('PagerStyle',null))===null)
+{
+$style=new TDataGridPagerStyle;
+$this->setViewState('PagerStyle',$style,null);
+}
+return $style;
+} +public function getPager()
+{
+return $this->_pager;
+} +public function getSelectedItem()
+{
+$index=$this->getSelectedItemIndex();
+$items=$this->getItems();
+if($index>=0 && $index<$items->getCount())
+return $items->itemAt($index);
+else
+return null;
+} +public function getSelectedItemIndex()
+{
+return $this->getViewState('SelectedItemIndex',-1);
+} +public function setSelectedItemIndex($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))<0)
+$value=-1;
+if(($current=$this->getSelectedItemIndex())!==$value)
+{
+$this->setViewState('SelectedItemIndex',$value,-1);
+$items=$this->getItems();
+$itemCount=$items->getCount();
+if($current>=0 && $current<$itemCount)
+{
+$item=$items->itemAt($current);
+if($item->getItemType()!=='EditItem')
+$item->setItemType($current%2?'AlternatingItem':'Item');
+}
+if($value>=0 && $value<$itemCount)
+{
+$item=$items->itemAt($value);
+if($item->getItemType()!=='EditItem')
+$item->setItemType('SelectedItem');
+}
+}
+} +public function getEditItem()
+{
+$index=$this->getEditItemIndex();
+$items=$this->getItems();
+if($index>=0 && $index<$items->getCount())
+return $items->itemAt($index);
+else
+return null;
+} +public function getEditItemIndex()
+{
+return $this->getViewState('EditItemIndex',-1);
+} +public function setEditItemIndex($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))<0)
+$value=-1;
+if(($current=$this->getEditItemIndex())!==$value)
+{
+$this->setViewState('EditItemIndex',$value,-1);
+$items=$this->getItems();
+$itemCount=$items->getCount();
+if($current>=0 && $current<$itemCount)
+$items->itemAt($current)->setItemType($current%2?'AlternatingItem':'Item');
+if($value>=0 && $value<$itemCount)
+$items->itemAt($value)->setItemType('EditItem');
+}
+} +public function getAllowCustomPaging()
+{
+return $this->getViewState('AllowCustomPaging',false);
+} +public function setAllowCustomPaging($value)
+{
+$this->setViewState('AllowCustomPaging',TPropertyValue::ensureBoolean($value),false);
+} +public function getAllowPaging()
+{
+return $this->getViewState('AllowPaging',false);
+} +public function setAllowPaging($value)
+{
+$this->setViewState('AllowPaging',TPropertyValue::ensureBoolean($value),false);
+} +public function getAllowSorting()
+{
+return $this->getViewState('AllowSorting',false);
+} +public function setAllowSorting($value)
+{
+$this->setViewState('AllowSorting',TPropertyValue::ensureBoolean($value),false);
+} +public function getAutoGenerateColumns()
+{
+return $this->getViewState('AutoGenerateColumns',true);
+} +public function setAutoGenerateColumns($value)
+{
+$this->setViewState('AutoGenerateColumns',TPropertyValue::ensureBoolean($value),true);
+} +public function getCurrentPageIndex()
+{
+return $this->getViewState('CurrentPageIndex',0);
+} +public function setCurrentPageIndex($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))<0)
+throw new TInvalidDataValueException('datagrid_currentpageindex_invalid');
+$this->setViewState('CurrentPageIndex',$value,0);
+} +public function getPageSize()
+{
+return $this->getViewState('PageSize',10);
+} +public function setPageSize($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))<1)
+throw new TInvalidDataValueException('datagrid_pagesize_invalid');
+$this->setViewState('PageSize',TPropertyValue::ensureInteger($value),10);
+} +public function getPageCount()
+{
+if($this->_pagedDataSource)
+return $this->_pagedDataSource->getPageCount();
+return $this->getViewState('PageCount',0);
+} +public function getVirtualCount()
+{
+return $this->getViewState('VirtualCount',0);
+} +public function setVirtualCount($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))<0)
+throw new TInvalidDataValueException('datagrid_virtualcount_invalid');
+$this->setViewState('VirtualCount',$value,0);
+} +public function getShowHeader()
+{
+return $this->getViewState('ShowHeader',true);
+} +public function setShowHeader($value)
+{
+$this->setViewState('ShowHeader',TPropertyValue::ensureBoolean($value),true);
+} +public function getShowFooter()
+{
+return $this->getViewState('ShowFooter',false);
+} +public function setShowFooter($value)
+{
+$this->setViewState('ShowFooter',TPropertyValue::ensureBoolean($value),false);
+} +public function onBubbleEvent($sender,$param)
+{
+if($param instanceof TDataGridCommandEventParameter)
+{
+$this->onItemCommand($param);
+$command=$param->getCommandName();
+if(strcasecmp($command,'select')===0)
+{
+$this->setSelectedIndex($param->getItem()->getItemIndex());
+$this->onSelectedIndexChanged(null);
+return true;
+}
+else if(strcasecmp($command,'edit')===0)
+{
+$this->onEditCommand($param);
+return true;
+}
+else if(strcasecmp($command,'delete')===0)
+{
+$this->onDeleteCommand($param);
+return true;
+}
+else if(strcasecmp($command,'update')===0)
+{
+$this->onUpdateCommand($param);
+return true;
+}
+else if(strcasecmp($command,'cancel')===0)
+{
+$this->onCancelCommand($param);
+return true;
+}
+else if(strcasecmp($command,'sort')===0)
+{
+$this->onSortCommand(new TDataGridSortCommandEventParameter($sender,$param->getCommandParameter()));
+return true;
+}
+else if(strcasecmp($command,'page')===0)
+{
+$p=$param->getCommandParameter();
+if(strcasecmp($p,'next'))
+$pageIndex=$this->getCurrentPageIndex()+1;
+else if(strcasecmp($p,'prev'))
+$pageIndex=$this->getCurrentPageIndex()-1;
+else
+$pageIndex=TPropertyValue::ensureInteger($p)-1;
+$this->onPageIndexChanged(new TDataGridPageChangedEventParameter($sender,$pageIndex));
+return true;
+}
+}
+return false;
+} +public function onCancelCommand($param)
+{
+$this->raiseEvent('OnCancelCommand',$this,$param);
+} +public function onDeleteCommand($param)
+{
+$this->raiseEvent('OnDeleteCommand',$this,$param);
+} +public function onEditCommand($param)
+{
+$this->raiseEvent('OnEditCommand',$this,$param);
+} +public function onItemCommand($param)
+{
+$this->raiseEvent('OnItemCommand',$this,$param);
+} +public function onSortCommand($param)
+{
+$this->raiseEvent('OnSortCommand',$this,$param);
+} +public function onUpdateCommand($param)
+{
+$this->raiseEvent('OnUpdateCommand',$this,$param);
+} +public function onItemCreated($param)
+{
+$this->raiseEvent('OnItemCreated',$this,$param);
+} +public function onItemDataBound($param)
+{
+$this->raiseEvent('OnItemDataBound',$this,$param);
+} +public function onPageIndexChanged($param)
+{
+$this->raiseEvent('OnPageIndexChanged',$this,$param);
+} +public function saveState()
+{
+parent::saveState();
+if(!$this->getEnableViewState(true))
+return;
+if($this->_items)
+$this->setViewState('ItemCount',$this->_items->getCount(),0);
+else
+$this->clearViewState('ItemCount');
+if($this->_autoColumns)
+{
+$state=array();
+foreach($this->_autoColumns as $column)
+$state[]=$column->saveState();
+$this->setViewState('AutoColumns',$state,array());
+}
+else
+$this->clearViewState('AutoColumns');
+if($this->_columns)
+{
+$state=array();
+foreach($this->_columns as $column)
+$state[]=$column->saveState();
+$this->setViewState('Columns',$state,array());
+}
+else
+$this->clearViewState('Columns');
+} +public function loadState()
+{
+parent::loadState();
+if(!$this->getEnableViewState(true))
+return;
+if(!$this->getIsDataBound())
+{
+$state=$this->getViewState('AutoColumns',array());
+if(!empty($state))
+{
+$this->_autoColumns=new TDataGridColumnCollection;
+foreach($state as $st)
+{
+$column=new TBoundColumn;
+$column->loadState($st);
+$this->_autoColumns->add($column);
+}
+}
+else
+$this->_autoColumns=null;
+$state=$this->getViewState('Columns',array());
+if($this->_columns)
+{
+$i=0;
+foreach($this->_columns as $column)
+{
+$column->loadState($state[$i]);
+$i++;
+}
+}
+$this->restoreGridFromViewState();
+}
+$this->clearViewState('ItemCount');
+} +private function createPagedDataSource()
+{
+$ds=new TPagedDataSource;
+$ds->setCurrentPageIndex($this->getCurrentPageIndex());
+$ds->setPageSize($this->getPageSize());
+$ds->setAllowPaging($this->getAllowPaging());
+$ds->setAllowCustomPaging($this->getAllowCustomPaging());
+$ds->setVirtualCount($this->getVirtualCount());
+return $ds;
+} +public function reset()
+{
+$this->getControls()->clear();
+$this->getItems()->clear();
+$this->_header=null;
+$this->_footer=null;
+} +protected function restoreGridFromViewState()
+{
+$this->reset();
+if(($itemCount=$this->getViewState('ItemCount',0))<=0)
+return;
+$this->_pagedDataSource=$ds=$this->createPagedDataSource();
+$allowPaging=$ds->getAllowPaging();
+if($allowPaging)
+$ds->setDataSource(new TDummyDataSource($itemCount));
+else
+$ds->setDataSource(new TDummyDataSource($this->getViewState('DataSourceCount',0))); +$columns=new TList($this->getColumns());
+$columns->mergeWith($this->_autoColumns); +if($columns->getCount()>0)
+{
+foreach($columns as $column)
+$column->initialize();
+if($allowPaging)
+$this->createPager(-1,-1,$columnCount,$ds);
+$this->createItemInternal(-1,-1,'Header',false,null,$columns);
+$selectedIndex=$this->getSelectedItemIndex();
+$editIndex=$this->getEditItemIndex();
+$index=0;
+$dsIndex=$ds->getAllowPaging()?$ds->getFirstIndexInPage():0;
+foreach($ds as $data)
+{
+if($index===$editIndex)
+$itemType='EditItem';
+else if($index===$selectedIndex)
+$itemType='SelectedItem';
+else if($index % 2)
+$itemType='AlternatingItem';
+else
+$itemType='Item';
+$items->add($this->createItemInternal($index,$dsIndex,$itemType,false,null,$columns));
+$index++;
+$dsIndex++;
+}
+$this->createItemInternal(-1,-1,'Footer',false,null,$columns);
+if($allowPaging)
+$this->createPager(-1,-1,$columnCount,$ds);
+}
+$this->_pagedDataSource=null;
+} +protected function performDataBinding($data)
+{
+$this->reset();
+$keys=$this->getDataKeys();
+$keys->clear();
+$keyField=$this->getDataKeyField();
+$this->_pagedDataSource=$ds=$this->createPagedDataSource();
+$ds->setDataSource($data);
+$allowPaging=$ds->getAllowPaging();
+if($allowPaging && $ds->getCurrentPageIndex()>=$ds->getPageCount())
+throw new TInvalidDataValueException('datagrid_currentpageindex_invalid');
+$columns=new TList($this->getColumns());
+if($this->getAutoGenerateColumns())
+{
+$autoColumns=$this->createAutoColumns($ds);
+$columns->mergeWith($autoColumns);
+} $items=$this->getItems(); -if(($columnCount=$columns->getCount())>0) - { - foreach($columns as $column) - $column->initialize(); - $allowPaging=$ds->getAllowPaging(); - if($allowPaging) - $this->createPager(-1,-1,$columnCount,$ds); - $this->createItemInternal(-1,-1,'Header',true,null,$columns); - $selectedIndex=$this->getSelectedItemIndex(); - $editIndex=$this->getEditItemIndex(); - $index=0; - $dsIndex=$ds->getAllowPaging()?$ds->getFirstIndexInPage():0; - foreach($ds as $data) - { - if($keyField!=='') - $keys->add($this->getDataFieldValue($data,$keyField)); - if($index===$editIndex) - $itemType='EditItem'; - else if($index===$selectedIndex) - $itemType='SelectedItem'; - else if($index % 2) - $itemType='AlternatingItem'; - else - $itemType='Item'; - $items->add($this->createItemInternal($index,$dsIndex,$itemType,true,$data,$columns)); - $index++; - $dsIndex++; - } - $this->createItemInternal(-1,-1,'Footer',true,null,$columns); - if($allowPaging) - $this->createPager(-1,-1,$columnCount,$ds); - $this->setViewState('ItemCount',$index,0); - $this->setViewState('PageCount',$ds->getPageCount(),0); - $this->setViewState('DataSourceCount',$ds->getDataSourceCount(),0); - } - else - { - $this->setViewState('ItemCount',$index,0); - $this->setViewState('PageCount',0,0); - $this->setViewState('DataSourceCount',0,0); - } - $this->_pagedDataSource=null; - } -protected function createItem($itemIndex,$dataSourceIndex,$itemType) - { - return new TDataGridItem($itemIndex,$dataSourceIndex,$itemType); - } -private function createItemInternal($itemIndex,$dataSourceIndex,$itemType,$dataBind,$dataItem,$columns) - { - $item=$this->createItem($itemIndex,$dataSourceIndex,$itemType); - $this->initializeItem($item,$columns); - $param=new TDataGridItemEventParameter($item); - if($dataBind) - { - $item->setDataItem($dataItem); - $this->onItemCreated($param); - $this->getControls()->add($item); - $item->dataBind(); - $this->onItemDataBound($param); - $item->setDataItem(null); - } - else - { - $this->onItemCreated($param); - $this->getControls()->add($item); - } - return $item; - } -protected function initializeItem($item,$columns) - { - $cells=$item->getCells(); - $itemType=$item->getItemType(); - $index=0; - foreach($columns as $column) - { - if($itemType==='Header') - $cell=new TTableHeaderCell; - else - $cell=new TTableCell; - $column->initializeCell($cell,$index,$itemType); - $cells->add($cell); - $index++; - } - } -private function createPager($itemIndex,$dataSourceIndex,$columnSpan,$pagedDataSource) - { - $item=$this->createItem($itemIndex,$dataSourceIndex,'Pager'); - $this->initializePager($item,$columnSpan,$pagedDataSource); - $this->onItemCreated(new TDataGridItemEventParameter($item)); - $this->getControls()->add($item); - return $item; - } -protected function initializePager($pager,$columnSpan,$pagedDataSource) - { - $cell=new TTableCell; - if($columnSpan>1) - $cell->setColumnSpan($columnSpan); - $this->buildPager($cell,$pagedDataSource); - $pager->getCells()->add($cell); - } -protected function buildPager($cell,$dataSource) - { - switch($this->getPagerStyle()->getMode()) - { - case 'NextPrev': - $this->buildNextPrevPager($cell,$dataSource); - break; - case 'Numeric': - $this->buildNumericPager($cell,$dataSource); - break; - } - } -protected function buildNextPrevPager($cell,$dataSource) - { - $style=$this->getPagerStyle(); - $controls=$cell->getControls(); - if($dataSource->getIsFirstPage()) - { - $label=new TLabel; - $label->setText($style->getPrevPageText()); - $controls->add($label); - } - else - { - $button=new TLinkButton; - $button->setText($style->getPrevPageText()); - $button->setCommandName('page'); - $button->setCommandParameter('prev'); - $button->setCausesValidation(false); - $controls->add($button); - } - $controls->add(' '); - if($dataSource->getIsLastPage()) - { - $label=new TLabel; - $label->setText($style->getNextPageText()); - $controls->add($label); - } - else - { - $button=new TLinkButton; - $button->setText($style->getNextPageText()); - $button->setCommandName('page'); - $button->setCommandParameter('next'); - $button->setCausesValidation(false); - $controls->add($button); - } - } -protected function buildNumericPager($cell,$dataSource) - { - $style=$this->getPagerStyle(); - $controls=$cell->getControls(); - $pageCount=$dataSource->getPageCount(); - $pageIndex=$dataSource->getCurrentPageIndex()+1; - $maxButtonCount=$style->getPageButtonCount(); - $buttonCount=$maxButtonCount>$pageCount?$pageCount:$maxButtonCount; - $startPageIndex=1; - $endPageIndex=$buttonCount; - if($pageIndex>$endPageIndex) - { - $startPageIndex=((int)($pageIndex/$maxButtonCount))*$maxButtonCount+1; - if(($endPageIndex=$startPageIndex+$maxButtonCount-1)>$pageCount) - $endPageIndex=$pageCount; - if($endPageIndex-$startPageIndex+1<$maxButtonCount) - { - if(($startPageIndex=$endPageIndex-$maxButtonCount+1)<1) - $startPageIndex=1; - } - } -if($startPageIndex>1) - { - $button=new TLinkButton; - $button->setText('...'); - $button->setCommandName('page'); - $button->setCommandParameter($startPageIndex-1); - $button->setCausesValidation(false); - $controls->add($button); - $controls->add(' '); - } -for($i=$startPageIndex;$i<=$endPageIndex;++$i) - { - if($i===$pageIndex) - { - $label=new TLabel; - $label->setText("$i"); - $controls->add($label); - } - else - { - $button=new TLinkButton; - $button->setText("$i"); - $button->setCommandName('page'); - $button->setCommandParameter($i); - $button->setCausesValidation(false); - $controls->add($button); - } - if($i<$endPageIndex) - $controls->add(' '); - } -if($pageCount>$endPageIndex) - { - $controls->add(' '); - $button=new TLinkButton; - $button->setText('...'); - $button->setCommandName('page'); - $button->setCommandParameter($endPageIndex+1); - $button->setCausesValidation(false); - $controls->add($button); - } - } -protected function createAutoColumns($dataSource) - { - if(!$dataSource) - return null; - $autoColumns=$this->getAutoColumns(); - $autoColumns->clear(); - foreach($dataSource as $row) - { - foreach($row as $key=>$value) - { - $column=new TBoundColumn; - if(is_string($key)) - { - $column->setHeaderText($key); - $column->setDataField($key); - $column->setSortExpression($key); - $column->setOwner($this); - $autoColumns->add($column); - } - else - { - $column->setHeaderText('Item'); - $column->setDataField($key); - $column->setSortExpression('Item'); - $column->setOwner($this); - $autoColumns->add($column); - } - } - break; - } - return $autoColumns; - } -protected function applyItemStyles() - { - $headerStyle=$this->getViewState('HeaderStyle',null); - $footerStyle=$this->getViewState('FooterStyle',null); - $pagerStyle=$this->getViewState('PagerStyle',null); - $separatorStyle=$this->getViewState('SeparatorStyle',null); - $itemStyle=$this->getViewState('ItemStyle',null); - $alternatingItemStyle=$this->getViewState('AlternatingItemStyle',null); - if($itemStyle!==null) - { - if($alternatingItemStyle===null) - $alternatingItemStyle=new TTableItemStyle; - $alternatingItemStyle->mergeWith($itemStyle); - } - $selectedItemStyle=$this->getViewState('SelectedItemStyle',null); - if($alternatingItemStyle!==null) - { - if($selectedItemStyle===null) - $selectedItemStyle=new TTableItemStyle; - $selectedItemStyle->mergeWith($alternatingItemStyle); - } - $editItemStyle=$this->getViewState('EditItemStyle',null); - if($selectedItemStyle!==null) - { - if($editItemStyle===null) - $editItemStyle=new TTableItemStyle; - $editItemStyle->mergeWith($selectedItemStyle); - } -foreach($this->getControls() as $index=>$control) - { - switch($control->getItemType()) - { - case 'Header': - if($headerStyle) - $control->getStyle()->mergeWith($headerStyle); - if(!$this->getShowHeader()) - $control->setVisible(false); - break; - case 'Footer': - if($footerStyle) - $control->getStyle()->mergeWith($footerStyle); - if(!$this->getShowFooter()) - $control->setVisible(false); - break; - case 'Separator': - if($separatorStyle) - $control->getStyle()->mergeWith($separatorStyle); - break; - case 'Item': - if($itemStyle) - $control->getStyle()->mergeWith($itemStyle); - break; - case 'AlternatingItem': - if($alternatingItemStyle) - $control->getStyle()->mergeWith($alternatingItemStyle); - break; - case 'SelectedItem': - if($selectedItemStyle) - $control->getStyle()->mergeWith($selectedItemStyle); - break; - case 'EditItem': - if($editItemStyle) - $control->getStyle()->mergeWith($editItemStyle); - break; - case 'Pager': - if($pagerStyle) - { - $control->getStyle()->mergeWith($pagerStyle); - $mode=$pagerStyle->getMode(); - if($index===0) - { - if($mode==='Bottom') - $control->setVisible(false); - } - else - { - if($mode==='Top') - $control->setVisible(false); - } - } - break; - default: - break; - } - } - } -protected function renderContents($writer) - { - if($this->getHasControls()) - { - $this->applyItemStyles(); - parent::renderContents($writer); - } - } -} -class TDataGridItemEventParameter extends TEventParameter +if(($columnCount=$columns->getCount())>0)
+{
+foreach($columns as $column)
+$column->initialize();
+$allowPaging=$ds->getAllowPaging();
+if($allowPaging)
+$this->createPager(-1,-1,$columnCount,$ds);
+$this->createItemInternal(-1,-1,'Header',true,null,$columns);
+$selectedIndex=$this->getSelectedItemIndex();
+$editIndex=$this->getEditItemIndex();
+$index=0;
+$dsIndex=$ds->getAllowPaging()?$ds->getFirstIndexInPage():0;
+foreach($ds as $data)
+{
+if($keyField!=='')
+$keys->add($this->getDataFieldValue($data,$keyField));
+if($index===$editIndex)
+$itemType='EditItem';
+else if($index===$selectedIndex)
+$itemType='SelectedItem';
+else if($index % 2)
+$itemType='AlternatingItem';
+else
+$itemType='Item';
+$items->add($this->createItemInternal($index,$dsIndex,$itemType,true,$data,$columns));
+$index++;
+$dsIndex++;
+}
+$this->createItemInternal(-1,-1,'Footer',true,null,$columns);
+if($allowPaging)
+$this->createPager(-1,-1,$columnCount,$ds);
+$this->setViewState('ItemCount',$index,0);
+$this->setViewState('PageCount',$ds->getPageCount(),0);
+$this->setViewState('DataSourceCount',$ds->getDataSourceCount(),0);
+}
+else
+{
+$this->clearViewState('ItemCount');
+$this->clearViewState('PageCount');
+$this->clearViewState('DataSourceCount');
+}
+$this->_pagedDataSource=null;
+} +protected function createItem($itemIndex,$dataSourceIndex,$itemType)
+{
+return new TDataGridItem($itemIndex,$dataSourceIndex,$itemType);
+} +private function createItemInternal($itemIndex,$dataSourceIndex,$itemType,$dataBind,$dataItem,$columns)
+{
+$item=$this->createItem($itemIndex,$dataSourceIndex,$itemType);
+$this->initializeItem($item,$columns);
+$param=new TDataGridItemEventParameter($item);
+if($dataBind)
+{
+$item->setDataItem($dataItem);
+$this->onItemCreated($param);
+$this->getControls()->add($item);
+$item->dataBind();
+$this->onItemDataBound($param);
+$item->setDataItem(null);
+}
+else
+{
+$this->onItemCreated($param);
+$this->getControls()->add($item);
+}
+return $item;
+} +protected function initializeItem($item,$columns)
+{
+$cells=$item->getCells();
+$itemType=$item->getItemType();
+$index=0;
+foreach($columns as $column)
+{
+if($itemType==='Header')
+$cell=new TTableHeaderCell;
+else
+$cell=new TTableCell;
+$column->initializeCell($cell,$index,$itemType);
+$cells->add($cell);
+$index++;
+}
+} +private function createPager($itemIndex,$dataSourceIndex,$columnSpan,$pagedDataSource)
+{
+$item=$this->createItem($itemIndex,$dataSourceIndex,'Pager');
+$this->initializePager($item,$columnSpan,$pagedDataSource);
+$this->onItemCreated(new TDataGridItemEventParameter($item));
+$this->getControls()->add($item);
+return $item;
+} +protected function initializePager($pager,$columnSpan,$pagedDataSource)
+{
+$cell=new TTableCell;
+if($columnSpan>1)
+$cell->setColumnSpan($columnSpan);
+$this->buildPager($cell,$pagedDataSource);
+$pager->getCells()->add($cell);
+} +protected function buildPager($cell,$dataSource)
+{
+switch($this->getPagerStyle()->getMode())
+{
+case 'NextPrev':
+$this->buildNextPrevPager($cell,$dataSource);
+break;
+case 'Numeric':
+$this->buildNumericPager($cell,$dataSource);
+break;
+}
+} +protected function buildNextPrevPager($cell,$dataSource)
+{
+$style=$this->getPagerStyle();
+$controls=$cell->getControls();
+if($dataSource->getIsFirstPage())
+{
+$label=new TLabel;
+$label->setText($style->getPrevPageText());
+$controls->add($label);
+}
+else
+{
+$button=new TLinkButton;
+$button->setText($style->getPrevPageText());
+$button->setCommandName('page');
+$button->setCommandParameter('prev');
+$button->setCausesValidation(false);
+$controls->add($button);
+}
+$controls->add(' ');
+if($dataSource->getIsLastPage())
+{
+$label=new TLabel;
+$label->setText($style->getNextPageText());
+$controls->add($label);
+}
+else
+{
+$button=new TLinkButton;
+$button->setText($style->getNextPageText());
+$button->setCommandName('page');
+$button->setCommandParameter('next');
+$button->setCausesValidation(false);
+$controls->add($button);
+}
+} +protected function buildNumericPager($cell,$dataSource)
+{
+$style=$this->getPagerStyle();
+$controls=$cell->getControls();
+$pageCount=$dataSource->getPageCount();
+$pageIndex=$dataSource->getCurrentPageIndex()+1;
+$maxButtonCount=$style->getPageButtonCount();
+$buttonCount=$maxButtonCount>$pageCount?$pageCount:$maxButtonCount;
+$startPageIndex=1;
+$endPageIndex=$buttonCount;
+if($pageIndex>$endPageIndex)
+{
+$startPageIndex=((int)($pageIndex/$maxButtonCount))*$maxButtonCount+1;
+if(($endPageIndex=$startPageIndex+$maxButtonCount-1)>$pageCount)
+$endPageIndex=$pageCount;
+if($endPageIndex-$startPageIndex+1<$maxButtonCount)
+{
+if(($startPageIndex=$endPageIndex-$maxButtonCount+1)<1)
+$startPageIndex=1;
+}
+} +if($startPageIndex>1)
+{
+$button=new TLinkButton;
+$button->setText('...');
+$button->setCommandName('page');
+$button->setCommandParameter($startPageIndex-1);
+$button->setCausesValidation(false);
+$controls->add($button);
+$controls->add(' ');
+} +for($i=$startPageIndex;$i<=$endPageIndex;++$i)
+{
+if($i===$pageIndex)
+{
+$label=new TLabel;
+$label->setText("$i");
+$controls->add($label);
+}
+else
+{
+$button=new TLinkButton;
+$button->setText("$i");
+$button->setCommandName('page');
+$button->setCommandParameter($i);
+$button->setCausesValidation(false);
+$controls->add($button);
+}
+if($i<$endPageIndex)
+$controls->add(' ');
+} +if($pageCount>$endPageIndex)
+{
+$controls->add(' ');
+$button=new TLinkButton;
+$button->setText('...');
+$button->setCommandName('page');
+$button->setCommandParameter($endPageIndex+1);
+$button->setCausesValidation(false);
+$controls->add($button);
+}
+} +protected function createAutoColumns($dataSource)
+{
+if(!$dataSource)
+return null;
+$autoColumns=$this->getAutoColumns();
+$autoColumns->clear();
+foreach($dataSource as $row)
+{
+foreach($row as $key=>$value)
+{
+$column=new TBoundColumn;
+if(is_string($key))
+{
+$column->setHeaderText($key);
+$column->setDataField($key);
+$column->setSortExpression($key);
+$column->setOwner($this);
+$autoColumns->add($column);
+}
+else
+{
+$column->setHeaderText('Item');
+$column->setDataField($key);
+$column->setSortExpression('Item');
+$column->setOwner($this);
+$autoColumns->add($column);
+}
+}
+break;
+}
+return $autoColumns;
+} +protected function applyItemStyles()
+{
+$itemStyle=$this->getViewState('ItemStyle',null); +$alternatingItemStyle=new TTableItemStyle($itemStyle);
+if(($style=$this->getViewState('AlternatingItemStyle',null))!==null)
+$alternatingItemStyle->mergeWith($style); +$selectedItemStyle=$this->getViewState('SelectedItemStyle',null); +$editItemStyle=new TTableItemStyle($selectedItemStyle);
+if(($style=$this->getViewState('EditItemStyle',null))!==null)
+$editItemStyle->copyFrom($style); +$headerStyle=$this->getViewState('HeaderStyle',null);
+$footerStyle=$this->getViewState('FooterStyle',null);
+$pagerStyle=$this->getViewState('PagerStyle',null);
+$separatorStyle=$this->getViewState('SeparatorStyle',null); +foreach($this->getControls() as $index=>$item)
+{
+$itemType=$item->getItemType();
+switch($itemType)
+{
+case 'Header':
+if($headerStyle)
+$item->getStyle()->mergeWith($headerStyle);
+if(!$this->getShowHeader())
+$item->setVisible(false);
+break;
+case 'Footer':
+if($footerStyle)
+$item->getStyle()->mergeWith($footerStyle);
+if(!$this->getShowFooter())
+$item->setVisible(false);
+break;
+case 'Separator':
+if($separatorStyle)
+$item->getStyle()->mergeWith($separatorStyle);
+break;
+case 'Item':
+if($itemStyle)
+$item->getStyle()->mergeWith($itemStyle);
+break;
+case 'AlternatingItem':
+if($alternatingItemStyle)
+$item->getStyle()->mergeWith($alternatingItemStyle);
+break;
+case 'SelectedItem':
+if($index % 2==1)
+{
+if($itemStyle)
+$item->getStyle()->mergeWith($itemStyle);
+}
+else
+{
+if($alternatingItemStyle)
+$item->getStyle()->mergeWith($alternatingItemStyle);
+}
+if($selectedItemStyle)
+$item->getStyle()->mergeWith($selectedItemStyle);
+break;
+case 'EditItem':
+if($index % 2==1)
+{
+if($itemStyle)
+$item->getStyle()->mergeWith($itemStyle);
+}
+else
+{
+if($alternatingItemStyle)
+$item->getStyle()->mergeWith($alternatingItemStyle);
+}
+if($editItemStyle)
+$item->getStyle()->mergeWith($editItemStyle);
+break;
+case 'Pager':
+if($pagerStyle)
+{
+$item->getStyle()->mergeWith($pagerStyle);
+$mode=$pagerStyle->getMode();
+if($index===0)
+{
+if($mode==='Bottom')
+$item->setVisible(false);
+}
+else
+{
+if($mode==='Top')
+$item->setVisible(false);
+}
+}
+break;
+default:
+break;
+}
+if($this->_columns && $itemType!=='Pager')
+{
+$n=$this->_columns->getCount();
+$cells=$item->getCells();
+for($i=0;$i<$n;++$i)
+{
+$cell=$cells->itemAt($i);
+$column=$this->_columns->itemAt($i);
+if(!$column->getVisible())
+$cell->setVisible(false);
+else
+{
+if($itemType==='Header')
+$style=$column->getHeaderStyle(false);
+else if($itemType==='Footer')
+$style=$column->getFooterStyle(false);
+else
+$style=$column->getItemStyle(false);
+if($style!==null)
+$cell->getStyle()->mergeWith($style);
+}
+}
+}
+}
+} +protected function renderContents($writer)
+{
+if($this->getHasControls())
+{
+$this->applyItemStyles();
+parent::renderContents($writer);
+}
+}
+} +class TDataGridItemEventParameter extends TEventParameter
{ private $_item=null; -public function __construct(TDataGridItem $item) - { - $this->_item=$item; - } -public function getItem() - { - return $this->_item; - } +public function __construct(TDataGridItem $item)
+{
+$this->_item=$item;
} -class TDataGridCommandEventParameter extends TCommandEventParameter +public function getItem()
+{
+return $this->_item;
+}
+} +class TDataGridCommandEventParameter extends TCommandEventParameter
{ private $_item=null; private $_source=null; -public function __construct($item,$source,TCommandEventParameter $param) - { - $this->_item=$item; - $this->_source=$source; - parent::__construct($param->getCommandName(),$param->getCommandParameter()); - } -public function getItem() - { - return $this->_item; - } -public function getCommandSource() - { - return $this->_source; - } -} -class TDataGridSortCommandEventParameter extends TEventParameter +public function __construct($item,$source,TCommandEventParameter $param)
+{
+$this->_item=$item;
+$this->_source=$source;
+parent::__construct($param->getCommandName(),$param->getCommandParameter());
+} +public function getItem()
+{
+return $this->_item;
+} +public function getCommandSource()
+{
+return $this->_source;
+}
+} +class TDataGridSortCommandEventParameter extends TEventParameter
{ private $_sortExpression=''; private $_source=null; -public function __construct($source,TDataGridCommandEventParameter $param) - { - $this->_source=$source; - $this->_sortExpression=$param->getCommandParameter(); - } -public function getCommandSource() - { - return $this->_source; - } -public function getSortExpression() - { - return $this->_sortExpression; - } -} -class TDataGridPageChangedEventParameter extends TEventParameter +public function __construct($source,TDataGridCommandEventParameter $param)
+{
+$this->_source=$source;
+$this->_sortExpression=$param->getCommandParameter();
+} +public function getCommandSource()
+{
+return $this->_source;
+} +public function getSortExpression()
+{
+return $this->_sortExpression;
+}
+} +class TDataGridPageChangedEventParameter extends TEventParameter
{ private $_newIndex; private $_source=null; -public function __construct($source,$newPageIndex) - { - $this->_source=$source; - $this->_newIndex=$newPageIndex; - } -public function getCommandSource() - { - return $this->_source; - } -public function getNewPageIndex() - { - return $this->_newIndex; - } -} -class TDataGridItem extends TTableRow implements INamingContainer +public function __construct($source,$newPageIndex)
+{
+$this->_source=$source;
+$this->_newIndex=$newPageIndex;
+} +public function getCommandSource()
+{
+return $this->_source;
+} +public function getNewPageIndex()
+{
+return $this->_newIndex;
+}
+} +class TDataGridItem extends TTableRow implements INamingContainer
{ private $_itemIndex=''; private $_dataSourceIndex=0; private $_itemType=''; private $_dataItem=null; -public function __construct($itemIndex,$dataSourceIndex,$itemType) - { - $this->_itemIndex=$itemIndex; - $this->_dataSourceIndex=$dataSourceIndex; - $this->setItemType($itemType); - } -public function getItemType() - { - return $this->_itemType; - } -public function setItemType($value) - { - $this->_itemType=TPropertyValue::ensureEnum($value,'Header','Footer','Item','AlternatingItem','SelectedItem','EditItem','Separator','Pager'); - } -public function getItemIndex() - { - return $this->_itemIndex; - } -public function getDataSourceIndex() - { - return $this->_dataSourceIndex; - } -public function getDataItem() - { - return $this->_dataItem; - } -public function setDataItem($value) - { - $this->_dataItem=$value; - } -protected function onBubbleEvent($sender,$param) - { - if($param instanceof TCommandEventParameter) - { - $this->raiseBubbleEvent($this,new TDataGridCommandEventParameter($this,$sender,$param)); - return true; - } - else - return false; - } -} -class TDataGridItemCollection extends TList -{ -protected function canAddItem($item) - { - return ($item instanceof TDataGridItem); - } -} -class TDataGridColumnCollection extends TList -{ -protected function canAddItem($item) - { - return ($item instanceof TDataGridColumn); - } -} -class TDataGridPagerStyle extends TTableItemStyle -{ - private $_mode=null; - private $_nextText=null; - private $_prevText=null; - private $_buttonCount=null; - private $_position=null; - private $_visible=null; -public function getMode() - { - return $this->_mode===null?'NextPrev':$this->_mode; - } -public function setMode($value) - { - $this->_mode=TPropertyValue::ensureEnum($value,'NextPrev','Numeric'); - } -public function getNextPageText() - { - return $this->_nextText===null?'>':$this->_nextText; - } -public function setNextPageText($value) - { - $this->_nextText=$value; - } -public function getPrevPageText() - { - return $this->_prevText===null?'<':$this->_prevText; - } -public function setPrevPageText($value) - { - $this->_prevText=$value; - } -public function getPageButtonCount() - { - return $this->_buttonCount===null?10:$this->_buttonCount; - } -public function setPageButtonCount($value) - { - if(($value=TPropertyValue::ensureInteger($value))<1) - throw new TInvalidDataValueException('datagridpagerstyle_pagebuttoncount_invalid'); - $this->_buttonCount=$value; - } -public function getPosition() - { - return $this->_position===null?'Bottom':$this->_position; - } -public function setPosition($value) - { - $this->_position=TPropertyValue::ensureEnum($value,'Bottom','Top','TopAndBottom'); - } -public function getVisible() - { - return $this->_visible===null?true:$this->_visible; - } -public function setVisible($value) - { - $this->_visible=TPropertyValue::ensureBoolean($value); - } -public function reset() - { - parent::reset(); - $this->_visible=null; - $this->_position=null; - $this->_buttonCount=null; - $this->_prevText=null; - $this->_nextText=null; - $this->_mode=null; - } -public function copyFrom($style) - { - parent::copyFrom($style); - if($style instanceof TDataGridPagerStyle) - { - $this->_visible=$style->_visible; - $this->_position=$style->_position; - $this->_buttonCount=$style->_buttonCount; - $this->_prevText=$style->_prevText; - $this->_nextText=$style->_nextText; - $this->_mode=$style->_mode; - } - } -public function mergeWith($style) - { - parent::mergeWith($style); - if($style instanceof TDataGridPagerStyle) - { - if($style->_visible!==null && $this->_visible===null) - $this->_visible=$style->_visible; - if($style->_position!==null && $this->_position===null) - $this->_position=$style->_position; - if($style->_buttonCount!==null && $this->_buttonCount===null) - $this->_buttonCount=$style->_buttonCount; - if($style->_prevText!==null && $this->_prevText===null) - $this->_prevText=$style->_prevText; - if($style->_nextText!==null && $this->_nextText===null) - $this->_nextText=$style->_nextText; - if($style->_mode!==null && $this->_mode===null) - $this->_mode=$style->_mode; - } - } -} -?><?php -abstract class TDataGridColumn extends TComponent -{ - private $_owner=null; - private $_viewState=array(); -public function getHeaderText() - { - return $this->getViewState('HeaderText',''); - } -public function setHeaderText($value) - { - $this->setViewState('HeaderText',$value,''); - $this->onColumnChanged(); - } -public function getHeaderImageUrl() - { - return $this->getViewState('HeaderImageUrl',''); - } -public function setHeaderImageUrl($value) - { - $this->setViewState('HeaderImageUrl',$value,''); - $this->onColumnChanged(); - } -public function getHeaderStyle() - { - if(($style=$this->getViewState('HeaderStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('HeaderStyle',$style,null); - } - return $style; - } -public function getFooterText() - { - return $this->getViewState('FooterText',''); - } -public function setFooterText($value) - { - $this->setViewState('FooterText',$value,''); - $this->onColumnChanged(); - } -public function getFooterStyle() - { - if(($style=$this->getViewState('FooterStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('FooterStyle',$style,null); - } - return $style; - } -public function getItemStyle() - { - if(($style=$this->getViewState('ItemStyle',null))===null) - { - $style=new TTableItemStyle; - $this->setViewState('ItemStyle',$style,null); - } - return $style; - } -public function setSortExpression($value) - { - $this->setViewState('SortExpression',$value,''); - $this->onColumnChanged(); - } -public function getSortExpression() - { - return $this->getViewState('SortExpression',''); - } -public function getVisible($checkParents=true) - { - return $this->getViewState('Visible',true); - } -public function setVisible($value) - { - $this->setViewState('Visible',TPropertyValue::ensureBoolean($value),true); - $this->onColumnChanged(); - } -protected function getViewState($key,$defaultValue=null) - { - return isset($this->_viewState[$key])?$this->_viewState[$key]:$defaultValue; - } -protected function setViewState($key,$value,$defaultValue=null) - { - if($value===$defaultValue) - unset($this->_viewState[$key]); - else - $this->_viewState[$key]=$value; - } -public function loadState($state) - { - $this->_viewState=$state; - } -public function saveState() - { - return $this->_viewState; - } -public function getOwner() - { - return $this->_owner; - } -public function setOwner(TDataGrid $value) - { - $this->_owner=$value; - } -protected function onColumnChanged() - { - if($this->_owner) - $this->_owner->onColumnsChanged(); - } -public function initialize() - { - } -protected function getDataFieldValue($data,$field) - { - if(is_array($data)) - return $data[$field]; - else if($data instanceof TMap) - return $data->itemAt($field); - else if(($data instanceof TComponent) && $data->canGetProperty($field)) - { - $getter='get'.$field; - return $data->$getter(); - } - else - throw new TInvalidDataValueException('datagridcolumn_data_invalid'); - } -public function initializeCell($cell,$columnIndex,$itemType) - { - switch($itemType) - { - case 'Header': - $sortExpression=$this->getSortExpression(); - $allowSorting=$sortExpression!=='' && (!$this->_owner || $this->_owner->getAllowSorting()); - if($allowSorting) - { - if(($url=$this->getHeaderImageUrl())!=='') - { - $button=Prado::createComponent('System.Web.UI.WebControls.TImageButton'); - $button->setImageUrl($url); - $button->setCommandName('Sort'); - $button->setCommandParameter($sortExpression); - $button->setCausesValidation(false); - $cell->getControls()->add($button); - } - else if(($text=$this->getHeaderText())!=='') - { - $button=Prado::createComponent('System.Web.UI.WebControls.TLinkButton'); - $button->setText($text); - $button->setCommandName('Sort'); - $button->setCommandParameter($sortExpression); - $button->setCausesValidation(false); - $cell->getControls()->add($button); - } - else - $cell->setText(' '); - } - else - { - if(($url=$this->getHeaderImageUrl())!=='') - { - $image=Prado::createComponent('System.Web.UI.WebControls.TImage'); - $image->setImageUrl($url); - $cell->getControls()->add($image); - } - else - { - if(($text=$this->getHeaderText())==='') - $text=' '; - $cell->setText($text); - } - } - break; - case 'Footer': - if(($text=$this->getFooterText())==='') - $text=' '; - $cell->setText($text); - break; - } - } -} -?><?php +public function __construct($itemIndex,$dataSourceIndex,$itemType)
+{
+$this->_itemIndex=$itemIndex;
+$this->_dataSourceIndex=$dataSourceIndex;
+$this->setItemType($itemType);
+} +public function getItemType()
+{
+return $this->_itemType;
+} +public function setItemType($value)
+{
+$this->_itemType=TPropertyValue::ensureEnum($value,'Header','Footer','Item','AlternatingItem','SelectedItem','EditItem','Separator','Pager');
+} +public function getItemIndex()
+{
+return $this->_itemIndex;
+} +public function getDataSourceIndex()
+{
+return $this->_dataSourceIndex;
+} +public function getDataItem()
+{
+return $this->_dataItem;
+} +public function setDataItem($value)
+{
+$this->_dataItem=$value;
+} +public function onBubbleEvent($sender,$param)
+{
+if($param instanceof TCommandEventParameter)
+{
+$this->raiseBubbleEvent($this,new TDataGridCommandEventParameter($this,$sender,$param));
+return true;
+}
+else
+return false;
+}
+} +class TDataGridItemCollection extends TList
+{ +public function insertAt($index,$item)
+{
+if($item instanceof TDataGridItem)
+parent::insertAt($index,$item);
+else
+throw new TInvalidDataTypeException('datagriditemcollection_datagriditem_required');
+}
+} +class TDataGridColumnCollection extends TList
+{ +public function insertAt($index,$item)
+{
+if($item instanceof TDataGridColumn)
+parent::insertAt($index,$item);
+else
+throw new TInvalidDataTypeException('datagridcolumncollection_datagridcolumn_required');
+}
+} +class TDataGridPagerStyle extends TTableItemStyle
+{
+private $_mode=null;
+private $_nextText=null;
+private $_prevText=null;
+private $_buttonCount=null;
+private $_position=null;
+private $_visible=null; +public function getMode()
+{
+return $this->_mode===null?'NextPrev':$this->_mode;
+} +public function setMode($value)
+{
+$this->_mode=TPropertyValue::ensureEnum($value,'NextPrev','Numeric');
+} +public function getNextPageText()
+{
+return $this->_nextText===null?'>':$this->_nextText;
+} +public function setNextPageText($value)
+{
+$this->_nextText=$value;
+} +public function getPrevPageText()
+{
+return $this->_prevText===null?'<':$this->_prevText;
+} +public function setPrevPageText($value)
+{
+$this->_prevText=$value;
+} +public function getPageButtonCount()
+{
+return $this->_buttonCount===null?10:$this->_buttonCount;
+} +public function setPageButtonCount($value)
+{
+if(($value=TPropertyValue::ensureInteger($value))<1)
+throw new TInvalidDataValueException('datagridpagerstyle_pagebuttoncount_invalid');
+$this->_buttonCount=$value;
+} +public function getPosition()
+{
+return $this->_position===null?'Bottom':$this->_position;
+} +public function setPosition($value)
+{
+$this->_position=TPropertyValue::ensureEnum($value,'Bottom','Top','TopAndBottom');
+} +public function getVisible()
+{
+return $this->_visible===null?true:$this->_visible;
+} +public function setVisible($value)
+{
+$this->_visible=TPropertyValue::ensureBoolean($value);
+} +public function reset()
+{
+parent::reset();
+$this->_visible=null;
+$this->_position=null;
+$this->_buttonCount=null;
+$this->_prevText=null;
+$this->_nextText=null;
+$this->_mode=null;
+} +public function copyFrom($style)
+{
+parent::copyFrom($style);
+if($style instanceof TDataGridPagerStyle)
+{
+$this->_visible=$style->_visible;
+$this->_position=$style->_position;
+$this->_buttonCount=$style->_buttonCount;
+$this->_prevText=$style->_prevText;
+$this->_nextText=$style->_nextText;
+$this->_mode=$style->_mode;
+}
+} +public function mergeWith($style)
+{
+parent::mergeWith($style);
+if($style instanceof TDataGridPagerStyle)
+{
+if($style->_visible!==null)
+$this->_visible=$style->_visible;
+if($style->_position!==null)
+$this->_position=$style->_position;
+if($style->_buttonCount!==null)
+$this->_buttonCount=$style->_buttonCount;
+if($style->_prevText!==null)
+$this->_prevText=$style->_prevText;
+if($style->_nextText!==null)
+$this->_nextText=$style->_nextText;
+if($style->_mode!==null)
+$this->_mode=$style->_mode;
+}
+}
+} + +abstract class TDataGridColumn extends TComponent
+{
+private $_owner=null;
+private $_viewState=array(); +public function getHeaderText()
+{
+return $this->getViewState('HeaderText','');
+} +public function setHeaderText($value)
+{
+$this->setViewState('HeaderText',$value,'');
+$this->onColumnChanged();
+} +public function getHeaderImageUrl()
+{
+return $this->getViewState('HeaderImageUrl','');
+} +public function setHeaderImageUrl($value)
+{
+$this->setViewState('HeaderImageUrl',$value,'');
+$this->onColumnChanged();
+} +public function getHeaderStyle($createStyle=true)
+{
+if(($style=$this->getViewState('HeaderStyle',null))===null && $createStyle)
+{
+$style=new TTableItemStyle;
+$this->setViewState('HeaderStyle',$style,null);
+}
+return $style;
+} +public function getFooterText()
+{
+return $this->getViewState('FooterText','');
+} +public function setFooterText($value)
+{
+$this->setViewState('FooterText',$value,'');
+$this->onColumnChanged();
+} +public function getFooterStyle($createStyle=true)
+{
+if(($style=$this->getViewState('FooterStyle',null))===null && $createStyle)
+{
+$style=new TTableItemStyle;
+$this->setViewState('FooterStyle',$style,null);
+}
+return $style;
+} +public function getItemStyle($createStyle=true)
+{
+if(($style=$this->getViewState('ItemStyle',null))===null && $createStyle)
+{
+$style=new TTableItemStyle;
+$this->setViewState('ItemStyle',$style,null);
+}
+return $style;
+} +public function setSortExpression($value)
+{
+$this->setViewState('SortExpression',$value,'');
+$this->onColumnChanged();
+} +public function getSortExpression()
+{
+return $this->getViewState('SortExpression','');
+} +public function getVisible($checkParents=true)
+{
+return $this->getViewState('Visible',true);
+} +public function setVisible($value)
+{
+$this->setViewState('Visible',TPropertyValue::ensureBoolean($value),true);
+$this->onColumnChanged();
+} +protected function getViewState($key,$defaultValue=null)
+{
+return isset($this->_viewState[$key])?$this->_viewState[$key]:$defaultValue;
+} +protected function setViewState($key,$value,$defaultValue=null)
+{
+if($value===$defaultValue)
+unset($this->_viewState[$key]);
+else
+$this->_viewState[$key]=$value;
+} +public function loadState($state)
+{
+$this->_viewState=$state;
+} +public function saveState()
+{
+return $this->_viewState;
+} +public function getOwner()
+{
+return $this->_owner;
+} +public function setOwner(TDataGrid $value)
+{
+$this->_owner=$value;
+} +public function onColumnChanged()
+{
+if($this->_owner)
+$this->_owner->onColumnsChanged();
+} +public function initialize()
+{
+} +protected function getDataFieldValue($data,$field)
+{
+if(is_array($data))
+return $data[$field];
+else if($data instanceof TMap)
+return $data->itemAt($field);
+else if(($data instanceof TComponent) && $data->canGetProperty($field))
+{
+$getter='get'.$field;
+return $data->$getter();
+}
+else
+throw new TInvalidDataValueException('datagridcolumn_data_invalid');
+} +public function initializeCell($cell,$columnIndex,$itemType)
+{
+switch($itemType)
+{
+case 'Header':
+$sortExpression=$this->getSortExpression();
+$allowSorting=$sortExpression!=='' && (!$this->_owner || $this->_owner->getAllowSorting());
+if($allowSorting)
+{
+if(($url=$this->getHeaderImageUrl())!=='')
+{
+$button=Prado::createComponent('System.Web.UI.WebControls.TImageButton');
+$button->setImageUrl($url);
+$button->setCommandName('Sort');
+$button->setCommandParameter($sortExpression);
+$button->setCausesValidation(false);
+$cell->getControls()->add($button);
+}
+else if(($text=$this->getHeaderText())!=='')
+{
+$button=Prado::createComponent('System.Web.UI.WebControls.TLinkButton');
+$button->setText($text);
+$button->setCommandName('Sort');
+$button->setCommandParameter($sortExpression);
+$button->setCausesValidation(false);
+$cell->getControls()->add($button);
+}
+else
+$cell->setText(' ');
+}
+else
+{
+if(($url=$this->getHeaderImageUrl())!=='')
+{
+$image=Prado::createComponent('System.Web.UI.WebControls.TImage');
+$image->setImageUrl($url);
+$cell->getControls()->add($image);
+}
+else
+{
+if(($text=$this->getHeaderText())==='')
+$text=' ';
+$cell->setText($text);
+}
+}
+break;
+case 'Footer':
+if(($text=$this->getFooterText())==='')
+$text=' ';
+$cell->setText($text);
+break;
+}
+} +protected function formatDataValue($formatString,$value)
+{
+return $formatString===''?TPropertyValue::ensureString($value):sprintf($formatString,$value);
+}
+} -class TBoundColumn extends TDataGridColumn -{ -public function getDataField() - { - return $this->getViewState('DataField',''); - } -public function setDataField($value) - { - $this->setViewState('DataField',$value,''); - $this->onColumnChanged(); - } -public function getDataFormatString() - { - return $this->getViewState('DataFormatString',''); - } -public function setDataFormatString($value) - { - $this->setViewState('DataFormatString',$value,''); - $this->onColumnChanged(); - } -public function getReadOnly() - { - return $this->getViewState('ReadOnly',false); - } -public function setReadOnly($value) - { - $this->setViewState('ReadOnly',TPropertyValue::ensureBoolean($value),false); - $this->onColumnChanged(); - } -public function initializeCell($cell,$columnIndex,$itemType) - { - parent::initializeCell($cell,$columnIndex,$itemType); - switch($itemType) - { - case 'EditItem': - $control=$cell; - if(!$this->getReadOnly()) - { - $textBox=Prado::createComponent('System.Web.UI.WebControls.TTextBox'); - $cell->getControls()->add($textBox); - $control=$textBox; - } - if(($dataField=$this->getDataField())!=='') - $control->attachEventHandler('OnDataBinding',array($this,'dataBindColumn')); - break; - case 'Item': - case 'AlternatingItem': - case 'SelectedItem': - if(($dataField=$this->getDataField())!=='') - $cell->attachEventHandler('OnDataBinding',array($this,'dataBindColumn')); - break; - } - } -public function dataBindColumn($sender,$param) - { - $item=$sender->getNamingContainer(); - $data=$item->getDataItem(); - $formatString=$this->getDataFormatString(); - if(($field=$this->getDataField())!=='') - $value=$this->formatDataValue($formatString,$this->getDataFieldValue($data,$field)); - else - $value=$this->formatDataValue($data); - if(($sender instanceof TTableCell) || ($sender instanceof TTextBox)) - $sender->setText($value); - } -protected function formatDataValue($formatString,$value) - { - return $formatString===''?TPropertyValue::ensureString($value):sprintf($formatString,$value); - } -} -?><?php +class TBoundColumn extends TDataGridColumn
+{ +public function getDataField()
+{
+return $this->getViewState('DataField','');
+} +public function setDataField($value)
+{
+$this->setViewState('DataField',$value,'');
+$this->onColumnChanged();
+} +public function getDataFormatString()
+{
+return $this->getViewState('DataFormatString','');
+} +public function setDataFormatString($value)
+{
+$this->setViewState('DataFormatString',$value,'');
+$this->onColumnChanged();
+} +public function getReadOnly()
+{
+return $this->getViewState('ReadOnly',false);
+} +public function setReadOnly($value)
+{
+$this->setViewState('ReadOnly',TPropertyValue::ensureBoolean($value),false);
+$this->onColumnChanged();
+} +public function initializeCell($cell,$columnIndex,$itemType)
+{
+parent::initializeCell($cell,$columnIndex,$itemType);
+switch($itemType)
+{
+case 'EditItem':
+$control=$cell;
+if(!$this->getReadOnly())
+{
+$textBox=Prado::createComponent('System.Web.UI.WebControls.TTextBox');
+$cell->getControls()->add($textBox);
+$control=$textBox;
+}
+if(($dataField=$this->getDataField())!=='')
+$control->attachEventHandler('OnDataBinding',array($this,'dataBindColumn'));
+break;
+case 'Item':
+case 'AlternatingItem':
+case 'SelectedItem':
+if(($dataField=$this->getDataField())!=='')
+$cell->attachEventHandler('OnDataBinding',array($this,'dataBindColumn'));
+break;
+}
+} +public function dataBindColumn($sender,$param)
+{
+$item=$sender->getNamingContainer();
+$data=$item->getDataItem();
+$formatString=$this->getDataFormatString();
+if(($field=$this->getDataField())!=='')
+$value=$this->formatDataValue($formatString,$this->getDataFieldValue($data,$field));
+else
+$value=$this->formatDataValue($formatString,$data);
+if(($sender instanceof TTableCell) || ($sender instanceof TTextBox))
+$sender->setText($value);
+}
+} -class TButtonColumn extends TDataGridColumn -{ -public function getText() - { - return $this->getViewState('Text',''); - } -public function setText($value) - { - $this->setViewState('Text',$value,''); - $this->onColumnChanged(); - } -public function getDataTextField() - { - return $this->getViewState('DataTextField',''); - } -public function setDataTextField($value) - { - $this->setViewState('DataTextField',$value,''); - $this->onColumnChanged(); - } -public function getDataTextFormatString() - { - return $this->getViewState('DataTextFormatString',''); - } -public function setDataTextFormatString($value) - { - $this->setViewState('DataTextFormatString',$value,''); - $this->onColumnChanged(); - } -public function getButtonType() - { - return $this->getViewState('ButtonType','LinkButton'); - } -public function setButtonType($value) - { - $this->setViewState('ButtonType',TPropertyValue::ensureEnum($value,'LinkButton','PushButton'),'LinkButton'); - $this->onColumnChanged(); - } -public function getCommandName() - { - return $this->getViewState('CommandName',''); - } -public function setCommandName($value) - { - $this->setViewState('CommandName',$value,''); - $this->onColumnChanged(); - } -public function getCausesValidation() - { - return $this->getViewState('CausesValidation',true); - } -public function setCausesValidation($value) - { - $this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true); - $this->onColumnChanged(); - } -public function getValidationGroup() - { - return $this->getViewState('ValidationGroup',''); - } -public function setValidationGroup($value) - { - $this->setViewState('ValidationGroup',$value,''); - $this->onColumnChanged(); - } -public function initializeCell($cell,$columnIndex,$itemType) - { - parent::initializeCell($cell,$columnIndex,$itemType); - if($itemType==='Item' || $itemType==='AlternatingItem' || $itemType==='SelectedItem' || $itemType==='EditItem') - { - if($this->getButtonType()==='LinkButton') - $button=Prado::createComponent('System.Web.UI.WebControls.TLinkButton'); - else - $button=Prado::createComponent('System.Web.UI.WebControls.TButton'); - $button->setText($this->getText()); - $button->setCommandName($this->getCommandName()); - $button->setCausesValidation($this->getCausesValidation()); - $button->setValidationGroup($this->getValidationGroup()); - if($this->getDataTextField()!=='') - $button->attachEventHandler('OnDataBinding',array($this,'dataBindColumn')); - $cell->getControls()->add($button); - } - } -public function dataBindColumn($sender,$param) - { - if(($field=$this->getDataTextField())!=='') - { - $item=$sender->getNamingContainer(); - $data=$item->getDataItem(); - $value=$this->getDataFieldValue($data,$field); - $text=$this->formatDataValue($this->getDataTextFormatString(),$value); - if(($sender instanceof TLinkButton) || ($sender instanceof TButton)) - $sender->setText($text); - } - } -} -?><?php +class TButtonColumn extends TDataGridColumn
+{ +public function getText()
+{
+return $this->getViewState('Text','');
+} +public function setText($value)
+{
+$this->setViewState('Text',$value,'');
+$this->onColumnChanged();
+} +public function getDataTextField()
+{
+return $this->getViewState('DataTextField','');
+} +public function setDataTextField($value)
+{
+$this->setViewState('DataTextField',$value,'');
+$this->onColumnChanged();
+} +public function getDataTextFormatString()
+{
+return $this->getViewState('DataTextFormatString','');
+} +public function setDataTextFormatString($value)
+{
+$this->setViewState('DataTextFormatString',$value,'');
+$this->onColumnChanged();
+} +public function getButtonType()
+{
+return $this->getViewState('ButtonType','LinkButton');
+} +public function setButtonType($value)
+{
+$this->setViewState('ButtonType',TPropertyValue::ensureEnum($value,'LinkButton','PushButton'),'LinkButton');
+$this->onColumnChanged();
+} +public function getCommandName()
+{
+return $this->getViewState('CommandName','');
+} +public function setCommandName($value)
+{
+$this->setViewState('CommandName',$value,'');
+$this->onColumnChanged();
+} +public function getCausesValidation()
+{
+return $this->getViewState('CausesValidation',true);
+} +public function setCausesValidation($value)
+{
+$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);
+$this->onColumnChanged();
+} +public function getValidationGroup()
+{
+return $this->getViewState('ValidationGroup','');
+} +public function setValidationGroup($value)
+{
+$this->setViewState('ValidationGroup',$value,'');
+$this->onColumnChanged();
+} +public function initializeCell($cell,$columnIndex,$itemType)
+{
+parent::initializeCell($cell,$columnIndex,$itemType);
+if($itemType==='Item' || $itemType==='AlternatingItem' || $itemType==='SelectedItem' || $itemType==='EditItem')
+{
+if($this->getButtonType()==='LinkButton')
+$button=Prado::createComponent('System.Web.UI.WebControls.TLinkButton');
+else
+$button=Prado::createComponent('System.Web.UI.WebControls.TButton');
+$button->setText($this->getText());
+$button->setCommandName($this->getCommandName());
+$button->setCausesValidation($this->getCausesValidation());
+$button->setValidationGroup($this->getValidationGroup());
+if($this->getDataTextField()!=='')
+$button->attachEventHandler('OnDataBinding',array($this,'dataBindColumn'));
+$cell->getControls()->add($button);
+}
+} +public function dataBindColumn($sender,$param)
+{
+if(($field=$this->getDataTextField())!=='')
+{
+$item=$sender->getNamingContainer();
+$data=$item->getDataItem();
+$value=$this->getDataFieldValue($data,$field);
+$text=$this->formatDataValue($this->getDataTextFormatString(),$value);
+if(($sender instanceof TLinkButton) || ($sender instanceof TButton))
+$sender->setText($text);
+}
+}
+} -class TEditCommandColumn extends TDataGridColumn -{ -public function getButtonType() - { - return $this->getViewState('ButtonType','LinkButton'); - } -public function setButtonType($value) - { - $this->setViewState('ButtonType',TPropertyValue::ensureEnum($value,'LinkButton','PushButton'),'LinkButton'); - $this->onColumnChanged(); - } -public function getEditText() - { - return $this->getViewState('EditText',''); - } -public function setEditText($value) - { - $this->setViewState('EditText',$value,''); - $this->onColumnChanged(); - } -public function getUpdateText() - { - return $this->getViewState('UpdateText',''); - } -public function setUpdateText($value) - { - $this->setViewState('UpdateText',$value,''); - $this->onColumnChanged(); - } -public function getCancelText() - { - return $this->getViewState('CancelText',''); - } -public function setCancelText($value) - { - $this->setViewState('CancelText',$value,''); - $this->onColumnChanged(); - } -public function getCausesValidation() - { - return $this->getViewState('CausesValidation',true); - } -public function setCausesValidation($value) - { - $this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true); - $this->onColumnChanged(); - } -public function getValidationGroup() - { - return $this->getViewState('ValidationGroup',''); - } -public function setValidationGroup($value) - { - $this->setViewState('ValidationGroup',$value,''); - $this->onColumnChanged(); - } -public function initializeCell($cell,$columnIndex,$itemType) - { - parent::initializeCell($cell,$columnIndex,$itemType); - $buttonType=$this->getButtonType()=='LinkButton'?'TLinkButton':'TButton'; - if($itemType==='Item' || $itemType==='AlternatingItem' || $itemType==='SelectedItem') - $this->addButtonToCell($cell,'Edit',$this->getUpdateText(),false,''); - else if($itemType==='EditItem') - { - $this->addButtonToCell($cell,'Update',$this->getUpdateText(),$this->getCausesValidation(),$this->getValidationGroup()); - $cell->getControls()->add(' '); - $this->addButtonToCell($cell,'Cancel',$this->getUpdateText(),false,''); - } - } -private function addButtonToCell($cell,$commandName,$text,$causesValidation,$validationGroup) - { - if($this->getButtonType()==='LinkButton') - $button=Prado::createComponent('System.Web.UI.WebControls.TLinkButton'); - else - $button=Prado::createComponent('System.Web.UI.WebControls.TButton'); - $button->setText($text); - $button->setCommandName($commandName); - $button->setCausesValidation($causesValidation); - $button->setValidationGroup($validationGroup); - $cell->getControls()->add($button); - } -} -?><?php +class TEditCommandColumn extends TDataGridColumn
+{ +public function getButtonType()
+{
+return $this->getViewState('ButtonType','LinkButton');
+} +public function setButtonType($value)
+{
+$this->setViewState('ButtonType',TPropertyValue::ensureEnum($value,'LinkButton','PushButton'),'LinkButton');
+$this->onColumnChanged();
+} +public function getEditText()
+{
+return $this->getViewState('EditText','Edit');
+} +public function setEditText($value)
+{
+$this->setViewState('EditText',$value,'Edit');
+$this->onColumnChanged();
+} +public function getUpdateText()
+{
+return $this->getViewState('UpdateText','Update');
+} +public function setUpdateText($value)
+{
+$this->setViewState('UpdateText',$value,'Update');
+$this->onColumnChanged();
+} +public function getCancelText()
+{
+return $this->getViewState('CancelText','Cancel');
+} +public function setCancelText($value)
+{
+$this->setViewState('CancelText',$value,'Cancel');
+$this->onColumnChanged();
+} +public function getCausesValidation()
+{
+return $this->getViewState('CausesValidation',true);
+} +public function setCausesValidation($value)
+{
+$this->setViewState('CausesValidation',TPropertyValue::ensureBoolean($value),true);
+$this->onColumnChanged();
+} +public function getValidationGroup()
+{
+return $this->getViewState('ValidationGroup','');
+} +public function setValidationGroup($value)
+{
+$this->setViewState('ValidationGroup',$value,'');
+$this->onColumnChanged();
+} +public function initializeCell($cell,$columnIndex,$itemType)
+{
+parent::initializeCell($cell,$columnIndex,$itemType);
+$buttonType=$this->getButtonType()=='LinkButton'?'TLinkButton':'TButton';
+if($itemType==='Item' || $itemType==='AlternatingItem' || $itemType==='SelectedItem')
+$this->addButtonToCell($cell,'Edit',$this->getUpdateText(),false,'');
+else if($itemType==='EditItem')
+{
+$this->addButtonToCell($cell,'Update',$this->getUpdateText(),$this->getCausesValidation(),$this->getValidationGroup());
+$cell->getControls()->add(' ');
+$this->addButtonToCell($cell,'Cancel',$this->getUpdateText(),false,'');
+}
+} +private function addButtonToCell($cell,$commandName,$text,$causesValidation,$validationGroup)
+{
+if($this->getButtonType()==='LinkButton')
+$button=Prado::createComponent('System.Web.UI.WebControls.TLinkButton');
+else
+$button=Prado::createComponent('System.Web.UI.WebControls.TButton');
+$button->setText($text);
+$button->setCommandName($commandName);
+$button->setCausesValidation($causesValidation);
+$button->setValidationGroup($validationGroup);
+$cell->getControls()->add($button);
+}
+} -class THyperLinkColumn extends TDataGridColumn -{ -public function getText() - { - return $this->getViewState('Text',''); - } -public function setText($value) - { - $this->setViewState('Text',$value,''); - $this->onColumnChanged(); - } -public function getDataTextField() - { - return $this->getViewState('DataTextField',''); - } -public function setDataTextField($value) - { - $this->setViewState('DataTextField',$value,''); - $this->onColumnChanged(); - } -public function getDataTextFormatString() - { - return $this->getViewState('DataTextFormatString',''); - } -public function setDataTextFormatString($value) - { - $this->setViewState('DataTextFormatString',$value,''); - $this->onColumnChanged(); - } -public function getNavigateUrl() - { - return $this->getViewState('NavigateUrl',''); - } -public function setNavigateUrl($value) - { - $this->setViewState('NavigateUrl',$value,''); - $this->onColumnChanged(); - } -public function getDataNavigateUrlField() - { - return $this->getViewState('DataNavigateUrlField',''); - } -public function setDataNavigateUrlField($value) - { - $this->setViewState('DataNavigateUrlField',$value,''); - $this->onColumnChanged(); - } -public function getDataNavigateUrlFormatString() - { - return $this->getViewState('DataNavigateUrlFormatString',''); - } -public function setDataNavigateUrlFormatString($value) - { - $this->setViewState('DataNavigateUrlFormatString',$value,''); - $this->onColumnChanged(); - } -public function getTarget() - { - return $this->getViewState('Target',''); - } -public function setTarget($value) - { - $this->setViewState('Target',$value,''); - $this->onColumnChanged(); - } -public function initializeCell($cell,$columnIndex,$itemType) - { - parent::initializeCell($cell,$columnIndex,$itemType); - if($itemType==='Item' || $itemType==='AlternatingItem' || $itemType==='SelectedItem' || $itemType==='EditItem') - { - $link=Prado::createComponent('System.Web.UI.WebControls.THyperLink'); - $link->setText($this->getText()); - $link->setNavigateUrl($this->getNavigateUrl()); - $link->setTarget($this->getTarget()); - if($this->getDataTextField()!=='' || $this->getDataNavigateUrlField()!=='') - $link->attachEventHandler('OnDataBinding',array($this,'dataBindColumn')); - $cell->getControls()->add($link); - } - } -public function dataBindColumn($sender,$param) - { - $item=$sender->getNamingContainer(); - $data=$item->getDataItem(); - if(($field=$this->getDataTextField())!=='') - { - $value=$this->getDataFieldValue($data,$field); - $text=$this->formatDataValue($this->getDataTextFormatString(),$value); - $sender->setText($text); - } - if(($field=$this->getDataNavigateUrlField())!=='') - { - $value=$this->getDataFieldValue($data,$field); - $url=$this->formatDataValue($this->getDataNavigateUrlFormatString(),$value); - $sender->setNavigateUrl($url); - } - } -} -?><?php +class THyperLinkColumn extends TDataGridColumn
+{ +public function getText()
+{
+return $this->getViewState('Text','');
+} +public function setText($value)
+{
+$this->setViewState('Text',$value,'');
+$this->onColumnChanged();
+} +public function getDataTextField()
+{
+return $this->getViewState('DataTextField','');
+} +public function setDataTextField($value)
+{
+$this->setViewState('DataTextField',$value,'');
+$this->onColumnChanged();
+} +public function getDataTextFormatString()
+{
+return $this->getViewState('DataTextFormatString','');
+} +public function setDataTextFormatString($value)
+{
+$this->setViewState('DataTextFormatString',$value,'');
+$this->onColumnChanged();
+} +public function getNavigateUrl()
+{
+return $this->getViewState('NavigateUrl','');
+} +public function setNavigateUrl($value)
+{
+$this->setViewState('NavigateUrl',$value,'');
+$this->onColumnChanged();
+} +public function getDataNavigateUrlField()
+{
+return $this->getViewState('DataNavigateUrlField','');
+} +public function setDataNavigateUrlField($value)
+{
+$this->setViewState('DataNavigateUrlField',$value,'');
+$this->onColumnChanged();
+} +public function getDataNavigateUrlFormatString()
+{
+return $this->getViewState('DataNavigateUrlFormatString','');
+} +public function setDataNavigateUrlFormatString($value)
+{
+$this->setViewState('DataNavigateUrlFormatString',$value,'');
+$this->onColumnChanged();
+} +public function getTarget()
+{
+return $this->getViewState('Target','');
+} +public function setTarget($value)
+{
+$this->setViewState('Target',$value,'');
+$this->onColumnChanged();
+} +public function initializeCell($cell,$columnIndex,$itemType)
+{
+parent::initializeCell($cell,$columnIndex,$itemType);
+if($itemType==='Item' || $itemType==='AlternatingItem' || $itemType==='SelectedItem' || $itemType==='EditItem')
+{
+$link=Prado::createComponent('System.Web.UI.WebControls.THyperLink');
+$link->setText($this->getText());
+$link->setNavigateUrl($this->getNavigateUrl());
+$link->setTarget($this->getTarget());
+if($this->getDataTextField()!=='' || $this->getDataNavigateUrlField()!=='')
+$link->attachEventHandler('OnDataBinding',array($this,'dataBindColumn'));
+$cell->getControls()->add($link);
+}
+} +public function dataBindColumn($sender,$param)
+{
+$item=$sender->getNamingContainer();
+$data=$item->getDataItem();
+if(($field=$this->getDataTextField())!=='')
+{
+$value=$this->getDataFieldValue($data,$field);
+$text=$this->formatDataValue($this->getDataTextFormatString(),$value);
+$sender->setText($text);
+}
+if(($field=$this->getDataNavigateUrlField())!=='')
+{
+$value=$this->getDataFieldValue($data,$field);
+$url=$this->formatDataValue($this->getDataNavigateUrlFormatString(),$value);
+$sender->setNavigateUrl($url);
+}
+}
+} -class TTemplateColumn extends TDataGridColumn -{ -const CACHE_EXPIRY=18000; -private $_itemTemplate=''; - private $_editItemTemplate=''; - private $_headerTemplate=''; - private $_footerTemplate=''; - private static $_templates=array(); -public function getEditItemTemplate() - { - return $this->_editItemTemplate; - } -public function setEditItemTemplate($value) - { - $this->_editItemTemplate=$value; - } -public function getItemTemplate() - { - return $this->_itemTemplate; - } -public function setItemTemplate($value) - { - $this->_itemTemplate=$value; - } -public function getHeaderTemplate() - { - return $this->_headerTemplate; - } -public function setHeaderTemplate($value) - { - $this->_headerTemplate=$value; - } -public function getFooterTemplate() - { - return $this->_footerTemplate; - } -public function setFooterTemplate($value) - { - $this->_footerTemplate=$value; - } -public function initializeCell($cell,$columnIndex,$itemType) - { - parent::initializeCell($cell,$columnIndex,$itemType); - $tplContent=''; - switch($itemType) - { - case 'Header': - $tplContent=$this->_headerTemplate; - break; - case 'Footer': - $tplContent=$this->_footerTemplate; - break; - case 'Item': - case 'AlternatingItem': - case 'SelectedItem': - $tplContent=$this->_itemTemplate; - break; - case 'EditItem': - $tplContent=$this->_editItemTemplate===''?$this->_itemTemplate:$this->_editItemTemplate; - break; - } - if($tplContent!=='') - { - $cell->setText(''); - $cell->getControls()->clear(); - $this->createTemplate($tplContent)->instantiateIn($cell); - } - } -protected function createTemplate($str) - { - $key=md5($str); - if(isset(self::$_templates[$key])) - return self::$_templates[$key]; - else - { - $contextPath=$this->getOwner()->getTemplateControl()->getTemplate()->getContextPath(); - if(($cache=$this->getApplication()->getCache())!==null) - { - if(($template=$cache->get($key))===null) - { - $template=new TTemplate($str,$contextPath); - $cache->set($key,$template,self::CACHE_EXPIRY); - } - } - else - $template=new TTemplate($str,$contextPath); - self::$_templates[$key]=$template; - return $template; - } - } +class TTemplateColumn extends TDataGridColumn
+{ +private $_itemTemplate=null;
+private $_editItemTemplate=null;
+private $_headerTemplate=null;
+private $_footerTemplate=null; +public function getEditItemTemplate()
+{
+return $this->_editItemTemplate;
+} +public function setEditItemTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_editItemTemplate=$value;
+else
+throw new TInvalidDataTypeException('templatecolumn_template_required','EditItemTemplate');
+} +public function getItemTemplate()
+{
+return $this->_itemTemplate;
+} +public function setItemTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_itemTemplate=$value;
+else
+throw new TInvalidDataTypeException('templatecolumn_template_required','ItemTemplate');
+} +public function getHeaderTemplate()
+{
+return $this->_headerTemplate;
+} +public function setHeaderTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_headerTemplate=$value;
+else
+throw new TInvalidDataTypeException('templatecolumn_template_required','HeaderTemplate');
+} +public function getFooterTemplate()
+{
+return $this->_footerTemplate;
+} +public function setFooterTemplate($value)
+{
+if($value instanceof ITemplate || $value===null)
+$this->_footerTemplate=$value;
+else
+throw new TInvalidDataTypeException('templatecolumn_template_required','FooterTemplate');
+} +public function initializeCell($cell,$columnIndex,$itemType)
+{
+parent::initializeCell($cell,$columnIndex,$itemType);
+$template=null;
+switch($itemType)
+{
+case 'Header':
+$template=$this->_headerTemplate;
+break;
+case 'Footer':
+$template=$this->_footerTemplate;
+break;
+case 'Item':
+case 'AlternatingItem':
+case 'SelectedItem':
+$template=$this->_itemTemplate;
+break;
+case 'EditItem':
+$template=$this->_editItemTemplate===null?$this->_itemTemplate:$this->_editItemTemplate;
+break;
+}
+if($template!==null)
+{
+$cell->setText('');
+$cell->getControls()->clear();
+$template->instantiateIn($cell);
+}
+else
+$cell->setText(' ');
+}
} ?>
\ No newline at end of file |