TYPO3 CMS  TYPO3_7-6
ConfigurationManager.php
Go to the documentation of this file.
1 <?php
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
20 
37 {
41  protected $defaultConfigurationFile = 'typo3/sysext/core/Configuration/DefaultConfiguration.php';
42 
46  protected $localConfigurationFile = 'typo3conf/LocalConfiguration.php';
47 
51  protected $additionalConfigurationFile = 'typo3conf/AdditionalConfiguration.php';
52 
56  protected $factoryConfigurationFile = 'typo3/sysext/core/Configuration/FactoryConfiguration.php';
57 
61  protected $additionalFactoryConfigurationFile = 'typo3conf/AdditionalFactoryConfiguration.php';
62 
66  protected $pathTypo3Conf = PATH_typo3conf;
67 
75  'EXT/extConf',
76  'EXTCONF',
77  'INSTALL/wizardDone',
78  'DB',
79  'SYS/caching/cacheConfigurations',
80  ];
81 
87  public function getDefaultConfiguration()
88  {
89  return require $this->getDefaultConfigurationFileLocation();
90  }
91 
100  {
101  return PATH_site . $this->defaultConfigurationFile;
102  }
103 
109  public function getLocalConfiguration()
110  {
111  return require $this->getLocalConfigurationFileLocation();
112  }
113 
122  {
123  return PATH_site . $this->localConfigurationFile;
124  }
125 
134  {
135  return PATH_site . $this->additionalConfigurationFile;
136  }
137 
144  {
145  return PATH_site . $this->factoryConfigurationFile;
146  }
147 
154  {
156  }
157 
164  public function updateLocalConfiguration(array $configurationToMerge)
165  {
166  $newLocalConfiguration = $this->getLocalConfiguration();
167  ArrayUtility::mergeRecursiveWithOverrule($newLocalConfiguration, $configurationToMerge);
168  $this->writeLocalConfiguration($newLocalConfiguration);
169  }
170 
177  public function getDefaultConfigurationValueByPath($path)
178  {
180  }
181 
188  public function getLocalConfigurationValueByPath($path)
189  {
190  return ArrayUtility::getValueByPath($this->getLocalConfiguration(), $path);
191  }
192 
200  public function getConfigurationValueByPath($path)
201  {
202  $defaultConfiguration = $this->getDefaultConfiguration();
203  ArrayUtility::mergeRecursiveWithOverrule($defaultConfiguration, $this->getLocalConfiguration());
204  return ArrayUtility::getValueByPath($defaultConfiguration, $path);
205  }
206 
214  public function setLocalConfigurationValueByPath($path, $value)
215  {
216  $result = false;
217  if ($this->isValidLocalConfigurationPath($path)) {
218  $localConfiguration = $this->getLocalConfiguration();
219  $localConfiguration = ArrayUtility::setValueByPath($localConfiguration, $path, $value);
220  $result = $this->writeLocalConfiguration($localConfiguration);
221  }
222  return $result;
223  }
224 
231  public function setLocalConfigurationValuesByPathValuePairs(array $pairs)
232  {
233  $localConfiguration = $this->getLocalConfiguration();
234  foreach ($pairs as $path => $value) {
235  if ($this->isValidLocalConfigurationPath($path)) {
236  $localConfiguration = ArrayUtility::setValueByPath($localConfiguration, $path, $value);
237  }
238  }
239  return $this->writeLocalConfiguration($localConfiguration);
240  }
241 
248  public function removeLocalConfigurationKeysByPath(array $keys)
249  {
250  $result = false;
251  $localConfiguration = $this->getLocalConfiguration();
252  foreach ($keys as $path) {
253  // Remove key if path is within LocalConfiguration
254  if (ArrayUtility::isValidPath($localConfiguration, $path)) {
255  $result = true;
256  $localConfiguration = ArrayUtility::removeByPath($localConfiguration, $path);
257  }
258  }
259  if ($result) {
260  $this->writeLocalConfiguration($localConfiguration);
261  }
262  return $result;
263  }
264 
271  public function canWriteConfiguration()
272  {
273  $fileLocation = $this->getLocalConfigurationFileLocation();
274  return @is_writable(file_exists($fileLocation) ? $fileLocation : $this->pathTypo3Conf);
275  }
276 
284  public function exportConfiguration()
285  {
286  if (@is_file($this->getLocalConfigurationFileLocation())) {
287  $localConfiguration = $this->getLocalConfiguration();
288  if (is_array($localConfiguration)) {
289  $defaultConfiguration = $this->getDefaultConfiguration();
290  ArrayUtility::mergeRecursiveWithOverrule($defaultConfiguration, $localConfiguration);
291  $GLOBALS['TYPO3_CONF_VARS'] = $defaultConfiguration;
292  } else {
293  throw new \UnexpectedValueException('LocalConfiguration invalid.', 1349272276);
294  }
295  if (@is_file($this->getAdditionalConfigurationFileLocation())) {
297  }
298  } else {
299  // No LocalConfiguration (yet), load DefaultConfiguration only
300  $GLOBALS['TYPO3_CONF_VARS'] = $this->getDefaultConfiguration();
301  }
302  }
303 
312  public function writeLocalConfiguration(array $configuration)
313  {
315  if (!$this->canWriteConfiguration()) {
316  throw new \RuntimeException(
317  $localConfigurationFile . ' is not writable.', 1346323822
318  );
319  }
320  $configuration = ArrayUtility::sortByKeyRecursive($configuration);
321  $result = GeneralUtility::writeFile(
323  '<?php' . LF .
324  'return ' .
325  ArrayUtility::arrayExport($configuration) .
326  ';' . LF,
327  true
328  );
329 
330  GeneralUtility::makeInstance(OpcodeCacheService::class)->clearAllActive($localConfigurationFile);
331 
332  return $result;
333  }
334 
343  public function writeAdditionalConfiguration(array $additionalConfigurationLines)
344  {
346  PATH_site . $this->additionalConfigurationFile,
347  '<?php' . LF .
348  implode(LF, $additionalConfigurationLines) . LF
349  );
350  }
351 
362  {
363  if (file_exists($this->getLocalConfigurationFileLocation())) {
364  throw new \RuntimeException(
365  'LocalConfiguration.php exists already',
366  1364836026
367  );
368  }
369  $localConfigurationArray = require $this->getFactoryConfigurationFileLocation();
370  $additionalFactoryConfigurationFileLocation = $this->getAdditionalFactoryConfigurationFileLocation();
371  if (file_exists($additionalFactoryConfigurationFileLocation)) {
372  $additionalFactoryConfigurationArray = require $additionalFactoryConfigurationFileLocation;
374  $localConfigurationArray,
375  $additionalFactoryConfigurationArray
376  );
377  }
378  $this->writeLocalConfiguration($localConfigurationArray);
379  }
380 
387  protected function isValidLocalConfigurationPath($path)
388  {
389  // Early return for white listed paths
390  foreach ($this->whiteListedLocalConfigurationPaths as $whiteListedPath) {
391  if (GeneralUtility::isFirstPartOfStr($path, $whiteListedPath)) {
392  return true;
393  }
394  }
395  return ArrayUtility::isValidPath($this->getDefaultConfiguration(), $path);
396  }
397 }
static setValueByPath(array $array, $path, $value, $delimiter='/')
static getValueByPath(array $array, $path, $delimiter='/')
static isFirstPartOfStr($str, $partStr)
static arrayExport(array $array=[], $level=0)
static removeByPath(array $array, $path, $delimiter='/')
static sortByKeyRecursive(array $array)
static isValidPath(array $array, $path, $delimiter='/')
static mergeRecursiveWithOverrule(array &$original, array $overrule, $addKeys=true, $includeEmptyValues=true, $enableUnsetFeature=true)
if(TYPO3_MODE==='BE') $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tsfebeuserauth.php']['frontendEditingController']['default']
writeAdditionalConfiguration(array $additionalConfigurationLines)
static writeFile($file, $content, $changePermissions=false)