comparison core/modules/layout_builder/src/SectionComponent.php @ 14:1fec387a4317

Update Drupal core to 8.5.2 via Composer
author Chris Cannam
date Mon, 23 Apr 2018 09:46:53 +0100
parents
children c2387f117808
comparison
equal deleted inserted replaced
13:5fb285c0d0e3 14:1fec387a4317
1 <?php
2
3 namespace Drupal\layout_builder;
4
5 use Drupal\Component\Plugin\Exception\PluginException;
6 use Drupal\Core\Plugin\ContextAwarePluginInterface;
7 use Drupal\layout_builder\Event\SectionComponentBuildRenderArrayEvent;
8
9 /**
10 * Provides a value object for a section component.
11 *
12 * A component represents the smallest part of a layout (for example, a block).
13 * Components wrap a renderable plugin, currently using
14 * \Drupal\Core\Block\BlockPluginInterface, and contain the layout region
15 * within the section layout where the component will be rendered.
16 *
17 * @internal
18 * Layout Builder is currently experimental and should only be leveraged by
19 * experimental modules and development releases of contributed modules.
20 * See https://www.drupal.org/core/experimental for more information.
21 *
22 * @see \Drupal\Core\Layout\LayoutDefinition
23 * @see \Drupal\layout_builder\Section
24 * @see \Drupal\layout_builder\SectionStorageInterface
25 *
26 * @todo Determine whether to retain the name 'component' in
27 * https://www.drupal.org/project/drupal/issues/2929783.
28 * @todo Determine whether an interface will be provided for this in
29 * https://www.drupal.org/project/drupal/issues/2930334.
30 */
31 class SectionComponent {
32
33 /**
34 * The UUID of the component.
35 *
36 * @var string
37 */
38 protected $uuid;
39
40 /**
41 * The region the component is placed in.
42 *
43 * @var string
44 */
45 protected $region;
46
47 /**
48 * An array of plugin configuration.
49 *
50 * @var mixed[]
51 */
52 protected $configuration;
53
54 /**
55 * The weight of the component.
56 *
57 * @var int
58 */
59 protected $weight = 0;
60
61 /**
62 * Any additional properties and values.
63 *
64 * @var mixed[]
65 */
66 protected $additional = [];
67
68 /**
69 * Constructs a new SectionComponent.
70 *
71 * @param string $uuid
72 * The UUID.
73 * @param string $region
74 * The region.
75 * @param mixed[] $configuration
76 * The plugin configuration.
77 * @param mixed[] $additional
78 * An additional values.
79 */
80 public function __construct($uuid, $region, array $configuration = [], array $additional = []) {
81 $this->uuid = $uuid;
82 $this->region = $region;
83 $this->configuration = $configuration;
84 $this->additional = $additional;
85 }
86
87 /**
88 * Returns the renderable array for this component.
89 *
90 * @param \Drupal\Core\Plugin\Context\ContextInterface[] $contexts
91 * An array of available contexts.
92 * @param bool $in_preview
93 * TRUE if the component is being previewed, FALSE otherwise.
94 *
95 * @return array
96 * A renderable array representing the content of the component.
97 */
98 public function toRenderArray(array $contexts = [], $in_preview = FALSE) {
99 $event = new SectionComponentBuildRenderArrayEvent($this, $contexts, $in_preview);
100 $this->eventDispatcher()->dispatch(LayoutBuilderEvents::SECTION_COMPONENT_BUILD_RENDER_ARRAY, $event);
101 $output = $event->getBuild();
102 $event->getCacheableMetadata()->applyTo($output);
103 return $output;
104 }
105
106 /**
107 * Gets any arbitrary property for the component.
108 *
109 * @param string $property
110 * The property to retrieve.
111 *
112 * @return mixed
113 * The value for that property, or NULL if the property does not exist.
114 */
115 public function get($property) {
116 if (property_exists($this, $property)) {
117 $value = isset($this->{$property}) ? $this->{$property} : NULL;
118 }
119 else {
120 $value = isset($this->additional[$property]) ? $this->additional[$property] : NULL;
121 }
122 return $value;
123 }
124
125 /**
126 * Sets a value to an arbitrary property for the component.
127 *
128 * @param string $property
129 * The property to use for the value.
130 * @param mixed $value
131 * The value to set.
132 *
133 * @return $this
134 */
135 public function set($property, $value) {
136 if (property_exists($this, $property)) {
137 $this->{$property} = $value;
138 }
139 else {
140 $this->additional[$property] = $value;
141 }
142 return $this;
143 }
144
145 /**
146 * Gets the region for the component.
147 *
148 * @return string
149 * The region.
150 */
151 public function getRegion() {
152 return $this->region;
153 }
154
155 /**
156 * Sets the region for the component.
157 *
158 * @param string $region
159 * The region.
160 *
161 * @return $this
162 */
163 public function setRegion($region) {
164 $this->region = $region;
165 return $this;
166 }
167
168 /**
169 * Gets the weight of the component.
170 *
171 * @return int
172 * The zero-based weight of the component.
173 *
174 * @throws \UnexpectedValueException
175 * Thrown if the weight was never set.
176 */
177 public function getWeight() {
178 return $this->weight;
179 }
180
181 /**
182 * Sets the weight of the component.
183 *
184 * @param int $weight
185 * The zero-based weight of the component.
186 *
187 * @return $this
188 */
189 public function setWeight($weight) {
190 $this->weight = $weight;
191 return $this;
192 }
193
194 /**
195 * Gets the component plugin configuration.
196 *
197 * @return mixed[]
198 * The component plugin configuration.
199 */
200 protected function getConfiguration() {
201 return $this->configuration;
202 }
203
204 /**
205 * Sets the plugin configuration.
206 *
207 * @param mixed[] $configuration
208 * The plugin configuration.
209 *
210 * @return $this
211 */
212 public function setConfiguration(array $configuration) {
213 $this->configuration = $configuration;
214 return $this;
215 }
216
217 /**
218 * Gets the plugin ID.
219 *
220 * @return string
221 * The plugin ID.
222 *
223 * @throws \Drupal\Component\Plugin\Exception\PluginException
224 * Thrown if the plugin ID cannot be found.
225 */
226 public function getPluginId() {
227 if (empty($this->configuration['id'])) {
228 throw new PluginException(sprintf('No plugin ID specified for component with "%s" UUID', $this->uuid));
229 }
230 return $this->configuration['id'];
231 }
232
233 /**
234 * Gets the UUID for this component.
235 *
236 * @return string
237 * The UUID.
238 */
239 public function getUuid() {
240 return $this->uuid;
241 }
242
243 /**
244 * Gets the plugin for this component.
245 *
246 * @param \Drupal\Core\Plugin\Context\ContextInterface[] $contexts
247 * An array of contexts to set on the plugin.
248 *
249 * @return \Drupal\Component\Plugin\PluginInspectionInterface
250 * The plugin.
251 */
252 public function getPlugin(array $contexts = []) {
253 $plugin = $this->pluginManager()->createInstance($this->getPluginId(), $this->getConfiguration());
254 if ($contexts && $plugin instanceof ContextAwarePluginInterface) {
255 $this->contextHandler()->applyContextMapping($plugin, $contexts);
256 }
257 return $plugin;
258 }
259
260 /**
261 * Wraps the component plugin manager.
262 *
263 * @return \Drupal\Core\Block\BlockManagerInterface
264 * The plugin manager.
265 */
266 protected function pluginManager() {
267 // @todo Figure out the best way to unify fields and blocks and components
268 // in https://www.drupal.org/node/1875974.
269 return \Drupal::service('plugin.manager.block');
270 }
271
272 /**
273 * Wraps the context handler.
274 *
275 * @return \Drupal\Core\Plugin\Context\ContextHandlerInterface
276 * The context handler.
277 */
278 protected function contextHandler() {
279 return \Drupal::service('context.handler');
280 }
281
282 /**
283 * Wraps the event dispatcher.
284 *
285 * @return \Symfony\Component\EventDispatcher\EventDispatcherInterface
286 * The event dispatcher.
287 */
288 protected function eventDispatcher() {
289 return \Drupal::service('event_dispatcher');
290 }
291
292 /**
293 * Returns an array representation of the section component.
294 *
295 * @internal
296 * This is intended for use by a storage mechanism for section components.
297 *
298 * @return array
299 * An array representation of the section component.
300 */
301 public function toArray() {
302 return [
303 'uuid' => $this->getUuid(),
304 'region' => $this->getRegion(),
305 'configuration' => $this->getConfiguration(),
306 'additional' => $this->additional,
307 'weight' => $this->getWeight(),
308 ];
309 }
310
311 }