xmlconfig.php

来自「视频监控网络部分的协议ddns,的模块的实现代码,请大家大胆指正.」· PHP 代码 · 共 329 行

PHP
329
字号
<?php//// +----------------------------------------------------------------------+// | PHP Version 4                                                        |// +----------------------------------------------------------------------+// | Copyright (c) 1997, 1998, 1999, 2000, 2001, 2002, 2003 The PHP Group |// +----------------------------------------------------------------------+// | This source file is subject to version 2.02 of the PHP license,      |// | that is bundled with this package in the file LICENSE, and is        |// | available at through the world-wide-web at                           |// | http://www.php.net/license/2_02.txt.                                 |// | If you did not receive a copy of the PHP license and are unable to   |// | obtain it through the world-wide-web, please send a note to          |// | license@php.net so we can mail you a copy immediately.               |// +----------------------------------------------------------------------+// | Authors: Wolfram Kriesing <wolfram@kriesing.de>                      |// +----------------------------------------------------------------------+//  $Id: XMLConfig.php,v 1.9 2003/01/29 11:58:19 cain Exp $//require_once 'HTML/Template/Xipe/Main.php';/****   @package    HTML_Template_Xipe*   @author     Wolfram Kriesing <wolfram@kriesing.de>*/class HTML_Template_Xipe_XMLConfig extends HTML_Template_Xipe_Main{    /**    *   applies the xml-config files and the xml config contained in the file    *    *   @access     private    *   @version    2002/03/11    *   @author     Wolfram Kriesing <wolfram@kriesing.de>    *   @return     true if the template should be recompiled, false otherwise    */    function _applyXmlConfig()    {        $xmlConfigFiles = $this->_getXmlConfigFiles();        if( sizeof($xmlConfigFiles) )        {            foreach( $xmlConfigFiles as $aConfigFile )                if( PEAR::isError($ret=$this->_setOptionsByXmlConfig($aConfigFile)) )                    return $ret;        }        // apply the xml config which is in the template file at last        if( ($cfgString = $this->_getXmlConfigString()) )            if( PEAR::isError($ret=$this->_setOptionsByXmlConfig( $cfgString , true )) )                return $ret;    }    /**    *   checks along the path of the current template for xml config files    *   and returns them in the order they shall be applied    *   the order is from the lowest path up to the actual template file    *    *   @access     public    *   @version    01/12/14    *   @author     Wolfram Kriesing <wolfram@kriesing.de>    */    function _getXmlConfigFiles()    {        $configFile = $this->getOption('xmlConfigFile');        // start at the templateDir and go up to the directory where the        // current template is in and return all xml-config files found on the way        $curTplDir = dirname($this->_templateFile);        // remove the template directory from the path to search in        // we start only at the templateDir-root        // and get every single directory in the $path-array        $path = explode( '/' , str_replace( $this->getOption('templateDir') , '' , $curTplDir ));        $xmlConfigFiles = array();        if(sizeof($path))        {            $curDir = $this->getOption('templateDir');            foreach($path as $aDir)            {                $curDir.= $aDir ? '/'.$aDir : '' ;  // add directory by directory to the curDir, until we got to the current tempalte's directory                $possibleConfigFile = $curDir.'/'.$configFile;  // the name of the possible xml-config file                if( file_exists($possibleConfigFile))                {                    $xmlConfigFiles[] = $possibleConfigFile;    // remember the xml config files that need to be applied to the current template                    if( !$this->_isUpToDate($possibleConfigFile) )  // check if one of the xml config files is newer than the compiled template                    {                        $this->_needsRecompile = true;  // if so remember that, so the template gets recompiled                        $this->_log('recompile because XML-config file is newer than compiled template: '.$possibleConfigFile);                    }                }            }        }        return $xmlConfigFiles;    }    /**    *   applies the given xml config file    *    *   @access     public    *   @version    01/12/14    *   @author     Wolfram Kriesing <wolfram@kriesing.de>    */    function _setOptionsByXmlConfig( $configFileOrString , $isString=false )    {//print '_setOptionsByXmlConfig ... '.nl2br(htmlentities($configFileOrString))." , $isString<br>";        // include this so i can get the xml file prepared in the tree shape        // and i can use the tree methods to retreive the options i need to set :-)        if( !@include_once('Tree/Tree.php') )        {            return $this->_error(   "xml-config could not be parsed, because the class 'Tree/Tree.php' could not be included<br>".                                    '1. pleace be sure to have the latest PEAR::Tree package installed '.                                    '(<a href="http://pear.php.net/package-info.php?pacid=104">you get it from here</a>)' ,                                    PEAR_ERROR_DIE );        }        if( $isString )        {            $config = Tree::setupMemory( 'XML' );            $config->setupByRawData( $configFileOrString );        }        else        {            $config = Tree::setupMemory( 'XML' , $configFileOrString );            $config->setup();        }        //        //  add the filters set in the xml config files        //// TODO check for prefilter defines in xml config        if( $id = $config->getIdByPath('html_template_xipe/prefilter') )  // are any preFilter given?        {            $this->_applyFiltersFromXMLConfig( $config , $id , true );        }        //        //  apply xml given options to this class, do this after applying the filters        //        if( $id = $config->getIdByPath('html_template_xipe/options') )  // are any options given?        {            $delimiter = $config->getElementByPath('delimiter',$id);            if( $delimiter )// set new delimiters?            {                $begin = $delimiter['attributes']['begin'];                $end = $delimiter['attributes']['end'];                if( $begin && $end )                // only if both delimiters are given !!!                {                    $setOptions['delimiter'] = array(trim($begin),trim($end));                }            }            if( $autoBraces = $config->getIdByPath('autobraces',$id) )// set autoBraces?            {                $setOptions['autoBraces'] = false;                if( strtolower(trim($config->data[$autoBraces]['attributes']['value'])) == 'true' )                    $setOptions['autoBraces'] = true;            }            if( $localeId = $config->getIdByPath('locale',$id) )// set locale?            {                $locale = trim($config->data[$localeId]['attributes']['value']);                if( $locale )                    $setOptions['locale'] = $locale;            }            //            //  find the cache tag            //  <cache>            //      <time value="10" unit="minutes"/>            //      <depends value="$_GET $_POST"/>            //  </cache>            //            if( $cacheId = $config->getIdByPath('cache',$id))  // cache-tag given?            {                if( @$config->data[$cacheId]['attributes']['dontcache']=='true' )                {                    $setOptions['cache']['time'] = false;                    $this->_log('XMLConfig: dont cache this file!');                }                else                    if( $timeId = $config->getIdByPath('time',$cacheId) )   // and the mandatory time-tag?                    {                        $time = $config->data[$timeId]['attributes']['value'];                        if( $unit = $config->data[$timeId]['attributes']['unit'] )                        {                            switch(strtolower($unit))                            {                                case 'week':                                case 'weeks':   $time = $time*7;                                case 'day':                                case 'days':    $time = $time*24;                                case 'hour':                                case 'hours':   $time = $time*60;                                case 'minute':                                case 'minutes': $time = $time*60;                                case 'second':  break;                            }                        }        //print "XML: cache this page for $time seconds<br><br>";                        // if a valid time was found parse also the other tags, valid is also 0, that's why this strange check                        // accept only integers                        if( $time == (int)$time )                        {                            $cacheOption['time'] = (int)$time;                            if( ($id = $config->getIdByPath('depends',$cacheId )) &&                                ($depends = $config->data[$id]['attributes']['value'] ))                            {                                $cacheOption['depends'] = $depends;                            }                            $setOptions['cache'] = $cacheOption;                        }                        else                        {                            $this->_log("ERROR in your xml config, caching-time: $time, is not valid, in: ".                                        $isString?'tpl-file-embedded config':$configFileOrString);                        }                    }            }            // apply the options to this class            $this->setOptions($setOptions);            $this->_applyOptionsToFilterClasses($setOptions);        }    }    /**    *   this method applies the given options to all the filters which are registered as object-methods    *   by definition every filter class that needs to know the delimiters or any option    *   set in this class here, needs to have an array options and make the methods setOptions available    *   which simply gets the options passed, the name for the options must be defined as in here    *    *   @access     public    *   @version    01/12/19    *   @param      array   $setOptions options to apply    *   @return     string  the modified template file, the config part is removed    *   @author     Wolfram Kriesing <wolfram@kriesing.de>    */    function _applyOptionsToFilterClasses($setOptions)    {        // go thru all filters and get each class ONCE in the variable $filters        $allFilters = array_merge( $this->_preFilters , $this->_postFilters );        foreach( $allFilters as $aFilter )        {            if( !is_array($aFilter) ||  // is it not an array so it is simply a function name                ( is_array($aFilter) && is_object($aFilter[0]) )    // or is it an array(&$object,'methodname')?              )            {                if( is_array($aFilter) )                    call_user_func( array(&$aFilter[0],'setOptions') , $setOptions );            }            else            {                if( is_array($aFilter[0]) )                    call_user_func( array(&$aFilter[0][0],'setOptions') , $setOptions );            }        }    }    /**    *   apply filter that are given in the xml-config    */    function _applyFiltersFromXMLConfig( &$treeObj , $elementId , $preFilter=false )    {        $filters = $treeObj->getChildrenIds($elementId);        $registerMethod = $preFilter ? 'registerPrefilter' : 'registerPostfilter' ;        $allFilterMethod = $preFilter ? 'allPrefilters' : 'allPostfilters' ;        foreach( $filters as $aFilter )        {// FIXXME we only handle a tiny bit of all possible settings yet            $class = @$treeObj->data[$aFilter]['attributes']['class'];            $classFile = @$treeObj->data[$aFilter]['attributes']['classFile'];            // do we have a class name? then make an instance of it and apply all(Pre|Post)Filters            if( $class )            {                if( !$classFile )                    $classFile = str_replace('_','/',$class).'.php';                require_once($classFile);                $filterInstance = new $class($this->options);                // for some reason php doesnt see 0 as a real param, so it would bring an error if this->getOp... returns 0                // so i have to pass it as a string :-/ very strange                $fLevel = $this->getOption('filterLevel') ? $this->getOption('filterLevel') : '0';                $this->$registerMethod(array(&$filterInstance,$allFilterMethod),$fLevel);            }        }    }    /**    *   find xml-tags for configuration inside the template    *    *   @access     public    *   @version    01/12/19    *   @author     Wolfram Kriesing <wolfram@kriesing.de>    *   @return     string      the xml-config string    */    function _getXmlConfigString()    {        // read the entire file into one variable        if( $input = @file($this->_templateFile) )            $fileContent = implode( '' , $input );        else            return false;        // remove all HTML-comments first, in case the config-part was commented out        require_once('HTML/Template/Xipe/Filter/Basic.php');    // do only include if we really get here, should save some time        $fileContent = HTML_Template_Xipe_Filter_Basic::removeHtmlComments($fileContent);        if( preg_match( '/<html_template_xipe>.*<\/html_template_xipe>/Uis' , $fileContent , $configString ) )        {            return $configString[0];        }        return false;    }}?>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?