Chris@0: getDefinition($layout_id); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Implements \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface::getLayoutId(). Chris@0: */ Chris@0: public function getLayoutId() { Chris@0: return $this->getThirdPartySetting('field_layout', 'id'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Implements \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface::getLayoutSettings(). Chris@0: */ Chris@0: public function getLayoutSettings() { Chris@0: return $this->getThirdPartySetting('field_layout', 'settings', []); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Implements \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface::setLayoutId(). Chris@0: */ Chris@0: public function setLayoutId($layout_id, array $layout_settings = []) { Chris@0: if ($this->getLayoutId() !== $layout_id) { Chris@0: // @todo Devise a mechanism for mapping old regions to new ones in Chris@0: // https://www.drupal.org/node/2796877. Chris@0: $layout_definition = $this->getLayoutDefinition($layout_id); Chris@0: $new_region = $layout_definition->getDefaultRegion(); Chris@0: $layout_regions = $layout_definition->getRegions(); Chris@0: foreach ($this->getComponents() as $name => $component) { Chris@0: if (isset($component['region']) && !isset($layout_regions[$component['region']])) { Chris@0: $component['region'] = $new_region; Chris@0: $this->setComponent($name, $component); Chris@0: } Chris@0: } Chris@0: } Chris@0: $this->setThirdPartySetting('field_layout', 'id', $layout_id); Chris@0: // Instantiate the plugin and consult it for the updated plugin Chris@0: // configuration. Once layouts are no longer stored as third party settings, Chris@0: // this will be handled by the code in Chris@0: // \Drupal\Core\Config\Entity\ConfigEntityBase::set() that handles Chris@0: // \Drupal\Core\Entity\EntityWithPluginCollectionInterface. Chris@0: $layout_settings = $this->doGetLayout($layout_id, $layout_settings)->getConfiguration(); Chris@0: $this->setThirdPartySetting('field_layout', 'settings', $layout_settings); Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Implements \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface::setLayout(). Chris@0: */ Chris@0: public function setLayout(LayoutInterface $layout) { Chris@0: $this->setLayoutId($layout->getPluginId(), $layout->getConfiguration()); Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Implements \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface::getLayout(). Chris@0: */ Chris@0: public function getLayout() { Chris@0: return $this->doGetLayout($this->getLayoutId(), $this->getLayoutSettings()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Gets the layout plugin. Chris@0: * Chris@0: * @param string $layout_id Chris@0: * A layout plugin ID. Chris@0: * @param array $layout_settings Chris@0: * An array of settings. Chris@0: * Chris@0: * @return \Drupal\Core\Layout\LayoutInterface Chris@0: * The layout plugin. Chris@0: */ Chris@0: protected function doGetLayout($layout_id, array $layout_settings) { Chris@0: return \Drupal::service('plugin.manager.core.layout')->createInstance($layout_id, $layout_settings); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Overrides \Drupal\Core\Entity\EntityDisplayBase::init(). Chris@0: */ Chris@0: protected function init() { Chris@0: $this->ensureLayout(); Chris@0: parent::init(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Overrides \Drupal\Core\Entity\EntityDisplayBase::preSave(). Chris@0: */ Chris@0: public function preSave(EntityStorageInterface $storage) { Chris@0: parent::preSave($storage); Chris@0: Chris@0: // Ensure the plugin configuration is updated. Once layouts are no longer Chris@0: // stored as third party settings, this will be handled by the code in Chris@0: // \Drupal\Core\Config\Entity\ConfigEntityBase::preSave() that handles Chris@0: // \Drupal\Core\Entity\EntityWithPluginCollectionInterface. Chris@0: if ($this->getLayoutId()) { Chris@0: $this->setLayout($this->getLayout()); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function ensureLayout($default_layout_id = 'layout_onecol') { Chris@0: if (!$this->getLayoutId()) { Chris@0: $this->setLayoutId($default_layout_id); Chris@0: } Chris@0: Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Overrides \Drupal\Core\Entity\EntityDisplayBase::calculateDependencies(). Chris@0: * Chris@0: * Ensure the plugin dependencies are included. Once layouts are no longer Chris@0: * stored as third party settings, this will be handled by the code in Chris@0: * \Drupal\Core\Config\Entity\ConfigEntityBase::calculateDependencies() that Chris@0: * handles \Drupal\Core\Entity\EntityWithPluginCollectionInterface. Chris@0: */ Chris@0: public function calculateDependencies() { Chris@0: parent::calculateDependencies(); Chris@0: Chris@0: // This can be called during uninstallation, so check for a valid ID first. Chris@0: if ($this->getLayoutId()) { Chris@0: $this->calculatePluginDependencies($this->getLayout()); Chris@0: } Chris@18: return $this; Chris@0: } Chris@0: Chris@0: }