annotate core/modules/block_content/src/Entity/BlockContent.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 namespace Drupal\block_content\Entity;
Chris@0 4
Chris@17 5 use Drupal\block_content\Access\RefinableDependentAccessTrait;
Chris@14 6 use Drupal\Core\Entity\EditorialContentEntityBase;
Chris@0 7 use Drupal\Core\Entity\EntityStorageInterface;
Chris@0 8 use Drupal\Core\Entity\EntityTypeInterface;
Chris@0 9 use Drupal\Core\Field\BaseFieldDefinition;
Chris@0 10 use Drupal\block_content\BlockContentInterface;
Chris@0 11 use Drupal\user\UserInterface;
Chris@0 12
Chris@0 13 /**
Chris@0 14 * Defines the custom block entity class.
Chris@0 15 *
Chris@0 16 * @ContentEntityType(
Chris@0 17 * id = "block_content",
Chris@0 18 * label = @Translation("Custom block"),
Chris@17 19 * label_collection = @Translation("Custom blocks"),
Chris@17 20 * label_singular = @Translation("custom block"),
Chris@17 21 * label_plural = @Translation("custom blocks"),
Chris@17 22 * label_count = @PluralTranslation(
Chris@17 23 * singular = "@count custom block",
Chris@17 24 * plural = "@count custom blocks",
Chris@17 25 * ),
Chris@0 26 * bundle_label = @Translation("Custom block type"),
Chris@0 27 * handlers = {
Chris@0 28 * "storage" = "Drupal\Core\Entity\Sql\SqlContentEntityStorage",
Chris@0 29 * "access" = "Drupal\block_content\BlockContentAccessControlHandler",
Chris@0 30 * "list_builder" = "Drupal\block_content\BlockContentListBuilder",
Chris@0 31 * "view_builder" = "Drupal\block_content\BlockContentViewBuilder",
Chris@0 32 * "views_data" = "Drupal\block_content\BlockContentViewsData",
Chris@0 33 * "form" = {
Chris@0 34 * "add" = "Drupal\block_content\BlockContentForm",
Chris@0 35 * "edit" = "Drupal\block_content\BlockContentForm",
Chris@0 36 * "delete" = "Drupal\block_content\Form\BlockContentDeleteForm",
Chris@0 37 * "default" = "Drupal\block_content\BlockContentForm"
Chris@0 38 * },
Chris@0 39 * "translation" = "Drupal\block_content\BlockContentTranslationHandler"
Chris@0 40 * },
Chris@0 41 * admin_permission = "administer blocks",
Chris@0 42 * base_table = "block_content",
Chris@0 43 * revision_table = "block_content_revision",
Chris@0 44 * data_table = "block_content_field_data",
Chris@0 45 * revision_data_table = "block_content_field_revision",
Chris@0 46 * show_revision_ui = TRUE,
Chris@0 47 * links = {
Chris@0 48 * "canonical" = "/block/{block_content}",
Chris@0 49 * "delete-form" = "/block/{block_content}/delete",
Chris@0 50 * "edit-form" = "/block/{block_content}",
Chris@0 51 * "collection" = "/admin/structure/block/block-content",
Chris@0 52 * "create" = "/block",
Chris@0 53 * },
Chris@0 54 * translatable = TRUE,
Chris@0 55 * entity_keys = {
Chris@0 56 * "id" = "id",
Chris@0 57 * "revision" = "revision_id",
Chris@0 58 * "bundle" = "type",
Chris@0 59 * "label" = "info",
Chris@0 60 * "langcode" = "langcode",
Chris@14 61 * "uuid" = "uuid",
Chris@14 62 * "published" = "status",
Chris@0 63 * },
Chris@0 64 * revision_metadata_keys = {
Chris@0 65 * "revision_user" = "revision_user",
Chris@0 66 * "revision_created" = "revision_created",
Chris@0 67 * "revision_log_message" = "revision_log"
Chris@0 68 * },
Chris@0 69 * bundle_entity_type = "block_content_type",
Chris@0 70 * field_ui_base_route = "entity.block_content_type.edit_form",
Chris@0 71 * render_cache = FALSE,
Chris@0 72 * )
Chris@0 73 *
Chris@0 74 * Note that render caching of block_content entities is disabled because they
Chris@0 75 * are always rendered as blocks, and blocks already have their own render
Chris@0 76 * caching.
Chris@0 77 * See https://www.drupal.org/node/2284917#comment-9132521 for more information.
Chris@0 78 */
Chris@14 79 class BlockContent extends EditorialContentEntityBase implements BlockContentInterface {
Chris@0 80
Chris@17 81 use RefinableDependentAccessTrait;
Chris@17 82
Chris@0 83 /**
Chris@0 84 * The theme the block is being created in.
Chris@0 85 *
Chris@0 86 * When creating a new custom block from the block library, the user is
Chris@0 87 * redirected to the configure form for that block in the given theme. The
Chris@0 88 * theme is stored against the block when the custom block add form is shown.
Chris@0 89 *
Chris@0 90 * @var string
Chris@0 91 */
Chris@0 92 protected $theme;
Chris@0 93
Chris@0 94 /**
Chris@0 95 * {@inheritdoc}
Chris@0 96 */
Chris@0 97 public function createDuplicate() {
Chris@0 98 $duplicate = parent::createDuplicate();
Chris@0 99 $duplicate->revision_id->value = NULL;
Chris@0 100 $duplicate->id->value = NULL;
Chris@0 101 return $duplicate;
Chris@0 102 }
Chris@0 103
Chris@0 104 /**
Chris@0 105 * {@inheritdoc}
Chris@0 106 */
Chris@0 107 public function setTheme($theme) {
Chris@0 108 $this->theme = $theme;
Chris@0 109 return $this;
Chris@0 110 }
Chris@0 111
Chris@0 112 /**
Chris@0 113 * {@inheritdoc}
Chris@0 114 */
Chris@0 115 public function getTheme() {
Chris@0 116 return $this->theme;
Chris@0 117 }
Chris@0 118
Chris@0 119 /**
Chris@0 120 * {@inheritdoc}
Chris@0 121 */
Chris@0 122 public function postSave(EntityStorageInterface $storage, $update = TRUE) {
Chris@0 123 parent::postSave($storage, $update);
Chris@17 124 if ($this->isReusable() || (isset($this->original) && $this->original->isReusable())) {
Chris@17 125 static::invalidateBlockPluginCache();
Chris@17 126 }
Chris@0 127 }
Chris@0 128
Chris@0 129 /**
Chris@0 130 * {@inheritdoc}
Chris@0 131 */
Chris@0 132 public static function postDelete(EntityStorageInterface $storage, array $entities) {
Chris@0 133 parent::postDelete($storage, $entities);
Chris@17 134 /** @var \Drupal\block_content\BlockContentInterface $block */
Chris@17 135 foreach ($entities as $block) {
Chris@17 136 if ($block->isReusable()) {
Chris@17 137 // If any deleted blocks are reusable clear the block cache.
Chris@17 138 static::invalidateBlockPluginCache();
Chris@17 139 return;
Chris@17 140 }
Chris@17 141 }
Chris@0 142 }
Chris@0 143
Chris@0 144 /**
Chris@0 145 * {@inheritdoc}
Chris@0 146 */
Chris@0 147 public function getInstances() {
Chris@0 148 return \Drupal::entityTypeManager()->getStorage('block')->loadByProperties(['plugin' => 'block_content:' . $this->uuid()]);
Chris@0 149 }
Chris@0 150
Chris@0 151 /**
Chris@0 152 * {@inheritdoc}
Chris@0 153 */
Chris@0 154 public function preSaveRevision(EntityStorageInterface $storage, \stdClass $record) {
Chris@0 155 parent::preSaveRevision($storage, $record);
Chris@0 156
Chris@0 157 if (!$this->isNewRevision() && isset($this->original) && (!isset($record->revision_log) || $record->revision_log === '')) {
Chris@0 158 // If we are updating an existing block_content without adding a new
Chris@0 159 // revision and the user did not supply a revision log, keep the existing
Chris@0 160 // one.
Chris@0 161 $record->revision_log = $this->original->getRevisionLogMessage();
Chris@0 162 }
Chris@0 163 }
Chris@0 164
Chris@0 165 /**
Chris@0 166 * {@inheritdoc}
Chris@0 167 */
Chris@0 168 public function delete() {
Chris@0 169 foreach ($this->getInstances() as $instance) {
Chris@0 170 $instance->delete();
Chris@0 171 }
Chris@0 172 parent::delete();
Chris@0 173 }
Chris@0 174
Chris@0 175 /**
Chris@0 176 * {@inheritdoc}
Chris@0 177 */
Chris@0 178 public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
Chris@0 179 /** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */
Chris@0 180 $fields = parent::baseFieldDefinitions($entity_type);
Chris@0 181
Chris@0 182 $fields['id']->setLabel(t('Custom block ID'))
Chris@0 183 ->setDescription(t('The custom block ID.'));
Chris@0 184
Chris@0 185 $fields['uuid']->setDescription(t('The custom block UUID.'));
Chris@0 186
Chris@0 187 $fields['revision_id']->setDescription(t('The revision ID.'));
Chris@0 188
Chris@0 189 $fields['langcode']->setDescription(t('The custom block language code.'));
Chris@0 190
Chris@0 191 $fields['type']->setLabel(t('Block type'))
Chris@0 192 ->setDescription(t('The block type.'));
Chris@0 193
Chris@14 194 $fields['revision_log']->setDescription(t('The log entry explaining the changes in this revision.'));
Chris@14 195
Chris@0 196 $fields['info'] = BaseFieldDefinition::create('string')
Chris@0 197 ->setLabel(t('Block description'))
Chris@0 198 ->setDescription(t('A brief description of your block.'))
Chris@0 199 ->setRevisionable(TRUE)
Chris@0 200 ->setTranslatable(TRUE)
Chris@0 201 ->setRequired(TRUE)
Chris@0 202 ->setDisplayOptions('form', [
Chris@0 203 'type' => 'string_textfield',
Chris@0 204 'weight' => -5,
Chris@0 205 ])
Chris@0 206 ->setDisplayConfigurable('form', TRUE)
Chris@0 207 ->addConstraint('UniqueField', []);
Chris@0 208
Chris@0 209 $fields['changed'] = BaseFieldDefinition::create('changed')
Chris@0 210 ->setLabel(t('Changed'))
Chris@0 211 ->setDescription(t('The time that the custom block was last edited.'))
Chris@0 212 ->setTranslatable(TRUE)
Chris@0 213 ->setRevisionable(TRUE);
Chris@0 214
Chris@17 215 $fields['reusable'] = BaseFieldDefinition::create('boolean')
Chris@17 216 ->setLabel(t('Reusable'))
Chris@17 217 ->setDescription(t('A boolean indicating whether this block is reusable.'))
Chris@17 218 ->setTranslatable(FALSE)
Chris@17 219 ->setRevisionable(FALSE)
Chris@17 220 ->setDefaultValue(TRUE);
Chris@17 221
Chris@0 222 return $fields;
Chris@0 223 }
Chris@0 224
Chris@0 225 /**
Chris@0 226 * {@inheritdoc}
Chris@0 227 */
Chris@0 228 public function getRevisionLog() {
Chris@0 229 return $this->getRevisionLogMessage();
Chris@0 230 }
Chris@0 231
Chris@0 232 /**
Chris@0 233 * {@inheritdoc}
Chris@0 234 */
Chris@0 235 public function setInfo($info) {
Chris@0 236 $this->set('info', $info);
Chris@0 237 return $this;
Chris@0 238 }
Chris@0 239
Chris@0 240 /**
Chris@0 241 * {@inheritdoc}
Chris@0 242 */
Chris@0 243 public function setRevisionLog($revision_log) {
Chris@0 244 return $this->setRevisionLogMessage($revision_log);
Chris@0 245 }
Chris@0 246
Chris@0 247 /**
Chris@0 248 * {@inheritdoc}
Chris@0 249 */
Chris@0 250 public function getRevisionCreationTime() {
Chris@0 251 return $this->get('revision_created')->value;
Chris@0 252 }
Chris@0 253
Chris@0 254 /**
Chris@0 255 * {@inheritdoc}
Chris@0 256 */
Chris@0 257 public function setRevisionCreationTime($timestamp) {
Chris@0 258 $this->set('revision_created', $timestamp);
Chris@0 259 return $this;
Chris@0 260 }
Chris@0 261
Chris@0 262 /**
Chris@0 263 * {@inheritdoc}
Chris@0 264 */
Chris@0 265 public function getRevisionUser() {
Chris@0 266 return $this->get('revision_user')->entity;
Chris@0 267 }
Chris@0 268
Chris@0 269 public function setRevisionUser(UserInterface $account) {
Chris@0 270 $this->set('revision_user', $account);
Chris@0 271 return $this;
Chris@0 272 }
Chris@0 273
Chris@0 274 /**
Chris@0 275 * {@inheritdoc}
Chris@0 276 */
Chris@0 277 public function getRevisionUserId() {
Chris@0 278 return $this->get('revision_user')->entity->id();
Chris@0 279 }
Chris@0 280
Chris@0 281 /**
Chris@0 282 * {@inheritdoc}
Chris@0 283 */
Chris@0 284 public function setRevisionUserId($user_id) {
Chris@0 285 $this->set('revision_user', $user_id);
Chris@0 286 return $this;
Chris@0 287 }
Chris@0 288
Chris@0 289 /**
Chris@0 290 * {@inheritdoc}
Chris@0 291 */
Chris@0 292 public function getRevisionLogMessage() {
Chris@0 293 return $this->get('revision_log')->value;
Chris@0 294 }
Chris@0 295
Chris@0 296 /**
Chris@0 297 * {@inheritdoc}
Chris@0 298 */
Chris@0 299 public function setRevisionLogMessage($revision_log_message) {
Chris@0 300 $this->set('revision_log', $revision_log_message);
Chris@0 301 return $this;
Chris@0 302 }
Chris@0 303
Chris@0 304 /**
Chris@17 305 * {@inheritdoc}
Chris@17 306 */
Chris@17 307 public function isReusable() {
Chris@17 308 return (bool) $this->get('reusable')->value;
Chris@17 309 }
Chris@17 310
Chris@17 311 /**
Chris@17 312 * {@inheritdoc}
Chris@17 313 */
Chris@17 314 public function setReusable() {
Chris@17 315 return $this->set('reusable', TRUE);
Chris@17 316 }
Chris@17 317
Chris@17 318 /**
Chris@17 319 * {@inheritdoc}
Chris@17 320 */
Chris@17 321 public function setNonReusable() {
Chris@17 322 return $this->set('reusable', FALSE);
Chris@17 323 }
Chris@17 324
Chris@17 325 /**
Chris@0 326 * Invalidates the block plugin cache after changes and deletions.
Chris@0 327 */
Chris@0 328 protected static function invalidateBlockPluginCache() {
Chris@0 329 // Invalidate the block cache to update custom block-based derivatives.
Chris@0 330 \Drupal::service('plugin.manager.block')->clearCachedDefinitions();
Chris@0 331 }
Chris@0 332
Chris@0 333 }