Chris@0: revision_id->value = NULL; Chris@0: $duplicate->id->value = NULL; Chris@0: return $duplicate; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setTheme($theme) { Chris@0: $this->theme = $theme; Chris@0: return $this; 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 postSave(EntityStorageInterface $storage, $update = TRUE) { Chris@0: parent::postSave($storage, $update); Chris@17: if ($this->isReusable() || (isset($this->original) && $this->original->isReusable())) { Chris@17: static::invalidateBlockPluginCache(); Chris@17: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public static function postDelete(EntityStorageInterface $storage, array $entities) { Chris@0: parent::postDelete($storage, $entities); Chris@17: /** @var \Drupal\block_content\BlockContentInterface $block */ Chris@17: foreach ($entities as $block) { Chris@17: if ($block->isReusable()) { Chris@17: // If any deleted blocks are reusable clear the block cache. Chris@17: static::invalidateBlockPluginCache(); Chris@17: return; Chris@17: } Chris@17: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getInstances() { Chris@0: return \Drupal::entityTypeManager()->getStorage('block')->loadByProperties(['plugin' => 'block_content:' . $this->uuid()]); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function preSaveRevision(EntityStorageInterface $storage, \stdClass $record) { Chris@0: parent::preSaveRevision($storage, $record); Chris@0: Chris@0: if (!$this->isNewRevision() && isset($this->original) && (!isset($record->revision_log) || $record->revision_log === '')) { Chris@0: // If we are updating an existing block_content without adding a new Chris@0: // revision and the user did not supply a revision log, keep the existing Chris@0: // one. Chris@0: $record->revision_log = $this->original->getRevisionLogMessage(); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function delete() { Chris@0: foreach ($this->getInstances() as $instance) { Chris@0: $instance->delete(); Chris@0: } Chris@0: parent::delete(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { Chris@0: /** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */ Chris@0: $fields = parent::baseFieldDefinitions($entity_type); Chris@0: Chris@0: $fields['id']->setLabel(t('Custom block ID')) Chris@0: ->setDescription(t('The custom block ID.')); Chris@0: Chris@0: $fields['uuid']->setDescription(t('The custom block UUID.')); Chris@0: Chris@0: $fields['revision_id']->setDescription(t('The revision ID.')); Chris@0: Chris@0: $fields['langcode']->setDescription(t('The custom block language code.')); Chris@0: Chris@0: $fields['type']->setLabel(t('Block type')) Chris@0: ->setDescription(t('The block type.')); Chris@0: Chris@14: $fields['revision_log']->setDescription(t('The log entry explaining the changes in this revision.')); Chris@14: Chris@0: $fields['info'] = BaseFieldDefinition::create('string') Chris@0: ->setLabel(t('Block description')) Chris@0: ->setDescription(t('A brief description of your block.')) Chris@0: ->setRevisionable(TRUE) Chris@0: ->setTranslatable(TRUE) Chris@0: ->setRequired(TRUE) Chris@0: ->setDisplayOptions('form', [ Chris@0: 'type' => 'string_textfield', Chris@0: 'weight' => -5, Chris@0: ]) Chris@0: ->setDisplayConfigurable('form', TRUE) Chris@0: ->addConstraint('UniqueField', []); Chris@0: Chris@0: $fields['changed'] = BaseFieldDefinition::create('changed') Chris@0: ->setLabel(t('Changed')) Chris@0: ->setDescription(t('The time that the custom block was last edited.')) Chris@0: ->setTranslatable(TRUE) Chris@0: ->setRevisionable(TRUE); Chris@0: Chris@17: $fields['reusable'] = BaseFieldDefinition::create('boolean') Chris@17: ->setLabel(t('Reusable')) Chris@17: ->setDescription(t('A boolean indicating whether this block is reusable.')) Chris@17: ->setTranslatable(FALSE) Chris@17: ->setRevisionable(FALSE) Chris@17: ->setDefaultValue(TRUE); Chris@17: Chris@0: return $fields; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getRevisionLog() { Chris@0: return $this->getRevisionLogMessage(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setInfo($info) { Chris@0: $this->set('info', $info); Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setRevisionLog($revision_log) { Chris@0: return $this->setRevisionLogMessage($revision_log); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getRevisionCreationTime() { Chris@0: return $this->get('revision_created')->value; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setRevisionCreationTime($timestamp) { Chris@0: $this->set('revision_created', $timestamp); Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getRevisionUser() { Chris@0: return $this->get('revision_user')->entity; Chris@0: } Chris@0: Chris@0: public function setRevisionUser(UserInterface $account) { Chris@0: $this->set('revision_user', $account); Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getRevisionUserId() { Chris@0: return $this->get('revision_user')->entity->id(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setRevisionUserId($user_id) { Chris@0: $this->set('revision_user', $user_id); Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function getRevisionLogMessage() { Chris@0: return $this->get('revision_log')->value; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function setRevisionLogMessage($revision_log_message) { Chris@0: $this->set('revision_log', $revision_log_message); Chris@0: return $this; Chris@0: } Chris@0: Chris@0: /** Chris@17: * {@inheritdoc} Chris@17: */ Chris@17: public function isReusable() { Chris@17: return (bool) $this->get('reusable')->value; Chris@17: } Chris@17: Chris@17: /** Chris@17: * {@inheritdoc} Chris@17: */ Chris@17: public function setReusable() { Chris@17: return $this->set('reusable', TRUE); Chris@17: } Chris@17: Chris@17: /** Chris@17: * {@inheritdoc} Chris@17: */ Chris@17: public function setNonReusable() { Chris@17: return $this->set('reusable', FALSE); Chris@17: } Chris@17: Chris@17: /** Chris@0: * Invalidates the block plugin cache after changes and deletions. Chris@0: */ Chris@0: protected static function invalidateBlockPluginCache() { Chris@0: // Invalidate the block cache to update custom block-based derivatives. Chris@0: \Drupal::service('plugin.manager.block')->clearCachedDefinitions(); Chris@0: } Chris@0: Chris@0: }