Mercurial > hg > cmmr2012-drupal-site
diff core/modules/taxonomy/taxonomy.install @ 4:a9cd425dd02b
Update, including to Drupal core 8.6.10
author | Chris Cannam |
---|---|
date | Thu, 28 Feb 2019 13:11:55 +0000 |
parents | |
children | 12f9dff5fda9 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/taxonomy/taxonomy.install Thu Feb 28 13:11:55 2019 +0000 @@ -0,0 +1,188 @@ +<?php + +/** + * @file + * Install, update and uninstall functions for the taxonomy module. + */ + +use Drupal\Core\Field\BaseFieldDefinition; +use Drupal\Core\Site\Settings; + +/** + * Convert the custom taxonomy term hierarchy storage to a default storage. + */ +function taxonomy_update_8501() { + $definition_update_manager = \Drupal::entityDefinitionUpdateManager(); + + /** @var \Drupal\Core\Field\BaseFieldDefinition $field_storage_definition */ + $field_storage_definition = $definition_update_manager->getFieldStorageDefinition('parent', 'taxonomy_term'); + $field_storage_definition->setCustomStorage(FALSE); + $definition_update_manager->updateFieldStorageDefinition($field_storage_definition); +} + +/** + * Copy hierarchy from {taxonomy_term_hierarchy} to {taxonomy_term__parent}. + */ +function taxonomy_update_8502(&$sandbox) { + $database = \Drupal::database(); + + if (!isset($sandbox['current'])) { + // Set batch ops sandbox. + $sandbox['current'] = 0; + $sandbox['tid'] = -1; + $sandbox['delta'] = 0; + $sandbox['limit'] = Settings::get('entity_update_batch_size', 50); + + // Count records using a join, as there might be orphans in the hierarchy + // table. See https://www.drupal.org/project/drupal/issues/2997982. + $select = $database->select('taxonomy_term_hierarchy', 'h'); + $select->join('taxonomy_term_data', 'd', 'h.tid = d.tid'); + $sandbox['max'] = $select + ->countQuery() + ->execute() + ->fetchField(); + } + + // Save the hierarchy. + $select = $database->select('taxonomy_term_hierarchy', 'h'); + $select->join('taxonomy_term_data', 'd', 'h.tid = d.tid'); + $hierarchy = $select + ->fields('h', ['tid', 'parent']) + ->fields('d', ['vid', 'langcode']) + ->range($sandbox['current'], $sandbox['limit']) + ->orderBy('tid', 'ASC') + ->orderBy('parent', 'ASC') + ->execute() + ->fetchAll(); + + // Restore data. + $insert = $database->insert('taxonomy_term__parent') + ->fields(['bundle', 'entity_id', 'revision_id', 'langcode', 'delta', 'parent_target_id']); + + foreach ($hierarchy as $row) { + if ($row->tid !== $sandbox['tid']) { + $sandbox['delta'] = 0; + $sandbox['tid'] = $row->tid; + } + + $insert->values([ + 'bundle' => $row->vid, + 'entity_id' => $row->tid, + 'revision_id' => $row->tid, + 'langcode' => $row->langcode, + 'delta' => $sandbox['delta'], + 'parent_target_id' => $row->parent, + ]); + + $sandbox['delta']++; + $sandbox['current']++; + } + + $insert->execute(); + + $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['current'] / $sandbox['max']); + + if ($sandbox['#finished'] >= 1) { + // Update the entity type because the 'taxonomy_term_hierarchy' table is no + // longer part of its shared tables schema. + $definition_update_manager = \Drupal::entityDefinitionUpdateManager(); + $definition_update_manager->updateEntityType($definition_update_manager->getEntityType('taxonomy_term')); + + // \Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema::onEntityTypeUpdate() + // only deletes *known* entity tables (i.e. the base, data and revision + // tables), so we have to drop it manually. + $database->schema()->dropTable('taxonomy_term_hierarchy'); + + return t('Taxonomy term hierarchy has been converted to default entity reference storage.'); + } +} + +/** + * Update views to use {taxonomy_term__parent} in relationships. + */ +function taxonomy_update_8503() { + $config_factory = \Drupal::configFactory(); + + foreach ($config_factory->listAll('views.view.') as $id) { + $view = $config_factory->getEditable($id); + + foreach (array_keys($view->get('display')) as $display_id) { + $changed = FALSE; + + foreach (['relationships', 'filters', 'arguments'] as $handler_type) { + $base_path = "display.$display_id.display_options.$handler_type"; + $handlers = $view->get($base_path); + + if (!$handlers) { + continue; + } + + foreach ($handlers as $handler_key => $handler_config) { + $table_path = "$base_path.$handler_key.table"; + $field_path = "$base_path.$handler_key.field"; + $table = $view->get($table_path); + $field = $view->get($field_path); + + if (($table && ($table === 'taxonomy_term_hierarchy')) && ($field && ($field === 'parent'))) { + $view->set($table_path, 'taxonomy_term__parent'); + $view->set($field_path, 'parent_target_id'); + + $changed = TRUE; + } + } + } + + if ($changed) { + $view->save(TRUE); + } + } + } +} + +/** + * Add the publishing status fields to taxonomy terms. + */ +function taxonomy_update_8601() { + $definition_update_manager = \Drupal::entityDefinitionUpdateManager(); + $entity_type = $definition_update_manager->getEntityType('taxonomy_term'); + + // Bail out early if a field named 'status' is already installed. + if ($definition_update_manager->getFieldStorageDefinition('status', 'taxonomy_term')) { + $message = \Drupal::state()->get('taxonomy_update_8601_skip_message', t('The publishing status field has <strong>not</strong> been added to taxonomy terms. See <a href=":link">this page</a> for more information on how to install it.', [ + ':link' => 'https://www.drupal.org/node/2985366', + ])); + return $message; + } + + // Add the 'published' entity key to the taxonomy_term entity type. + $entity_keys = $entity_type->getKeys(); + $entity_keys['published'] = 'status'; + $entity_type->set('entity_keys', $entity_keys); + + $definition_update_manager->updateEntityType($entity_type); + + // Add the status field. + $status = BaseFieldDefinition::create('boolean') + ->setLabel(t('Publishing status')) + ->setDescription(t('A boolean indicating the published state.')) + ->setRevisionable(TRUE) + ->setTranslatable(TRUE) + ->setDefaultValue(TRUE); + + $has_content_translation_status_field = $definition_update_manager->getFieldStorageDefinition('content_translation_status', 'taxonomy_term'); + if ($has_content_translation_status_field) { + $status->setInitialValueFromField('content_translation_status', TRUE); + } + else { + $status->setInitialValue(TRUE); + } + $definition_update_manager->installFieldStorageDefinition('status', 'taxonomy_term', 'taxonomy_term', $status); + + // Uninstall the 'content_translation_status' field if needed. + if ($has_content_translation_status_field) { + $content_translation_status = $definition_update_manager->getFieldStorageDefinition('content_translation_status', 'taxonomy_term'); + $definition_update_manager->uninstallFieldStorageDefinition($content_translation_status); + } + + return t('The publishing status field has been added to taxonomy terms.'); +}