PageRenderTime 51ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/core/modules/language/src/Config/LanguageConfigFactoryOverride.php

http://github.com/drupal/drupal
PHP | 237 lines | 122 code | 27 blank | 88 comment | 7 complexity | 9ac582cdfc73b23755e9645400596581 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
  1. <?php
  2. namespace Drupal\language\Config;
  3. use Drupal\Core\Cache\CacheableMetadata;
  4. use Drupal\Core\Config\ConfigCollectionInfo;
  5. use Drupal\Core\Config\ConfigCrudEvent;
  6. use Drupal\Core\Config\ConfigFactoryOverrideBase;
  7. use Drupal\Core\Config\ConfigRenameEvent;
  8. use Drupal\Core\Config\StorageInterface;
  9. use Drupal\Core\Config\TypedConfigManagerInterface;
  10. use Drupal\Core\Language\LanguageDefault;
  11. use Drupal\Core\Language\LanguageInterface;
  12. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. /**
  15. * Provides language overrides for the configuration factory.
  16. */
  17. class LanguageConfigFactoryOverride extends ConfigFactoryOverrideBase implements LanguageConfigFactoryOverrideInterface, EventSubscriberInterface {
  18. use LanguageConfigCollectionNameTrait;
  19. /**
  20. * The configuration storage.
  21. *
  22. * Do not access this directly. Should be accessed through self::getStorage()
  23. * so that the cache of storages per langcode is used.
  24. *
  25. * @var \Drupal\Core\Config\StorageInterface
  26. */
  27. protected $baseStorage;
  28. /**
  29. * An array of configuration storages keyed by langcode.
  30. *
  31. * @var \Drupal\Core\Config\StorageInterface[]
  32. */
  33. protected $storages;
  34. /**
  35. * The typed config manager.
  36. *
  37. * @var \Drupal\Core\Config\TypedConfigManagerInterface
  38. */
  39. protected $typedConfigManager;
  40. /**
  41. * An event dispatcher instance to use for configuration events.
  42. *
  43. * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface
  44. */
  45. protected $eventDispatcher;
  46. /**
  47. * The language object used to override configuration data.
  48. *
  49. * @var \Drupal\Core\Language\LanguageInterface
  50. */
  51. protected $language;
  52. /**
  53. * Constructs the LanguageConfigFactoryOverride object.
  54. *
  55. * @param \Drupal\Core\Config\StorageInterface $storage
  56. * The configuration storage engine.
  57. * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher
  58. * An event dispatcher instance to use for configuration events.
  59. * @param \Drupal\Core\Config\TypedConfigManagerInterface $typed_config
  60. * The typed configuration manager.
  61. * @param \Drupal\Core\Language\LanguageDefault $default_language
  62. * The default language.
  63. */
  64. public function __construct(StorageInterface $storage, EventDispatcherInterface $event_dispatcher, TypedConfigManagerInterface $typed_config, LanguageDefault $default_language) {
  65. $this->baseStorage = $storage;
  66. $this->eventDispatcher = $event_dispatcher;
  67. $this->typedConfigManager = $typed_config;
  68. // Prior to negotiation the override language should be the default
  69. // language.
  70. $this->language = $default_language->get();
  71. }
  72. /**
  73. * {@inheritdoc}
  74. */
  75. public function loadOverrides($names) {
  76. if ($this->language) {
  77. $storage = $this->getStorage($this->language->getId());
  78. return $storage->readMultiple($names);
  79. }
  80. return [];
  81. }
  82. /**
  83. * {@inheritdoc}
  84. */
  85. public function getOverride($langcode, $name) {
  86. $storage = $this->getStorage($langcode);
  87. $data = $storage->read($name);
  88. $override = new LanguageConfigOverride(
  89. $name,
  90. $storage,
  91. $this->typedConfigManager,
  92. $this->eventDispatcher
  93. );
  94. if (!empty($data)) {
  95. $override->initWithData($data);
  96. }
  97. return $override;
  98. }
  99. /**
  100. * {@inheritdoc}
  101. */
  102. public function getStorage($langcode) {
  103. if (!isset($this->storages[$langcode])) {
  104. $this->storages[$langcode] = $this->baseStorage->createCollection($this->createConfigCollectionName($langcode));
  105. }
  106. return $this->storages[$langcode];
  107. }
  108. /**
  109. * {@inheritdoc}
  110. */
  111. public function getCacheSuffix() {
  112. return $this->language ? $this->language->getId() : NULL;
  113. }
  114. /**
  115. * {@inheritdoc}
  116. */
  117. public function getLanguage() {
  118. return $this->language;
  119. }
  120. /**
  121. * {@inheritdoc}
  122. */
  123. public function setLanguage(LanguageInterface $language = NULL) {
  124. $this->language = $language;
  125. return $this;
  126. }
  127. /**
  128. * {@inheritdoc}
  129. */
  130. public function setLanguageFromDefault(LanguageDefault $language_default = NULL) {
  131. $this->language = $language_default ? $language_default->get() : NULL;
  132. return $this;
  133. }
  134. /**
  135. * {@inheritdoc}
  136. */
  137. public function installLanguageOverrides($langcode) {
  138. /** @var \Drupal\Core\Config\ConfigInstallerInterface $config_installer */
  139. $config_installer = \Drupal::service('config.installer');
  140. $config_installer->installCollectionDefaultConfig($this->createConfigCollectionName($langcode));
  141. }
  142. /**
  143. * {@inheritdoc}
  144. */
  145. public function createConfigObject($name, $collection = StorageInterface::DEFAULT_COLLECTION) {
  146. $langcode = $this->getLangcodeFromCollectionName($collection);
  147. return $this->getOverride($langcode, $name);
  148. }
  149. /**
  150. * {@inheritdoc}
  151. */
  152. public function addCollections(ConfigCollectionInfo $collection_info) {
  153. foreach (\Drupal::languageManager()->getLanguages() as $language) {
  154. $collection_info->addCollection($this->createConfigCollectionName($language->getId()), $this);
  155. }
  156. }
  157. /**
  158. * {@inheritdoc}
  159. */
  160. public function onConfigSave(ConfigCrudEvent $event) {
  161. $config = $event->getConfig();
  162. $name = $config->getName();
  163. foreach (\Drupal::languageManager()->getLanguages() as $language) {
  164. $config_translation = $this->getOverride($language->getId(), $name);
  165. if (!$config_translation->isNew()) {
  166. $this->filterOverride($config, $config_translation);
  167. }
  168. }
  169. }
  170. /**
  171. * {@inheritdoc}
  172. */
  173. public function onConfigRename(ConfigRenameEvent $event) {
  174. $config = $event->getConfig();
  175. $name = $config->getName();
  176. $old_name = $event->getOldName();
  177. foreach (\Drupal::languageManager()->getLanguages() as $language) {
  178. $config_translation = $this->getOverride($language->getId(), $old_name);
  179. if (!$config_translation->isNew()) {
  180. $saved_config = $config_translation->get();
  181. $storage = $this->getStorage($language->getId());
  182. $storage->write($name, $saved_config);
  183. $config_translation->delete();
  184. }
  185. }
  186. }
  187. /**
  188. * {@inheritdoc}
  189. */
  190. public function onConfigDelete(ConfigCrudEvent $event) {
  191. $config = $event->getConfig();
  192. $name = $config->getName();
  193. foreach (\Drupal::languageManager()->getLanguages() as $language) {
  194. $config_translation = $this->getOverride($language->getId(), $name);
  195. if (!$config_translation->isNew()) {
  196. $config_translation->delete();
  197. }
  198. }
  199. }
  200. /**
  201. * {@inheritdoc}
  202. */
  203. public function getCacheableMetadata($name) {
  204. $metadata = new CacheableMetadata();
  205. if ($this->language) {
  206. $metadata->setCacheContexts(['languages:language_interface']);
  207. }
  208. return $metadata;
  209. }
  210. }