annotate core/modules/taxonomy/taxonomy.post_update.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents af1871eacc83
children
rev   line source
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 }