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