X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Flayout_builder%2Fsrc%2FSectionComponent.php;fp=web%2Fcore%2Fmodules%2Flayout_builder%2Fsrc%2FSectionComponent.php;h=081d982f054b4dd50a12876a349acca5df6c0fa1;hp=0000000000000000000000000000000000000000;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 diff --git a/web/core/modules/layout_builder/src/SectionComponent.php b/web/core/modules/layout_builder/src/SectionComponent.php new file mode 100644 index 000000000..081d982f0 --- /dev/null +++ b/web/core/modules/layout_builder/src/SectionComponent.php @@ -0,0 +1,311 @@ +uuid = $uuid; + $this->region = $region; + $this->configuration = $configuration; + $this->additional = $additional; + } + + /** + * Returns the renderable array for this component. + * + * @param \Drupal\Core\Plugin\Context\ContextInterface[] $contexts + * An array of available contexts. + * @param bool $in_preview + * TRUE if the component is being previewed, FALSE otherwise. + * + * @return array + * A renderable array representing the content of the component. + */ + public function toRenderArray(array $contexts = [], $in_preview = FALSE) { + $event = new SectionComponentBuildRenderArrayEvent($this, $contexts, $in_preview); + $this->eventDispatcher()->dispatch(LayoutBuilderEvents::SECTION_COMPONENT_BUILD_RENDER_ARRAY, $event); + $output = $event->getBuild(); + $event->getCacheableMetadata()->applyTo($output); + return $output; + } + + /** + * Gets any arbitrary property for the component. + * + * @param string $property + * The property to retrieve. + * + * @return mixed + * The value for that property, or NULL if the property does not exist. + */ + public function get($property) { + if (property_exists($this, $property)) { + $value = isset($this->{$property}) ? $this->{$property} : NULL; + } + else { + $value = isset($this->additional[$property]) ? $this->additional[$property] : NULL; + } + return $value; + } + + /** + * Sets a value to an arbitrary property for the component. + * + * @param string $property + * The property to use for the value. + * @param mixed $value + * The value to set. + * + * @return $this + */ + public function set($property, $value) { + if (property_exists($this, $property)) { + $this->{$property} = $value; + } + else { + $this->additional[$property] = $value; + } + return $this; + } + + /** + * Gets the region for the component. + * + * @return string + * The region. + */ + public function getRegion() { + return $this->region; + } + + /** + * Sets the region for the component. + * + * @param string $region + * The region. + * + * @return $this + */ + public function setRegion($region) { + $this->region = $region; + return $this; + } + + /** + * Gets the weight of the component. + * + * @return int + * The zero-based weight of the component. + * + * @throws \UnexpectedValueException + * Thrown if the weight was never set. + */ + public function getWeight() { + return $this->weight; + } + + /** + * Sets the weight of the component. + * + * @param int $weight + * The zero-based weight of the component. + * + * @return $this + */ + public function setWeight($weight) { + $this->weight = $weight; + return $this; + } + + /** + * Gets the component plugin configuration. + * + * @return mixed[] + * The component plugin configuration. + */ + protected function getConfiguration() { + return $this->configuration; + } + + /** + * Sets the plugin configuration. + * + * @param mixed[] $configuration + * The plugin configuration. + * + * @return $this + */ + public function setConfiguration(array $configuration) { + $this->configuration = $configuration; + return $this; + } + + /** + * Gets the plugin ID. + * + * @return string + * The plugin ID. + * + * @throws \Drupal\Component\Plugin\Exception\PluginException + * Thrown if the plugin ID cannot be found. + */ + public function getPluginId() { + if (empty($this->configuration['id'])) { + throw new PluginException(sprintf('No plugin ID specified for component with "%s" UUID', $this->uuid)); + } + return $this->configuration['id']; + } + + /** + * Gets the UUID for this component. + * + * @return string + * The UUID. + */ + public function getUuid() { + return $this->uuid; + } + + /** + * Gets the plugin for this component. + * + * @param \Drupal\Core\Plugin\Context\ContextInterface[] $contexts + * An array of contexts to set on the plugin. + * + * @return \Drupal\Component\Plugin\PluginInspectionInterface + * The plugin. + */ + public function getPlugin(array $contexts = []) { + $plugin = $this->pluginManager()->createInstance($this->getPluginId(), $this->getConfiguration()); + if ($contexts && $plugin instanceof ContextAwarePluginInterface) { + $this->contextHandler()->applyContextMapping($plugin, $contexts); + } + return $plugin; + } + + /** + * Wraps the component plugin manager. + * + * @return \Drupal\Core\Block\BlockManagerInterface + * The plugin manager. + */ + protected function pluginManager() { + // @todo Figure out the best way to unify fields and blocks and components + // in https://www.drupal.org/node/1875974. + return \Drupal::service('plugin.manager.block'); + } + + /** + * Wraps the context handler. + * + * @return \Drupal\Core\Plugin\Context\ContextHandlerInterface + * The context handler. + */ + protected function contextHandler() { + return \Drupal::service('context.handler'); + } + + /** + * Wraps the event dispatcher. + * + * @return \Symfony\Component\EventDispatcher\EventDispatcherInterface + * The event dispatcher. + */ + protected function eventDispatcher() { + return \Drupal::service('event_dispatcher'); + } + + /** + * Returns an array representation of the section component. + * + * @internal + * This is intended for use by a storage mechanism for section components. + * + * @return array + * An array representation of the section component. + */ + public function toArray() { + return [ + 'uuid' => $this->getUuid(), + 'region' => $this->getRegion(), + 'configuration' => $this->getConfiguration(), + 'additional' => $this->additional, + 'weight' => $this->getWeight(), + ]; + } + +}