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 }
|