예제 #1
0
 function load($file)
 {
     Nette\Diagnostics\Debugger::tryError();
     $ini = parse_ini_file($file, TRUE);
     if (Nette\Diagnostics\Debugger::catchError($e)) {
         throw new Nette\InvalidStateException('parse_ini_file(): ' . $e->getMessage(), 0, $e);
     }
     $data = array();
     foreach ($ini as $secName => $secData) {
         if (is_array($secData)) {
             if (substr($secName, -1) === self::RAW_SECTION) {
                 $secName = substr($secName, 0, -1);
             } else {
                 $tmp = array();
                 foreach ($secData as $key => $val) {
                     $cursor =& $tmp;
                     $key = str_replace(self::ESCAPED_KEY_SEPARATOR, "�", $key);
                     foreach (explode(self::KEY_SEPARATOR, $key) as $part) {
                         $part = str_replace("�", self::KEY_SEPARATOR, $part);
                         if (!isset($cursor[$part]) || is_array($cursor[$part])) {
                             $cursor =& $cursor[$part];
                         } else {
                             throw new Nette\InvalidStateException("Invalid key '{$key}' in section [{$secName}] in file '{$file}'.");
                         }
                     }
                     $cursor = $val;
                 }
                 $secData = $tmp;
             }
             $parts = explode(self::INHERITING_SEPARATOR, $secName);
             if (count($parts) > 1) {
                 $secName = trim($parts[0]);
                 $secData[Config::EXTENDS_KEY] = trim($parts[1]);
             }
         }
         $cursor =& $data;
         foreach (explode(self::KEY_SEPARATOR, $secName) as $part) {
             if (!isset($cursor[$part]) || is_array($cursor[$part])) {
                 $cursor =& $cursor[$part];
             } else {
                 throw new Nette\InvalidStateException("Invalid section [{$secName}] in file '{$file}'.");
             }
         }
         if (is_array($secData) && is_array($cursor)) {
             $secData = Config::merge($secData, $cursor);
         }
         $cursor = $secData;
     }
     return $data;
 }