TYPO3  7.6
core/Classes/Configuration/ConfigurationManager.php
Go to the documentation of this file.
1 <?php
2 namespace TYPO3\CMS\Core\Configuration;
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($this->pathTypo3Conf) && (!file_exists($fileLocation) || @is_writable($fileLocation));
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 ' .
327  ) .
328  ';' . LF,
329  true
330  );
331 
332  GeneralUtility::makeInstance(OpcodeCacheService::class)->clearAllActive($localConfigurationFile);
333 
334  return $result;
335  }
336 
345  public function writeAdditionalConfiguration(array $additionalConfigurationLines)
346  {
348  PATH_site . $this->additionalConfigurationFile,
349  '<?php' . LF .
350  implode(LF, $additionalConfigurationLines) . LF
351  );
352  }
353 
364  {
365  if (file_exists($this->getLocalConfigurationFileLocation())) {
366  throw new \RuntimeException(
367  'LocalConfiguration.php exists already',
368  1364836026
369  );
370  }
371  $localConfigurationArray = require $this->getFactoryConfigurationFileLocation();
372  $additionalFactoryConfigurationFileLocation = $this->getAdditionalFactoryConfigurationFileLocation();
373  if (file_exists($additionalFactoryConfigurationFileLocation)) {
374  $additionalFactoryConfigurationArray = require $additionalFactoryConfigurationFileLocation;
376  $localConfigurationArray,
377  $additionalFactoryConfigurationArray
378  );
379  }
380  $this->writeLocalConfiguration($localConfigurationArray);
381  }
382 
389  protected function isValidLocalConfigurationPath($path)
390  {
391  // Early return for white listed paths
392  foreach ($this->whiteListedLocalConfigurationPaths as $whiteListedPath) {
393  if (GeneralUtility::isFirstPartOfStr($path, $whiteListedPath)) {
394  return true;
395  }
396  }
397  return ArrayUtility::isValidPath($this->getDefaultConfiguration(), $path);
398  }
399 }