Newer
Older
Dries Buytaert
committed
<?php
namespace Drupal\block_content\Entity;
Dries Buytaert
committed
Lee Rowlands
committed
use Drupal\Core\Entity\EditorialContentEntityBase;
catch
committed
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\EntityTypeInterface;
Alex Pott
committed
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\block_content\BlockContentInterface;
Alex Pott
committed
use Drupal\user\UserInterface;
Dries Buytaert
committed
/**
* Defines the custom block entity class.
*
Alex Pott
committed
* @ContentEntityType(
* id = "block_content",
Alex Pott
committed
* label = @Translation("Custom block"),
Alex Pott
committed
* label_collection = @Translation("Custom blocks"),
* label_singular = @Translation("custom block"),
* label_plural = @Translation("custom blocks"),
* label_count = @PluralTranslation(
* singular = "@count custom block",
* plural = "@count custom blocks",
* ),
Alex Pott
committed
* bundle_label = @Translation("Custom block type"),
Alex Pott
committed
* handlers = {
catch
committed
* "storage" = "Drupal\Core\Entity\Sql\SqlContentEntityStorage",
* "access" = "Drupal\block_content\BlockContentAccessControlHandler",
* "list_builder" = "Drupal\block_content\BlockContentListBuilder",
* "view_builder" = "Drupal\block_content\BlockContentViewBuilder",
Alex Pott
committed
* "views_data" = "Drupal\block_content\BlockContentViewsData",
* "add" = "Drupal\block_content\BlockContentForm",
* "edit" = "Drupal\block_content\BlockContentForm",
* "delete" = "Drupal\block_content\Form\BlockContentDeleteForm",
* "default" = "Drupal\block_content\BlockContentForm"
* "translation" = "Drupal\block_content\BlockContentTranslationHandler"
Dries Buytaert
committed
* },
* admin_permission = "administer blocks",
* base_table = "block_content",
* revision_table = "block_content_revision",
* data_table = "block_content_field_data",
Alex Pott
committed
* revision_data_table = "block_content_field_revision",
* show_revision_ui = TRUE,
* links = {
* "canonical" = "/block/{block_content}",
* "delete-form" = "/block/{block_content}/delete",
* "edit-form" = "/block/{block_content}",
Alex Pott
committed
* "collection" = "/admin/structure/block/block-content",
* "create" = "/block",
* },
Angie Byron
committed
* translatable = TRUE,
Dries Buytaert
committed
* entity_keys = {
* "id" = "id",
* "revision" = "revision_id",
* "bundle" = "type",
* "label" = "info",
* "langcode" = "langcode",
Lee Rowlands
committed
* "uuid" = "uuid",
* "published" = "status",
Dries Buytaert
committed
* },
* revision_metadata_keys = {
* "revision_user" = "revision_user",
* "revision_created" = "revision_created",
* "revision_log_message" = "revision_log"
* },
Alex Pott
committed
* bundle_entity_type = "block_content_type",
* field_ui_base_route = "entity.block_content_type.edit_form",
Alex Pott
committed
* render_cache = FALSE,
Dries Buytaert
committed
* )
Alex Pott
committed
*
* Note that render caching of block_content entities is disabled because they
* are always rendered as blocks, and blocks already have their own render
* caching.
* See https://www.drupal.org/node/2284917#comment-9132521 for more information.
Dries Buytaert
committed
*/
Lee Rowlands
committed
class BlockContent extends EditorialContentEntityBase implements BlockContentInterface {
Dries Buytaert
committed
/**
* The theme the block is being created in.
*
* When creating a new custom block from the block library, the user is
* redirected to the configure form for that block in the given theme. The
* theme is stored against the block when the custom block add form is shown.
*
* @var string
*/
protected $theme;
/**
Jennifer Hodgdon
committed
* {@inheritdoc}
Dries Buytaert
committed
*/
public function createDuplicate() {
$duplicate = parent::createDuplicate();
$duplicate->revision_id->value = NULL;
$duplicate->id->value = NULL;
return $duplicate;
}
/**
* {@inheritdoc}
Dries Buytaert
committed
*/
public function setTheme($theme) {
$this->theme = $theme;
return $this;
Dries Buytaert
committed
}
/**
* {@inheritdoc}
Dries Buytaert
committed
*/
public function getTheme() {
return $this->theme;
}
/**
* {@inheritdoc}
*/
catch
committed
public function postSave(EntityStorageInterface $storage, $update = TRUE) {
parent::postSave($storage, $update);
static::invalidateBlockPluginCache();
}
Angie Byron
committed
/**
* {@inheritdoc}
*/
public static function postDelete(EntityStorageInterface $storage, array $entities) {
parent::postDelete($storage, $entities);
static::invalidateBlockPluginCache();
}
Alex Pott
committed
/**
* {@inheritdoc}
*/
public function getInstances() {
return \Drupal::entityTypeManager()->getStorage('block')->loadByProperties(['plugin' => 'block_content:' . $this->uuid()]);
Alex Pott
committed
}
/**
* {@inheritdoc}
*/
catch
committed
public function preSaveRevision(EntityStorageInterface $storage, \stdClass $record) {
parent::preSaveRevision($storage, $record);
Angie Byron
committed
if (!$this->isNewRevision() && isset($this->original) && (!isset($record->revision_log) || $record->revision_log === '')) {
// If we are updating an existing block_content without adding a new
// revision and the user did not supply a revision log, keep the existing
// one.
Alex Pott
committed
$record->revision_log = $this->original->getRevisionLogMessage();
}
}
Alex Pott
committed
/**
* {@inheritdoc}
*/
public function delete() {
foreach ($this->getInstances() as $instance) {
$instance->delete();
}
parent::delete();
}
Alex Pott
committed
/**
* {@inheritdoc}
*/
public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
/** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */
$fields = parent::baseFieldDefinitions($entity_type);
$fields['id']->setLabel(t('Custom block ID'))
->setDescription(t('The custom block ID.'));
$fields['uuid']->setDescription(t('The custom block UUID.'));
$fields['revision_id']->setDescription(t('The revision ID.'));
$fields['langcode']->setDescription(t('The custom block language code.'));
$fields['type']->setLabel(t('Block type'))
->setDescription(t('The block type.'));
Lee Rowlands
committed
$fields['revision_log']->setDescription(t('The log entry explaining the changes in this revision.'));
Alex Pott
committed
$fields['info'] = BaseFieldDefinition::create('string')
catch
committed
->setLabel(t('Block description'))
->setDescription(t('A brief description of your block.'))
->setRevisionable(TRUE)
->setTranslatable(TRUE)
catch
committed
->setRequired(TRUE)
->setDisplayOptions('form', [
'type' => 'string_textfield',
catch
committed
'weight' => -5,
])
Alex Pott
committed
->setDisplayConfigurable('form', TRUE)
Alex Pott
committed
->addConstraint('UniqueField', []);
Alex Pott
committed
Alex Pott
committed
$fields['changed'] = BaseFieldDefinition::create('changed')
->setLabel(t('Changed'))
->setDescription(t('The time that the custom block was last edited.'))
->setTranslatable(TRUE)
->setRevisionable(TRUE);
return $fields;
Alex Pott
committed
}
/**
* {@inheritdoc}
*/
public function getRevisionLog() {
Alex Pott
committed
return $this->getRevisionLogMessage();
}
/**
* {@inheritdoc}
*/
public function setInfo($info) {
$this->set('info', $info);
return $this;
}
/**
* {@inheritdoc}
*/
public function setRevisionLog($revision_log) {
Alex Pott
committed
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
return $this->setRevisionLogMessage($revision_log);
}
/**
* {@inheritdoc}
*/
public function getRevisionCreationTime() {
return $this->get('revision_created')->value;
}
/**
* {@inheritdoc}
*/
public function setRevisionCreationTime($timestamp) {
$this->set('revision_created', $timestamp);
return $this;
}
/**
* {@inheritdoc}
*/
public function getRevisionUser() {
return $this->get('revision_user')->entity;
}
public function setRevisionUser(UserInterface $account) {
$this->set('revision_user', $account);
return $this;
}
/**
* {@inheritdoc}
*/
public function getRevisionUserId() {
return $this->get('revision_user')->entity->id();
}
/**
* {@inheritdoc}
*/
public function setRevisionUserId($user_id) {
$this->set('revision_user', $user_id);
return $this;
}
/**
* {@inheritdoc}
*/
public function getRevisionLogMessage() {
return $this->get('revision_log')->value;
}
/**
* {@inheritdoc}
*/
public function setRevisionLogMessage($revision_log_message) {
$this->set('revision_log', $revision_log_message);
return $this;
}
/**
* Invalidates the block plugin cache after changes and deletions.
*/
protected static function invalidateBlockPluginCache() {
// Invalidate the block cache to update custom block-based derivatives.
\Drupal::service('plugin.manager.block')->clearCachedDefinitions();
}