[ Index ]

krapohl.info

title

Body

[close]

/pnincludes/Smarty/ -> Config_File.class.php (source)

   1  <?php
   2  
   3  /**
   4   * Config_File class.
   5   *
   6   * @version 2.3.1
   7   * @author Andrei Zmievski <andrei@php.net>
   8   * @access public
   9   * 
  10   * Copyright: 2001,2002 ispi of Lincoln, Inc.
  11   *
  12   * This library is free software; you can redistribute it and/or
  13   * modify it under the terms of the GNU Lesser General Public
  14   * License as published by the Free Software Foundation; either
  15   * version 2.1 of the License, or (at your option) any later version.
  16   *
  17   * This library is distributed in the hope that it will be useful,
  18   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20   * Lesser General Public License for more details.
  21   *
  22   * You should have received a copy of the GNU Lesser General Public
  23   * License along with this library; if not, write to the Free Software
  24   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  25   *
  26   * You may contact the author of Config_File by e-mail at:
  27   * andrei@php.net
  28   *
  29   * Or, write to:
  30   * Andrei Zmievski
  31   * Software Engineer, ispi
  32   * 237 S. 70th suite 220
  33   * Lincoln, NE 68510
  34   *
  35   * The latest version of Config_File can be obtained from:
  36   * http://www.phpinsider.com
  37   */
  38  
  39  class Config_File {
  40      /* Options */
  41      /**
  42       * Controls whether variables with the same name overwrite each other.
  43       * 
  44       * @access public
  45       */
  46      var $overwrite        =    true;
  47  
  48      /**
  49       * Controls whether config values of on/true/yes and off/false/no get
  50       * converted to boolean values automatically.
  51       *
  52       * @access public
  53       */
  54      var $booleanize        =    true;
  55  
  56      /**
  57       * Controls whether hidden config sections/vars are read from the file.
  58       *
  59       * @access public
  60       */
  61      var $read_hidden     =    true;
  62  
  63      /**
  64       * Controls whether or not to fix mac or dos formatted newlines.
  65       * If set to true, \r or \r\n will be changed to \n.
  66       *
  67       * @access public
  68       */
  69      var $fix_newlines =    true;    
  70      
  71      /* Private variables */
  72      var $_config_path    = "";
  73      var $_config_data    = array();
  74      var $_separator        = "";
  75  
  76  
  77      /**
  78       * Constructs a new config file class.
  79       *
  80       * @param $config_path string (optional) path to the config files
  81       * @access public
  82       */
  83  	function Config_File($config_path = NULL)
  84      {
  85          if (substr(PHP_OS, 0, 3) == "WIN" || substr(PHP_OS, 0, 4) == "OS/2")
  86              $this->_separator = "\\";
  87          else
  88              $this->_separator = "/";
  89  
  90          if (isset($config_path))
  91              $this->set_path($config_path);
  92      }
  93  
  94  
  95      /**
  96       * Set the path where configuration files can be found.
  97       *
  98       * @param $config_path string  path to the config files
  99       * @access public
 100       */
 101  	function set_path($config_path)
 102      {
 103          if (!empty($config_path)) {
 104              if (!is_string($config_path) || !file_exists($config_path) || !is_dir($config_path)) {
 105                  $this->_trigger_error_msg("Bad config file path '$config_path'");
 106                  return;
 107              }
 108  
 109              $this->_config_path = $config_path . $this->_separator;
 110          }
 111      }
 112  
 113      
 114      /**
 115       * Retrieves config info based on the file, section, and variable name.
 116       *
 117       * @access public
 118       * @param $file_name string config file to get info for
 119       * @param $section_name string (optional) section to get info for
 120       * @param $var_name string (optional) variable to get info for
 121       * @return mixed a value or array of values
 122       */
 123      function &get($file_name, $section_name = NULL, $var_name = NULL)
 124      {
 125          if (empty($file_name)) {
 126              $this->_trigger_error_msg('Empty config file name');
 127              return;
 128          } else {
 129              $file_name = $this->_config_path . $file_name;
 130              if (!isset($this->_config_data[$file_name]))
 131                  $this->load_file($file_name, false);
 132          }
 133          
 134          if (!empty($var_name)) {
 135              if (empty($section_name)) {
 136                  return $this->_config_data[$file_name]["vars"][$var_name];
 137              } else {
 138                  if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name]))
 139                      return $this->_config_data[$file_name]["sections"][$section_name]["vars"][$var_name];
 140                  else
 141                      return array();
 142              }
 143          } else {
 144              if (empty($section_name)) {
 145                  return (array)$this->_config_data[$file_name]["vars"];
 146              } else {
 147                  if(isset($this->_config_data[$file_name]["sections"][$section_name]["vars"]))
 148                      return (array)$this->_config_data[$file_name]["sections"][$section_name]["vars"];
 149                  else
 150                      return array();
 151              }
 152          }
 153      }
 154      
 155  
 156      /**
 157       * Retrieves config info based on the key.
 158       *
 159       * @access public
 160       * @param $file_name string config key (filename/section/var)
 161       * @return mixed a value or array of values
 162       */
 163      function &get_key($config_key)
 164      {
 165          list($file_name, $section_name, $var_name) = explode('/', $config_key, 3);
 166          $result = &$this->get($file_name, $section_name, $var_name);
 167          return $result;
 168      }
 169  
 170      /**
 171       * Get all loaded config file names.
 172       *
 173       * @access public
 174       * @return array an array of loaded config file names
 175       */
 176  	function get_file_names()
 177      {
 178          return array_keys($this->_config_data);
 179      }
 180      
 181  
 182      /**
 183       * Get all section names from a loaded file.
 184       *
 185       * @access public
 186       * @param  $file_name string config file to get section names from
 187       * @return array an array of section names from the specified file
 188       */
 189  	function get_section_names($file_name)
 190      {
 191          $file_name = $this->_config_path . $file_name;
 192          if (!isset($this->_config_data[$file_name])) {
 193              $this->_trigger_error_msg("Unknown config file '$file_name'");
 194              return;
 195          }
 196          
 197          return array_keys($this->_config_data[$file_name]["sections"]);
 198      }
 199      
 200  
 201      /**
 202       * Get all global or section variable names.
 203       *
 204       * @access public
 205       * @param $file_name string config file to get info for
 206       * @param $section_name string (optional) section to get info for
 207       * @return array an array of variables names from the specified file/section
 208       */
 209  	function get_var_names($file_name, $section = NULL)
 210      {
 211          if (empty($file_name)) {
 212              $this->_trigger_error_msg('Empty config file name');
 213              return;
 214          } else if (!isset($this->_config_data[$file_name])) {
 215              $this->_trigger_error_msg("Unknown config file '$file_name'");
 216              return;
 217          }
 218          
 219          if (empty($section))
 220              return array_keys($this->_config_data[$file_name]["vars"]);
 221          else
 222              return array_keys($this->_config_data[$file_name]["sections"][$section]["vars"]);
 223      }
 224      
 225  
 226      /**
 227       * Clear loaded config data for a certain file or all files.
 228       *
 229       * @access public
 230       * @param  $file_name string file to clear config data for
 231       */
 232  	function clear($file_name = NULL)
 233      {
 234          if ($file_name === NULL)
 235              $this->_config_data = array();
 236          else if (isset($this->_config_data[$file_name]))
 237              $this->_config_data[$file_name] = array();
 238      }
 239  
 240  
 241      /**
 242       * Load a configuration file manually.
 243       *
 244       * @access public
 245       * @param  $file_name string file name to load
 246       * @param  $prepend_path boolean whether current config path should be prepended to the filename
 247       */
 248  	function load_file($file_name, $prepend_path = true)
 249      {
 250          if ($prepend_path && $this->_config_path != "")
 251              $config_file = $this->_config_path . $file_name;
 252          else
 253              $config_file = $file_name;
 254  
 255          ini_set('track_errors', true);
 256          $fp = @fopen($config_file, "r");
 257          if (!is_resource($fp)) {
 258              $this->_trigger_error_msg("Could not open config file '$config_file'");
 259              return;
 260          }
 261  
 262          $contents = fread($fp, filesize($config_file));
 263          fclose($fp);
 264          
 265          if($this->fix_newlines) {
 266              // fix mac/dos formatted newlines
 267              $contents = preg_replace('!\r\n?!',"\n",$contents);
 268          }
 269  
 270          $config_data = array();
 271  
 272          /* Get global variables first. */
 273          if (preg_match("/^(.*?)(\n\[|\Z)/s", $contents, $match))
 274              $config_data["vars"] = $this->_parse_config_block($match[1]);
 275          
 276          /* Get section variables. */
 277          $config_data["sections"] = array();
 278          preg_match_all("/^\[(.*?)\]/m", $contents, $match);
 279          foreach ($match[1] as $section) {
 280              if ($section{0} == '.' && !$this->read_hidden)
 281                  continue;
 282              if (preg_match("/\[".preg_quote($section)."\](.*?)(\n\[|\Z)/s", $contents, $match))
 283                  if ($section{0} == '.')
 284                      $section = substr($section, 1);
 285                  $config_data["sections"][$section]["vars"] = $this->_parse_config_block($match[1]);
 286          }
 287  
 288          $this->_config_data[$config_file] = $config_data;
 289      }
 290  
 291      
 292  	function _parse_config_block($config_block)
 293      {
 294          $vars = array();
 295  
 296          /* First we grab the multi-line values. */
 297          if (preg_match_all("/^([^=\n]+)=\s*\"{3}(.*?)\"{3}\s*$/ms", $config_block, $match, PREG_SET_ORDER)) {
 298              for ($i = 0; $i < count($match); $i++) {
 299                  $this->_set_config_var($vars, trim($match[$i][1]), $match[$i][2], false);
 300              }
 301              $config_block = preg_replace("/^[^=\n]+=\s*\"{3}.*?\"{3}\s*$/ms", "", $config_block);
 302          }
 303          
 304          
 305          $config_lines = preg_split("/\n+/", $config_block);
 306  
 307          foreach ($config_lines as $line) {
 308              if (preg_match("/^\s*(\.?\w+)\s*=(.*)/", $line, $match)) {
 309                  $var_value = preg_replace('/^([\'"])(.*)\1$/', '\2', trim($match[2]));
 310                  $this->_set_config_var($vars, trim($match[1]), $var_value, $this->booleanize);
 311              }
 312          }
 313  
 314          return $vars;
 315      }
 316      
 317  	function _set_config_var(&$container, $var_name, $var_value, $booleanize)
 318      {
 319          if ($var_name{0} == '.') {
 320              if (!$this->read_hidden)
 321                  return;
 322              else
 323                  $var_name = substr($var_name, 1);
 324          }
 325  
 326          if (!preg_match("/^[a-zA-Z_]\w*$/", $var_name)) {
 327              $this->_trigger_error_msg("Bad variable name '$var_name'");
 328              return;
 329          }
 330  
 331          if ($booleanize) {
 332              if (preg_match("/^(on|true|yes)$/i", $var_value))
 333                  $var_value = true;
 334              else if (preg_match("/^(off|false|no)$/i", $var_value))
 335                  $var_value = false;
 336          }
 337                  
 338          if (!isset($container[$var_name]) || $this->overwrite)
 339              $container[$var_name] = $var_value;
 340          else {
 341              settype($container[$var_name], 'array');
 342              $container[$var_name][] = $var_value;
 343          }
 344      }
 345  
 346  	function _trigger_error_msg($error_msg, $error_type = E_USER_WARNING)
 347      {
 348          trigger_error("Config_File error: $error_msg", $error_type);
 349      }
 350  }
 351  
 352  ?>


Generated: Wed Feb 16 22:40:07 2005 Cross-referenced by PHPXref 0.6