Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 namespace Drupal\Core\Field;
|
Chris@0
|
4
|
Chris@0
|
5 use Drupal\Component\Plugin\DependentPluginInterface;
|
Chris@0
|
6 use Drupal\Core\Plugin\PluginBase;
|
Chris@0
|
7
|
Chris@0
|
8 /**
|
Chris@0
|
9 * Base class for the Field API plugins.
|
Chris@0
|
10 *
|
Chris@0
|
11 * This class handles lazy replacement of default settings values.
|
Chris@0
|
12 */
|
Chris@0
|
13 abstract class PluginSettingsBase extends PluginBase implements PluginSettingsInterface, DependentPluginInterface {
|
Chris@0
|
14
|
Chris@0
|
15 /**
|
Chris@0
|
16 * The plugin settings.
|
Chris@0
|
17 *
|
Chris@0
|
18 * @var array
|
Chris@0
|
19 */
|
Chris@0
|
20 protected $settings = [];
|
Chris@0
|
21
|
Chris@0
|
22 /**
|
Chris@0
|
23 * The plugin settings injected by third party modules.
|
Chris@0
|
24 *
|
Chris@0
|
25 * @see hooks
|
Chris@0
|
26 *
|
Chris@0
|
27 * @var array
|
Chris@0
|
28 */
|
Chris@0
|
29 protected $thirdPartySettings = [];
|
Chris@0
|
30
|
Chris@0
|
31 /**
|
Chris@0
|
32 * Whether default settings have been merged into the current $settings.
|
Chris@0
|
33 *
|
Chris@0
|
34 * @var bool
|
Chris@0
|
35 */
|
Chris@0
|
36 protected $defaultSettingsMerged = FALSE;
|
Chris@0
|
37
|
Chris@0
|
38 /**
|
Chris@0
|
39 * {@inheritdoc}
|
Chris@0
|
40 */
|
Chris@0
|
41 public static function defaultSettings() {
|
Chris@0
|
42 return [];
|
Chris@0
|
43 }
|
Chris@0
|
44
|
Chris@0
|
45 /**
|
Chris@0
|
46 * {@inheritdoc}
|
Chris@0
|
47 */
|
Chris@0
|
48 public function getSettings() {
|
Chris@0
|
49 // Merge defaults before returning the array.
|
Chris@0
|
50 if (!$this->defaultSettingsMerged) {
|
Chris@0
|
51 $this->mergeDefaults();
|
Chris@0
|
52 }
|
Chris@0
|
53 return $this->settings;
|
Chris@0
|
54 }
|
Chris@0
|
55
|
Chris@0
|
56 /**
|
Chris@0
|
57 * {@inheritdoc}
|
Chris@0
|
58 */
|
Chris@0
|
59 public function getSetting($key) {
|
Chris@0
|
60 // Merge defaults if we have no value for the key.
|
Chris@0
|
61 if (!$this->defaultSettingsMerged && !array_key_exists($key, $this->settings)) {
|
Chris@0
|
62 $this->mergeDefaults();
|
Chris@0
|
63 }
|
Chris@0
|
64 return isset($this->settings[$key]) ? $this->settings[$key] : NULL;
|
Chris@0
|
65 }
|
Chris@0
|
66
|
Chris@0
|
67 /**
|
Chris@0
|
68 * Merges default settings values into $settings.
|
Chris@0
|
69 */
|
Chris@0
|
70 protected function mergeDefaults() {
|
Chris@0
|
71 $this->settings += static::defaultSettings();
|
Chris@0
|
72 $this->defaultSettingsMerged = TRUE;
|
Chris@0
|
73 }
|
Chris@0
|
74
|
Chris@0
|
75 /**
|
Chris@0
|
76 * {@inheritdoc}
|
Chris@0
|
77 */
|
Chris@0
|
78 public function setSettings(array $settings) {
|
Chris@0
|
79 $this->settings = $settings;
|
Chris@0
|
80 $this->defaultSettingsMerged = FALSE;
|
Chris@0
|
81 return $this;
|
Chris@0
|
82 }
|
Chris@0
|
83
|
Chris@0
|
84 /**
|
Chris@0
|
85 * {@inheritdoc}
|
Chris@0
|
86 */
|
Chris@0
|
87 public function setSetting($key, $value) {
|
Chris@0
|
88 $this->settings[$key] = $value;
|
Chris@0
|
89 return $this;
|
Chris@0
|
90 }
|
Chris@0
|
91
|
Chris@0
|
92 /**
|
Chris@0
|
93 * {@inheritdoc}
|
Chris@0
|
94 */
|
Chris@0
|
95 public function getThirdPartySettings($module = NULL) {
|
Chris@0
|
96 if ($module) {
|
Chris@0
|
97 return isset($this->thirdPartySettings[$module]) ? $this->thirdPartySettings[$module] : [];
|
Chris@0
|
98 }
|
Chris@0
|
99 return $this->thirdPartySettings;
|
Chris@0
|
100 }
|
Chris@0
|
101
|
Chris@0
|
102 /**
|
Chris@0
|
103 * {@inheritdoc}
|
Chris@0
|
104 */
|
Chris@0
|
105 public function getThirdPartySetting($module, $key, $default = NULL) {
|
Chris@0
|
106 return isset($this->thirdPartySettings[$module][$key]) ? $this->thirdPartySettings[$module][$key] : $default;
|
Chris@0
|
107 }
|
Chris@0
|
108
|
Chris@0
|
109 /**
|
Chris@0
|
110 * {@inheritdoc}
|
Chris@0
|
111 */
|
Chris@0
|
112 public function setThirdPartySetting($module, $key, $value) {
|
Chris@0
|
113 $this->thirdPartySettings[$module][$key] = $value;
|
Chris@0
|
114 return $this;
|
Chris@0
|
115 }
|
Chris@0
|
116
|
Chris@0
|
117 /**
|
Chris@0
|
118 * {@inheritdoc}
|
Chris@0
|
119 */
|
Chris@0
|
120 public function unsetThirdPartySetting($module, $key) {
|
Chris@0
|
121 unset($this->thirdPartySettings[$module][$key]);
|
Chris@0
|
122 // If the third party is no longer storing any information, completely
|
Chris@0
|
123 // remove the array holding the settings for this module.
|
Chris@0
|
124 if (empty($this->thirdPartySettings[$module])) {
|
Chris@0
|
125 unset($this->thirdPartySettings[$module]);
|
Chris@0
|
126 }
|
Chris@0
|
127 return $this;
|
Chris@0
|
128 }
|
Chris@0
|
129
|
Chris@0
|
130 /**
|
Chris@0
|
131 * {@inheritdoc}
|
Chris@0
|
132 */
|
Chris@0
|
133 public function getThirdPartyProviders() {
|
Chris@0
|
134 return array_keys($this->thirdPartySettings);
|
Chris@0
|
135 }
|
Chris@0
|
136
|
Chris@0
|
137 /**
|
Chris@0
|
138 * {@inheritdoc}
|
Chris@0
|
139 */
|
Chris@0
|
140 public function calculateDependencies() {
|
Chris@0
|
141 if (!empty($this->thirdPartySettings)) {
|
Chris@0
|
142 // Create dependencies on any modules providing third party settings.
|
Chris@0
|
143 return [
|
Chris@17
|
144 'module' => array_keys($this->thirdPartySettings),
|
Chris@0
|
145 ];
|
Chris@0
|
146 }
|
Chris@0
|
147 return [];
|
Chris@0
|
148 }
|
Chris@0
|
149
|
Chris@0
|
150 /**
|
Chris@0
|
151 * {@inheritdoc}
|
Chris@0
|
152 */
|
Chris@0
|
153 public function onDependencyRemoval(array $dependencies) {
|
Chris@0
|
154 $changed = FALSE;
|
Chris@0
|
155 if (!empty($this->thirdPartySettings) && !empty($dependencies['module'])) {
|
Chris@0
|
156 $old_count = count($this->thirdPartySettings);
|
Chris@0
|
157 $this->thirdPartySettings = array_diff_key($this->thirdPartySettings, array_flip($dependencies['module']));
|
Chris@0
|
158 $changed = $old_count != count($this->thirdPartySettings);
|
Chris@0
|
159 }
|
Chris@0
|
160 return $changed;
|
Chris@0
|
161 }
|
Chris@0
|
162
|
Chris@0
|
163 }
|