From a71fdccf3a58531ee22372db5a65fe923135b819 Mon Sep 17 00:00:00 2001 From: xue <> Date: Sun, 8 Jan 2006 05:50:31 +0000 Subject: Added TLogRouter, TLogger (not completed yet) --- .gitattributes | 1 + demos/quickstart/protected/controls/TopicList.tpl | 2 +- framework/Log/TLogRouter.php | 123 ++++++++++++++++++++++ framework/Web/UI/WebControls/TBaseValidator.php | 50 +++++---- framework/core.php | 72 +++++++++++++ 5 files changed, 229 insertions(+), 19 deletions(-) create mode 100644 framework/Log/TLogRouter.php diff --git a/.gitattributes b/.gitattributes index b93059f7..6e6aa3fb 100644 --- a/.gitattributes +++ b/.gitattributes @@ -431,6 +431,7 @@ framework/Log/EventLog/writers/writer_unix_file.php -text framework/Log/ILog.php -text framework/Log/TEventLog.php -text framework/Log/TLogManager.php -text +framework/Log/TLogRouter.php -text framework/Security/TAuthManager.php -text framework/Security/TAuthorizationRule.php -text framework/Security/TMembershipManager.php -text diff --git a/demos/quickstart/protected/controls/TopicList.tpl b/demos/quickstart/protected/controls/TopicList.tpl index 16f6b59d..5f81ef99 100644 --- a/demos/quickstart/protected/controls/TopicList.tpl +++ b/demos/quickstart/protected/controls/TopicList.tpl @@ -35,7 +35,7 @@ Overview
Simple HTML Controls
List Controls
-Validation Controls
+Validation Controls
TRepeater
TDataList
TDataGrid
diff --git a/framework/Log/TLogRouter.php b/framework/Log/TLogRouter.php new file mode 100644 index 00000000..9060e305 --- /dev/null +++ b/framework/Log/TLogRouter.php @@ -0,0 +1,123 @@ + + + +*/ +class TLogRouter extends TModule +{ + const CONFIG_FILE_EXT='.xml'; + private $_routes=array(); + + public function init($config) + { + foreach($config->getElementsByName('route') as $routeConfig) + { + $class=$routeConfig->removeAttribute('class'); + $route=Prado::createComponent($class); + foreach($routeConfig->getAttributes() as $name=>$value) + $route->setSubproperty($name,$value); + } + + $this->getApplication()->attachEventHandler('EndRequest',array($this,'collectLogs')); + } + + public function getConfigFile() + { + return $this->_configFile; + } + + public function setConfigFile($value) + { + if(($this->_configFile=Prado::getPathOfNamespace($value,self::LOG_FILE_EXT))===null) + throw new TConfigurationException('logrouter_configfile_invalid',$value); + } + + public function collectLogs($param) + { + foreach($this->_routes as $route) + $route->collectLogs(); + } +} + + +abstract class TLogRoute extends TComponent +{ + private static $_levelMap=array( + 'error'=>TLogger::ERROR, + 'debug'=>TLogger::DEBUG, + 'info'=>TLogger::INFO, + 'notice'=>TLogger::NOTICE, + 'warning'=>TLogger::WARNING, + 'error'=>TLogger::ERROR, + 'alert'=>TLogger::ALERT, + 'fatal'=>TLogger::FATAL + ); + private $_levels=null; + private $_categories=null; + + public function getLevels() + { + return $this->_levels; + } + + public function setLevels($levels) + { + $this->_levels=null; + $levels=strtolower($levels); + foreach(explode(',',$levels) as $level) + { + $level=trim($level); + if(isset(self::$_levelMap[$level])) + $this->_levels|=self::$_levelMap[$level]; + } + $this->_levels=$levels; + } + + public function getCategories() + { + return $this->_categories; + } + + public function setCategories($categories) + { + $this->_categories=null; + foreach(explode(',',$categories) as $category) + { + if(($category=trim($category))!=='') + $this->_categories[]=$category; + } + } + + public function collectLogs() + { + $logs=Prado::getLogger()->getLogs($this->getLevels(),$this->getCategories()); + $this->processLogs($logs); + } + + protected function processLogs($logs); +} + +class TFileLogRoute extends TLogRoute +{ + const LOG_FILE_EXT='.log'; + private $_file; + + public function getLogFile() + { + return $this->_file; + } + + public function setLogFile($value) + { + if(($this->_file=Prado::getPathOfNamespace($value,self::LOG_FILE_EXT))===null) + throw new TConfigurationException('filelogroute_logfile_invalid',$value); + } + + protected function processLogs($logs) + { + } +} + + +?> \ No newline at end of file diff --git a/framework/Web/UI/WebControls/TBaseValidator.php b/framework/Web/UI/WebControls/TBaseValidator.php index 0d88fc43..6326783a 100644 --- a/framework/Web/UI/WebControls/TBaseValidator.php +++ b/framework/Web/UI/WebControls/TBaseValidator.php @@ -99,6 +99,12 @@ abstract class TBaseValidator extends TLabel implements IValidator $this->setForeColor('red'); } + protected function onInit($param) + { + parent::onInit($param); + $this->getPage()->getValidators()->add($this); + } + /** * Adds attributes to renderer. * @param THtmlWriter the renderer @@ -133,8 +139,7 @@ abstract class TBaseValidator extends TLabel implements IValidator { $scripts = $this->getPage()->getClientScript(); $scriptKey = "prado:".get_class($this); - if($this->getEnableClientScript() - && !$script->isEndScriptRegistered($scriptKey)) + if($this->getEnableClientScript() && !$scripts->isEndScriptRegistered($scriptKey)) { $scripts->registerPradoScript('validator'); $js = "Prado.Validation.AddForm('{$this->Page->Form->ClientID}');"; @@ -254,7 +259,7 @@ abstract class TBaseValidator extends TLabel implements IValidator */ public function getFocusOnError() { - return $this->getViewState('FocusOnError',true); + return $this->getViewState('FocusOnError',false); } /** @@ -318,6 +323,28 @@ abstract class TBaseValidator extends TLabel implements IValidator $this->_isValid=TPropertyValue::ensureBoolean($value); } + protected function getValidationTarget() + { + if(($id=$this->getControlToValidate())!=='') + return $this->findControl($id); + else + return null; + } + + protected function getValidationValue($control) + { + if($control instanceof IValidatable) + { + $value=$control->getValidationValue(); + if($value instanceof TListItem) + return $value->getValue(); + else + return TPropertyValue::ensureString($value); + } + else + throw new TInvalidDataTypeException('basevalidator_validatable_required'); + } + /** * Validates the specified control. * Do not override this method. Override {@link evaluateIsValid} instead. @@ -326,22 +353,9 @@ abstract class TBaseValidator extends TLabel implements IValidator public function validate() { $this->setIsValid(true); - if($this->getVisible(true) && $this->getEnabled()) - { - $valid=$this->evaluateIsValid(); - $this->setValid($valid); - } - if($this->isVisible() && $this->isEnabled() && strlen($this->getControlToValidate())) - { + $control=$this->getValidationTarget(); + if($control && $this->getVisible(true) && $this->getEnabled()) $valid=$this->evaluateIsValid(); - $this->setValid($valid); - return $valid; - } - else - { - $this->setValid(true); - return true; - } } /** diff --git a/framework/core.php b/framework/core.php index 08481d09..3be75010 100644 --- a/framework/core.php +++ b/framework/core.php @@ -374,6 +374,10 @@ class PradoBase * @var TApplication the application instance */ private static $_application=null; + /** + * @var TLogger logger instance + */ + private static $_logger=null; /** * @return string the version of Prado framework @@ -718,6 +722,74 @@ class PradoBase $logger->info($msg); return $logger; } + + public static function log($msg,$level,$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 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()); + } + + 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(strpos($value[2],$category)===0) + return $value; + } + return false; + } + + private function filterByLevels($value) + { + if($level & $this->_levels) + return $value; + else + return false; + } } ?> \ No newline at end of file -- cgit v1.2.3