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