Example #1
0
 function save($fileName = false, $suffix = false, $useOverride = false, $onlyModified = false, $useRootDir = true, $resetArrays = false, $encapsulateInPHP = true)
 {
     $lineSeparator = eZSys::lineSeparator();
     $pathArray = array();
     $dirArray = array();
     if ($fileName === false) {
         $fileName = $this->FileName;
     }
     if ($useRootDir === true) {
         $pathArray[] = $this->RootDir;
         $dirArray[] = $this->RootDir;
     } else {
         if (is_string($useRootDir)) {
             $pathArray[] = $useRootDir;
             $dirArray[] = $useRootDir;
         }
     }
     if ($useOverride) {
         $pathArray[] = 'override';
         $dirArray[] = 'override';
     }
     if ($useOverride === 'append') {
         $fileName .= '.append';
     }
     if ($suffix !== false) {
         $fileName .= $suffix;
     }
     /* Try to guess which filename would fit better: 'xxx.apend' or 'xxx.append.php'.
      * We choose 'xxx.append.php' in all cases except when
      * 'xxx.append' exists already and 'xxx.append.php' does not exist.
      */
     if (strstr($fileName, '.append')) {
         $fnAppend = preg_replace('#\\.php$#', '', $fileName);
         $fnAppendPhp = $fnAppend . '.php';
         $fpAppend = eZDir::path(array_merge($pathArray, array($fnAppend)));
         $fpAppendPhp = eZDir::path(array_merge($pathArray, array($fnAppendPhp)));
         $fileName = file_exists($fpAppend) && !file_exists($fpAppendPhp) ? $fnAppend : $fnAppendPhp;
     }
     $originalFileName = $fileName;
     $backupFileName = $originalFileName . eZSys::backupFilename();
     $fileName .= '.tmp';
     $dirPath = eZDir::path($dirArray);
     if (!file_exists($dirPath)) {
         eZDir::mkdir($dirPath, octdec('777'), true);
     }
     $filePath = eZDir::path(array_merge($pathArray, array($fileName)));
     $originalFilePath = eZDir::path(array_merge($pathArray, array($originalFileName)));
     $backupFilePath = eZDir::path(array_merge($pathArray, array($backupFileName)));
     $fp = @fopen($filePath, "w+");
     if (!$fp) {
         eZDebug::writeError("Failed opening file '{$filePath}' for writing", __METHOD__);
         return false;
     }
     $writeOK = true;
     $written = 0;
     $charset = $this->Codec ? $this->Codec->RequestedOutputCharsetCode : $this->Charset;
     if ($encapsulateInPHP) {
         $written = fwrite($fp, "<?php /* #?ini charset=\"{$charset}\"?{$lineSeparator}{$lineSeparator}");
     } else {
         $written = fwrite($fp, "#?ini charset=\"{$charset}\"?{$lineSeparator}{$lineSeparator}");
     }
     if ($written === false) {
         $writeOK = false;
     }
     $i = 0;
     if ($writeOK) {
         foreach (array_keys($this->BlockValues) as $blockName) {
             if ($onlyModified) {
                 $groupHasModified = false;
                 if (isset($this->ModifiedBlockValues[$blockName])) {
                     foreach ($this->ModifiedBlockValues[$blockName] as $modifiedValue) {
                         if ($modifiedValue) {
                             $groupHasModified = true;
                         }
                     }
                 }
                 if (!$groupHasModified) {
                     continue;
                 }
             }
             $written = 0;
             if ($i > 0) {
                 $written = fwrite($fp, "{$lineSeparator}");
             }
             if ($written === false) {
                 $writeOK = false;
                 break;
             }
             $written = fwrite($fp, "[{$blockName}]{$lineSeparator}");
             if ($written === false) {
                 $writeOK = false;
                 break;
             }
             foreach (array_keys($this->BlockValues[$blockName]) as $blockVariable) {
                 if ($onlyModified) {
                     if (!isset($this->ModifiedBlockValues[$blockName][$blockVariable]) or !$this->ModifiedBlockValues[$blockName][$blockVariable]) {
                         continue;
                     }
                 }
                 $varKey = $blockVariable;
                 $varValue = $this->BlockValues[$blockName][$blockVariable];
                 if (is_array($varValue)) {
                     if (count($varValue) > 0) {
                         $customResetArray = (isset($this->BlockValues[$blockName]['ResetArrays']) and $this->BlockValues[$blockName]['ResetArrays'] == 'false') ? true : false;
                         if ($resetArrays and !$customResetArray) {
                             $written = fwrite($fp, "{$varKey}" . "[]{$lineSeparator}");
                         }
                         foreach ($varValue as $varArrayKey => $varArrayValue) {
                             if (is_string($varArrayKey)) {
                                 $written = fwrite($fp, "{$varKey}" . "[{$varArrayKey}]={$varArrayValue}{$lineSeparator}");
                             } else {
                                 if ($varArrayValue == NULL) {
                                     $written = fwrite($fp, "{$varKey}" . "[]{$lineSeparator}");
                                 } else {
                                     $written = fwrite($fp, "{$varKey}" . "[]={$varArrayValue}{$lineSeparator}");
                                 }
                             }
                             if ($written === false) {
                                 break;
                             }
                         }
                     } else {
                         $written = fwrite($fp, "{$varKey}" . "[]{$lineSeparator}");
                     }
                 } else {
                     $written = fwrite($fp, "{$varKey}={$varValue}{$lineSeparator}");
                 }
                 if ($written === false) {
                     $writeOK = false;
                     break;
                 }
             }
             if (!$writeOK) {
                 break;
             }
             ++$i;
         }
     }
     if ($writeOK) {
         if ($encapsulateInPHP) {
             $written = fwrite($fp, "*/ ?>");
             if ($written === false) {
                 $writeOK = false;
             }
         }
     }
     @fclose($fp);
     if (!$writeOK) {
         unlink($filePath);
         return false;
     }
     chmod($filePath, self::$filePermission);
     if (file_exists($backupFilePath)) {
         unlink($backupFilePath);
     }
     if (file_exists($originalFilePath)) {
         if (!rename($originalFilePath, $backupFilePath)) {
             return false;
         }
     }
     if (!rename($filePath, $originalFilePath)) {
         rename($backupFilePath, $originalFilePath);
         return false;
     }
     return true;
 }