Newer
Older
Dries Buytaert
committed
<?php
namespace Drupal\block_content\Entity;
Dries Buytaert
committed
use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EntityChangedTrait;
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"),
* 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",
* 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",
* },
Angie Byron
committed
* translatable = TRUE,
Dries Buytaert
committed
* entity_keys = {
* "id" = "id",
* "revision" = "revision_id",
* "bundle" = "type",
* "label" = "info",
* "langcode" = "langcode",
Dries Buytaert
committed
* "uuid" = "uuid"
* },
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
*/
class BlockContent extends ContentEntityBase implements BlockContentInterface {
Dries Buytaert
committed
use EntityChangedTrait;
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() {
catch
committed
return \Drupal::entityTypeManager()->getStorage('block')->loadByProperties(array('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.'));
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', array(
'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['revision_log'] = BaseFieldDefinition::create('string_long')
->setLabel(t('Revision log message'))
->setDescription(t('The log entry explaining the changes in this revision.'))
->setRevisionable(TRUE);
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);
Alex Pott
committed
$fields['revision_created'] = BaseFieldDefinition::create('created')
->setLabel(t('Revision create time'))
->setDescription(t('The time that the current revision was created.'))
->setRevisionable(TRUE);
$fields['revision_user'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Revision user'))
->setDescription(t('The user ID of the author of the current revision.'))
->setSetting('target_type', 'user')
->setRevisionable(TRUE);
catch
committed
$fields['revision_translation_affected'] = BaseFieldDefinition::create('boolean')
->setLabel(t('Revision translation affected'))
->setDescription(t('Indicates if the last edit of a translation belongs to current revision.'))
->setReadOnly(TRUE)
->setRevisionable(TRUE)
->setTranslatable(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
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
282
283
284
285
286
287
288
289
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();
}