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