Project

General

Profile

Feature #23911 ยป 16215.diff

Administrator Admin, 2010-11-02 11:23

View differences:

t3lib/class.t3lib_install.php (working copy)
}
/**
* Takes an array with lines from localconf.php, finds a variable and inserts the new array value.
*
* @param array $lines the localconf.php file exploded into an array by line breaks. {@see writeToLocalconf_control()}
* @param string $variable the variable name to find and substitute. This string must match the first part of a trimmed line in the line-array. Matching is done backwards so the last appearing line will be substituted.
* @param array $value value to be assigned to the variable
* @return void
* @see writeToLocalconf_control()
*/
public function setArrayValueInLocalconfFile(array &$lines, $variable, array $value) {
$commentKey = '## ';
$inArray = in_array($commentKey . $this->localconf_editPointToken, $lines);
$tokenSet = $this->localconf_editPointToken && !$inArray; // Flag is set if the token should be set but is not yet
$stopAtToken = $this->localconf_editPointToken && $inArray;
$comment = 'Modified or inserted by ' . $this->updateIdentity . '.';
$format = "%s = %s;\t// " . $comment;
$insertPos = count($lines);
$startPos = 0;
if (!($this->localconf_addLinesOnly || $tokenSet)) {
for ($i = count($lines) - 1; $i > 0; $i--) {
$line = trim($lines[$i]);
if ($stopAtToken && t3lib_div::isFirstPartOfStr($line, $this->localconf_editPointToken)) {
break;
}
if (t3lib_div::isFirstPartOfStr($line, '?>')) {
$insertPos = $i;
}
if (t3lib_div::isFirstPartOfStr($line, $variable)) {
$startPos = $i;
break;
}
}
}
if ($startPos) {
$this->touchedLine = $startPos;
$endPos = $startPos;
for ($i = $startPos; $i < count($lines); $i++) {
$line = trim($lines[$i]);
if (t3lib_div::isFirstPartOfStr($line, ');')) {
$endPos = $i;
break;
}
}
$startLines = array_slice($lines, 0, $startPos);
$endLines = array_slice($lines, $endPos + 1);
$lines = $startLines;
$definition = $this->array_export($value);
$lines[] = sprintf($format, $variable, $definition);
foreach ($endLines as $line) {
$lines[] = $line;
}
} else {
$lines[$insertPos] = sprintf($format, $variable, $this->array_export($value));
$lines[] = '?>';
$this->touchedLine = -1;
}
}
/**
* Returns a parsable string representation of an array variable. This methods enhances
* standard method var_export from PHP to take TYPO3's CGL into account.
*
* @param array $variable
* @return string
*/
protected function array_export(array $variable) {
$lines = explode("\n", var_export($variable, TRUE));
$out = 'array(';
for ($i = 1; $i < count($lines); $i++) {
$out .= "\n";
// Make the space-indented declaration tab-indented instead
while (substr($lines[$i], 0, 2) === ' ') {
$out .= "\t";
$lines[$i] = substr($lines[$i], 2);
}
$out .= $lines[$i];
// Array declaration should be next to the assignment and no space between
// "array" and its opening parenthesis should exist
if (preg_match('/\s=>\s$/', $lines[$i])) {
$out .= preg_replace('/^\s*array \(/', 'array(', $lines[$i + 1]);
$i++;
}
}
return $out;
}
/**
* Writes or returns lines from localconf.php
*
* @param array Array of lines to write back to localconf.php. Possibly
......
array_push($inlines,$writeToLocalconf_dat['endLine']);
if ($this->setLocalconf) {
$success = FALSE;
if (!t3lib_div::writeFile($writeToLocalconf_dat['tmpfile'],implode(LF,$inlines))) {
$msg = 'typo3conf/localconf.php'.$tmpExt.' could not be written - maybe a write access problem?';
}
elseif (strcmp(t3lib_div::getUrl($writeToLocalconf_dat['tmpfile']), implode(LF,$inlines))) {
@unlink($writeToLocalconf_dat['tmpfile']);
$msg = 'typo3conf/localconf.php'.$tmpExt.' was NOT written properly (written content didn\'t match file content) - maybe a disk space problem?';
}
elseif (!@copy($writeToLocalconf_dat['tmpfile'],$writeToLocalconf_dat['file'])) {
$msg = 'typo3conf/localconf.php could not be replaced by typo3conf/localconf.php'.$tmpExt.' - maybe a write access problem?';
}
else {
@unlink($writeToLocalconf_dat['tmpfile']);
$success = TRUE;
$msg = 'Configuration written to typo3conf/localconf.php';
}
$this->messages[] = $msg;
$success = $this->writeToLocalconf($inlines, $absFullPath);
if ($success) {
return 'continue';
} else {
t3lib_div::sysLog($msg, 'Core', 3);
return 'nochange';
}
} else {
......
}
/**
* Writes lines to localconf.php.
*
* @param array Array of lines to write back to localconf.php
* @param string Absolute path of alternative file to use (Notice: this path is not validated in terms of being inside 'TYPO3 space')
* @return boolean TRUE if method succeeded, otherwise FALSE
*/
public function writeToLocalconf(array $lines, $absFullPath = '') {
$tmpExt = '.TMP.php';
$writeToLocalconf_dat = array();
$writeToLocalconf_dat['file'] = $absFullPath ? $absFullPath : PATH_typo3conf . 'localconf.php';
$writeToLocalconf_dat['tmpfile'] = $writeToLocalconf_dat['file'] . $tmpExt;
// Checking write state of localconf.php:
if (!$this->allowUpdateLocalConf) {
throw new RuntimeException(
'TYPO3 Fatal Error: ->allowUpdateLocalConf flag in the install object is not set and therefore "localconf.php" cannot be altered.',
1270853915
);
}
if (!@is_writable($writeToLocalconf_dat['file'])) {
throw new RuntimeException(
'TYPO3 Fatal Error: ' . $writeToLocalconf_dat['file'] . ' is not writable!',
1270853916
);
}
$writeToLocalconf_dat['endLine'] = array_pop($lines); // Getting "? >" ending.
if (!strstr('?' . '>', $writeToLocalconf_dat['endLine'])) {
$lines[] = $writeToLocalconf_dat['endLine'];
$writeToLocalconf_dat['endLine'] = '?' . '>';
}
// Checking if "updated" line was set by this tool - if so remove old line.
$updatedLine = array_pop($lines);
$writeToLocalconf_dat['updatedText'] = '// Updated by '. $this->updateIdentity . ' ';
if (!strstr($updatedLine, $writeToLocalconf_dat['updatedText'])) {
$lines[] = $updatedLine;
}
$updatedLine = $writeToLocalconf_dat['updatedText'] . date($GLOBALS['TYPO3_CONF_VARS']['SYS']['ddmmyy'] . ' H:i:s');
$lines[] = $updatedLine;
$lines[] = $writeToLocalconf_dat['endLine'];
$success = FALSE;
if (!t3lib_div::writeFile($writeToLocalconf_dat['tmpfile'], implode(LF, $lines))) {
$msg = 'typo3conf/localconf.php' . $tmpExt . ' could not be written - maybe a write access problem?';
}
elseif (strcmp(t3lib_div::getUrl($writeToLocalconf_dat['tmpfile']), implode(LF, $lines))) {
@unlink($writeToLocalconf_dat['tmpfile']);
$msg = 'typo3conf/localconf.php' . $tmpExt . ' was NOT written properly (written content didn\'t match file content) - maybe a disk space problem?';
}
elseif (!@copy($writeToLocalconf_dat['tmpfile'], $writeToLocalconf_dat['file'])) {
$msg = 'typo3conf/localconf.php could not be replaced by typo3conf/localconf.php' . $tmpExt . ' - maybe a write access problem?';
}
else {
@unlink($writeToLocalconf_dat['tmpfile']);
$success = TRUE;
$msg = 'Configuration written to typo3conf/localconf.php';
}
$this->messages[] = $msg;
if (!$success) {
t3lib_div::sysLog($msg, 'Core', 3);
}
return $success;
}
/**
* Checking for linebreaks in the string
*
* @param string String to test
    (1-1/1)