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; }