Chris@17
|
1 <?php
|
Chris@17
|
2
|
Chris@17
|
3 /**
|
Chris@17
|
4 * @file
|
Chris@17
|
5 * Post update functions for Taxonomy.
|
Chris@17
|
6 */
|
Chris@17
|
7
|
Chris@17
|
8 use Drupal\Core\Config\Entity\ConfigEntityUpdater;
|
Chris@18
|
9 use Drupal\Core\Field\BaseFieldDefinition;
|
Chris@18
|
10 use Drupal\Core\StringTranslation\TranslatableMarkup;
|
Chris@17
|
11 use Drupal\views\ViewExecutable;
|
Chris@17
|
12
|
Chris@17
|
13 /**
|
Chris@17
|
14 * Clear caches due to updated taxonomy entity views data.
|
Chris@17
|
15 */
|
Chris@17
|
16 function taxonomy_post_update_clear_views_data_cache() {
|
Chris@17
|
17 // An empty update will flush caches.
|
Chris@17
|
18 }
|
Chris@17
|
19
|
Chris@17
|
20 /**
|
Chris@17
|
21 * Clear entity_bundle_field_definitions cache for new parent field settings.
|
Chris@17
|
22 */
|
Chris@17
|
23 function taxonomy_post_update_clear_entity_bundle_field_definitions_cache() {
|
Chris@17
|
24 // An empty update will flush caches.
|
Chris@17
|
25 }
|
Chris@17
|
26
|
Chris@17
|
27 /**
|
Chris@17
|
28 * Add a 'published' = TRUE filter for all Taxonomy term views and converts
|
Chris@17
|
29 * existing ones that were using the 'content_translation_status' field.
|
Chris@17
|
30 */
|
Chris@17
|
31 function taxonomy_post_update_handle_publishing_status_addition_in_views(&$sandbox = NULL) {
|
Chris@17
|
32 $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
|
Chris@17
|
33 $entity_type = $definition_update_manager->getEntityType('taxonomy_term');
|
Chris@17
|
34 $published_key = $entity_type->getKey('published');
|
Chris@17
|
35
|
Chris@17
|
36 $status_filter = [
|
Chris@17
|
37 'id' => 'status',
|
Chris@17
|
38 'table' => 'taxonomy_term_field_data',
|
Chris@17
|
39 'field' => $published_key,
|
Chris@17
|
40 'relationship' => 'none',
|
Chris@17
|
41 'group_type' => 'group',
|
Chris@17
|
42 'admin_label' => '',
|
Chris@17
|
43 'operator' => '=',
|
Chris@17
|
44 'value' => '1',
|
Chris@17
|
45 'group' => 1,
|
Chris@17
|
46 'exposed' => FALSE,
|
Chris@17
|
47 'expose' => [
|
Chris@17
|
48 'operator_id' => '',
|
Chris@17
|
49 'label' => '',
|
Chris@17
|
50 'description' => '',
|
Chris@17
|
51 'use_operator' => FALSE,
|
Chris@17
|
52 'operator' => '',
|
Chris@17
|
53 'identifier' => '',
|
Chris@17
|
54 'required' => FALSE,
|
Chris@17
|
55 'remember' => FALSE,
|
Chris@17
|
56 'multiple' => FALSE,
|
Chris@17
|
57 'remember_roles' => [
|
Chris@17
|
58 'authenticated' => 'authenticated',
|
Chris@17
|
59 'anonymous' => '0',
|
Chris@17
|
60 'administrator' => '0',
|
Chris@17
|
61 ],
|
Chris@17
|
62 ],
|
Chris@17
|
63 'is_grouped' => FALSE,
|
Chris@17
|
64 'group_info' => [
|
Chris@17
|
65 'label' => '',
|
Chris@17
|
66 'description' => '',
|
Chris@17
|
67 'identifier' => '',
|
Chris@17
|
68 'optional' => TRUE,
|
Chris@17
|
69 'widget' => 'select',
|
Chris@17
|
70 'multiple' => FALSE,
|
Chris@17
|
71 'remember' => FALSE,
|
Chris@17
|
72 'default_group' => 'All',
|
Chris@17
|
73 'default_group_multiple' => [],
|
Chris@17
|
74 'group_items' => [],
|
Chris@17
|
75 ],
|
Chris@17
|
76 'entity_type' => 'taxonomy_term',
|
Chris@17
|
77 'entity_field' => $published_key,
|
Chris@17
|
78 'plugin_id' => 'boolean',
|
Chris@17
|
79 ];
|
Chris@17
|
80
|
Chris@17
|
81 \Drupal::classResolver(ConfigEntityUpdater::class)->update($sandbox, 'view', function ($view) use ($published_key, $status_filter) {
|
Chris@17
|
82 /** @var \Drupal\views\ViewEntityInterface $view */
|
Chris@17
|
83 // Only alter taxonomy term views.
|
Chris@17
|
84 if ($view->get('base_table') !== 'taxonomy_term_field_data') {
|
Chris@17
|
85 return FALSE;
|
Chris@17
|
86 }
|
Chris@17
|
87
|
Chris@17
|
88 $displays = $view->get('display');
|
Chris@17
|
89 foreach ($displays as $display_name => &$display) {
|
Chris@17
|
90 // Update any existing 'content_translation_status fields.
|
Chris@17
|
91 $fields = isset($display['display_options']['fields']) ? $display['display_options']['fields'] : [];
|
Chris@17
|
92 foreach ($fields as $id => $field) {
|
Chris@17
|
93 if (isset($field['field']) && $field['field'] == 'content_translation_status') {
|
Chris@17
|
94 $fields[$id]['field'] = $published_key;
|
Chris@17
|
95 }
|
Chris@17
|
96 }
|
Chris@17
|
97 $display['display_options']['fields'] = $fields;
|
Chris@17
|
98
|
Chris@17
|
99 // Update any existing 'content_translation_status sorts.
|
Chris@17
|
100 $sorts = isset($display['display_options']['sorts']) ? $display['display_options']['sorts'] : [];
|
Chris@17
|
101 foreach ($sorts as $id => $sort) {
|
Chris@17
|
102 if (isset($sort['field']) && $sort['field'] == 'content_translation_status') {
|
Chris@17
|
103 $sorts[$id]['field'] = $published_key;
|
Chris@17
|
104 }
|
Chris@17
|
105 }
|
Chris@17
|
106 $display['display_options']['sorts'] = $sorts;
|
Chris@17
|
107
|
Chris@17
|
108 // Update any existing 'content_translation_status' filters or add a new
|
Chris@17
|
109 // one if necessary.
|
Chris@17
|
110 $filters = isset($display['display_options']['filters']) ? $display['display_options']['filters'] : [];
|
Chris@17
|
111 $has_status_filter = FALSE;
|
Chris@17
|
112 foreach ($filters as $id => $filter) {
|
Chris@17
|
113 if (isset($filter['field']) && $filter['field'] == 'content_translation_status') {
|
Chris@17
|
114 $filters[$id]['field'] = $published_key;
|
Chris@17
|
115 $has_status_filter = TRUE;
|
Chris@17
|
116 }
|
Chris@17
|
117 }
|
Chris@17
|
118
|
Chris@17
|
119 if (!$has_status_filter) {
|
Chris@17
|
120 $status_filter['id'] = ViewExecutable::generateHandlerId($published_key, $filters);
|
Chris@17
|
121 $filters[$status_filter['id']] = $status_filter;
|
Chris@17
|
122 }
|
Chris@17
|
123 $display['display_options']['filters'] = $filters;
|
Chris@17
|
124 }
|
Chris@17
|
125 $view->set('display', $displays);
|
Chris@17
|
126
|
Chris@17
|
127 return TRUE;
|
Chris@17
|
128 });
|
Chris@17
|
129 }
|
Chris@18
|
130
|
Chris@18
|
131 /**
|
Chris@18
|
132 * Remove the 'hierarchy' property from vocabularies.
|
Chris@18
|
133 */
|
Chris@18
|
134 function taxonomy_post_update_remove_hierarchy_from_vocabularies(&$sandbox = NULL) {
|
Chris@18
|
135 \Drupal::classResolver(ConfigEntityUpdater::class)->update($sandbox, 'taxonomy_vocabulary', function () {
|
Chris@18
|
136 return TRUE;
|
Chris@18
|
137 });
|
Chris@18
|
138 }
|
Chris@18
|
139
|
Chris@18
|
140 /**
|
Chris@18
|
141 * Update taxonomy terms to be revisionable.
|
Chris@18
|
142 */
|
Chris@18
|
143 function taxonomy_post_update_make_taxonomy_term_revisionable(&$sandbox) {
|
Chris@18
|
144 $definition_update_manager = \Drupal::entityDefinitionUpdateManager();
|
Chris@18
|
145 /** @var \Drupal\Core\Entity\EntityLastInstalledSchemaRepositoryInterface $last_installed_schema_repository */
|
Chris@18
|
146 $last_installed_schema_repository = \Drupal::service('entity.last_installed_schema.repository');
|
Chris@18
|
147
|
Chris@18
|
148 $entity_type = $definition_update_manager->getEntityType('taxonomy_term');
|
Chris@18
|
149 $field_storage_definitions = $last_installed_schema_repository->getLastInstalledFieldStorageDefinitions('taxonomy_term');
|
Chris@18
|
150
|
Chris@18
|
151 // Update the entity type definition.
|
Chris@18
|
152 $entity_keys = $entity_type->getKeys();
|
Chris@18
|
153 $entity_keys['revision'] = 'revision_id';
|
Chris@18
|
154 $entity_keys['revision_translation_affected'] = 'revision_translation_affected';
|
Chris@18
|
155 $entity_type->set('entity_keys', $entity_keys);
|
Chris@18
|
156 $entity_type->set('revision_table', 'taxonomy_term_revision');
|
Chris@18
|
157 $entity_type->set('revision_data_table', 'taxonomy_term_field_revision');
|
Chris@18
|
158 $revision_metadata_keys = [
|
Chris@18
|
159 'revision_default' => 'revision_default',
|
Chris@18
|
160 'revision_user' => 'revision_user',
|
Chris@18
|
161 'revision_created' => 'revision_created',
|
Chris@18
|
162 'revision_log_message' => 'revision_log_message',
|
Chris@18
|
163 ];
|
Chris@18
|
164 $entity_type->set('revision_metadata_keys', $revision_metadata_keys);
|
Chris@18
|
165
|
Chris@18
|
166 // Update the field storage definitions and add the new ones required by a
|
Chris@18
|
167 // revisionable entity type.
|
Chris@18
|
168 $field_storage_definitions['langcode']->setRevisionable(TRUE);
|
Chris@18
|
169 $field_storage_definitions['name']->setRevisionable(TRUE);
|
Chris@18
|
170 $field_storage_definitions['description']->setRevisionable(TRUE);
|
Chris@18
|
171 $field_storage_definitions['changed']->setRevisionable(TRUE);
|
Chris@18
|
172
|
Chris@18
|
173 $field_storage_definitions['revision_id'] = BaseFieldDefinition::create('integer')
|
Chris@18
|
174 ->setName('revision_id')
|
Chris@18
|
175 ->setTargetEntityTypeId('taxonomy_term')
|
Chris@18
|
176 ->setTargetBundle(NULL)
|
Chris@18
|
177 ->setLabel(new TranslatableMarkup('Revision ID'))
|
Chris@18
|
178 ->setReadOnly(TRUE)
|
Chris@18
|
179 ->setSetting('unsigned', TRUE);
|
Chris@18
|
180
|
Chris@18
|
181 $field_storage_definitions['revision_default'] = BaseFieldDefinition::create('boolean')
|
Chris@18
|
182 ->setName('revision_default')
|
Chris@18
|
183 ->setTargetEntityTypeId('taxonomy_term')
|
Chris@18
|
184 ->setTargetBundle(NULL)
|
Chris@18
|
185 ->setLabel(new TranslatableMarkup('Default revision'))
|
Chris@18
|
186 ->setDescription(new TranslatableMarkup('A flag indicating whether this was a default revision when it was saved.'))
|
Chris@18
|
187 ->setStorageRequired(TRUE)
|
Chris@18
|
188 ->setInternal(TRUE)
|
Chris@18
|
189 ->setTranslatable(FALSE)
|
Chris@18
|
190 ->setRevisionable(TRUE);
|
Chris@18
|
191
|
Chris@18
|
192 $field_storage_definitions['revision_translation_affected'] = BaseFieldDefinition::create('boolean')
|
Chris@18
|
193 ->setName('revision_translation_affected')
|
Chris@18
|
194 ->setTargetEntityTypeId('taxonomy_term')
|
Chris@18
|
195 ->setTargetBundle(NULL)
|
Chris@18
|
196 ->setLabel(new TranslatableMarkup('Revision translation affected'))
|
Chris@18
|
197 ->setDescription(new TranslatableMarkup('Indicates if the last edit of a translation belongs to current revision.'))
|
Chris@18
|
198 ->setReadOnly(TRUE)
|
Chris@18
|
199 ->setRevisionable(TRUE)
|
Chris@18
|
200 ->setTranslatable(TRUE);
|
Chris@18
|
201
|
Chris@18
|
202 $field_storage_definitions['revision_created'] = BaseFieldDefinition::create('created')
|
Chris@18
|
203 ->setName('revision_created')
|
Chris@18
|
204 ->setTargetEntityTypeId('taxonomy_term')
|
Chris@18
|
205 ->setTargetBundle(NULL)
|
Chris@18
|
206 ->setLabel(new TranslatableMarkup('Revision create time'))
|
Chris@18
|
207 ->setDescription(new TranslatableMarkup('The time that the current revision was created.'))
|
Chris@18
|
208 ->setRevisionable(TRUE);
|
Chris@18
|
209 $field_storage_definitions['revision_user'] = BaseFieldDefinition::create('entity_reference')
|
Chris@18
|
210 ->setName('revision_user')
|
Chris@18
|
211 ->setTargetEntityTypeId('taxonomy_term')
|
Chris@18
|
212 ->setTargetBundle(NULL)
|
Chris@18
|
213 ->setLabel(new TranslatableMarkup('Revision user'))
|
Chris@18
|
214 ->setDescription(new TranslatableMarkup('The user ID of the author of the current revision.'))
|
Chris@18
|
215 ->setSetting('target_type', 'user')
|
Chris@18
|
216 ->setRevisionable(TRUE);
|
Chris@18
|
217 $field_storage_definitions['revision_log_message'] = BaseFieldDefinition::create('string_long')
|
Chris@18
|
218 ->setName('revision_log_message')
|
Chris@18
|
219 ->setTargetEntityTypeId('taxonomy_term')
|
Chris@18
|
220 ->setTargetBundle(NULL)
|
Chris@18
|
221 ->setLabel(new TranslatableMarkup('Revision log message'))
|
Chris@18
|
222 ->setDescription(new TranslatableMarkup('Briefly describe the changes you have made.'))
|
Chris@18
|
223 ->setRevisionable(TRUE)
|
Chris@18
|
224 ->setDefaultValue('');
|
Chris@18
|
225
|
Chris@18
|
226 $definition_update_manager->updateFieldableEntityType($entity_type, $field_storage_definitions, $sandbox);
|
Chris@18
|
227
|
Chris@18
|
228 return t('Taxonomy terms have been converted to be revisionable.');
|
Chris@18
|
229 }
|