Chris@0: getPluginCollection()->get($this->plugin); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Encapsulates the creation of the block's LazyPluginCollection. Chris@0: * Chris@0: * @return \Drupal\Component\Plugin\LazyPluginCollection Chris@0: * The block's plugin collection. Chris@0: */ Chris@0: protected function getPluginCollection() { Chris@0: if (!$this->pluginCollection) { Chris@0: $this->pluginCollection = new BlockPluginCollection(\Drupal::service('plugin.manager.block'), $this->plugin, $this->get('settings'), $this->id()); Chris@0: } Chris@0: return $this->pluginCollection; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getPluginCollections() { Chris@0: return [ Chris@0: 'settings' => $this->getPluginCollection(), Chris@0: 'visibility' => $this->getVisibilityConditions(), Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getPluginId() { Chris@0: return $this->plugin; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getRegion() { Chris@0: return $this->region; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getTheme() { Chris@0: return $this->theme; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getWeight() { Chris@0: return $this->weight; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function label() { Chris@0: $settings = $this->get('settings'); Chris@0: if ($settings['label']) { Chris@0: return $settings['label']; Chris@0: } Chris@0: else { Chris@0: $definition = $this->getPlugin()->getPluginDefinition(); Chris@0: return $definition['admin_label']; Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sorts active blocks by weight; sorts inactive blocks by name. Chris@0: */ Chris@0: public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b) { Chris@0: // Separate enabled from disabled. Chris@0: $status = (int) $b->status() - (int) $a->status(); Chris@0: if ($status !== 0) { Chris@0: return $status; Chris@0: } Chris@0: Chris@0: // Sort by weight. Chris@0: $weight = $a->getWeight() - $b->getWeight(); Chris@0: if ($weight) { Chris@0: return $weight; Chris@0: } Chris@0: Chris@0: // Sort by label. Chris@0: return strcmp($a->label(), $b->label()); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function calculateDependencies() { Chris@0: parent::calculateDependencies(); Chris@0: $this->addDependency('theme', $this->theme); Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function postSave(EntityStorageInterface $storage, $update = TRUE) { Chris@0: parent::postSave($storage, $update); Chris@0: Chris@0: // Entity::postSave() calls Entity::invalidateTagsOnSave(), which only Chris@0: // handles the regular cases. The Block entity has one special case: a Chris@0: // newly created block may *also* appear on any page in the current theme, Chris@0: // so we must invalidate the associated block's cache tag (which includes Chris@0: // the theme cache tag). Chris@0: if (!$update) { Chris@0: Cache::invalidateTags($this->getCacheTagsToInvalidate()); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getVisibility() { Chris@0: return $this->getVisibilityConditions()->getConfiguration(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setVisibilityConfig($instance_id, array $configuration) { Chris@0: $conditions = $this->getVisibilityConditions(); Chris@0: if (!$conditions->has($instance_id)) { Chris@0: $configuration['id'] = $instance_id; Chris@0: $conditions->addInstanceId($instance_id, $configuration); Chris@0: } Chris@0: else { Chris@0: $conditions->setInstanceConfiguration($instance_id, $configuration); Chris@0: } Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getVisibilityConditions() { Chris@0: if (!isset($this->visibilityCollection)) { Chris@0: $this->visibilityCollection = new ConditionPluginCollection($this->conditionPluginManager(), $this->get('visibility')); Chris@0: } Chris@0: return $this->visibilityCollection; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getVisibilityCondition($instance_id) { Chris@0: return $this->getVisibilityConditions()->get($instance_id); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Gets the condition plugin manager. Chris@0: * Chris@0: * @return \Drupal\Core\Executable\ExecutableManagerInterface Chris@0: * The condition plugin manager. Chris@0: */ Chris@0: protected function conditionPluginManager() { Chris@0: if (!isset($this->conditionPluginManager)) { Chris@0: $this->conditionPluginManager = \Drupal::service('plugin.manager.condition'); Chris@0: } Chris@0: return $this->conditionPluginManager; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setRegion($region) { Chris@0: $this->region = $region; Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setWeight($weight) { Chris@0: $this->weight = $weight; Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function createDuplicateBlock($new_id = NULL, $new_theme = NULL) { Chris@0: $duplicate = parent::createDuplicate(); Chris@0: if (!empty($new_id)) { Chris@0: $duplicate->id = $new_id; Chris@0: } Chris@0: if (!empty($new_theme)) { Chris@0: $duplicate->theme = $new_theme; Chris@0: } Chris@0: return $duplicate; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function preSave(EntityStorageInterface $storage) { Chris@0: parent::preSave($storage); Chris@0: Chris@0: // Ensure the region is valid to mirror the behavior of block_rebuild(). Chris@0: // This is done primarily for backwards compatibility support of Chris@0: // \Drupal\block\BlockInterface::BLOCK_REGION_NONE. Chris@0: $regions = system_region_list($this->theme); Chris@0: if (!isset($regions[$this->region]) && $this->status()) { Chris@0: $this Chris@0: ->setRegion(system_default_region($this->theme)) Chris@0: ->disable(); Chris@0: } Chris@0: } Chris@0: Chris@0: }