Chris@17: getFieldStorageDefinition('parent', 'taxonomy_term'); Chris@17: $field_storage_definition->setCustomStorage(FALSE); Chris@17: $definition_update_manager->updateFieldStorageDefinition($field_storage_definition); Chris@17: } Chris@17: Chris@17: /** Chris@17: * Copy hierarchy from {taxonomy_term_hierarchy} to {taxonomy_term__parent}. Chris@17: */ Chris@17: function taxonomy_update_8502(&$sandbox) { Chris@17: $database = \Drupal::database(); Chris@17: Chris@17: if (!isset($sandbox['current'])) { Chris@17: // Set batch ops sandbox. Chris@17: $sandbox['current'] = 0; Chris@17: $sandbox['tid'] = -1; Chris@17: $sandbox['delta'] = 0; Chris@17: $sandbox['limit'] = Settings::get('entity_update_batch_size', 50); Chris@17: Chris@17: // Count records using a join, as there might be orphans in the hierarchy Chris@17: // table. See https://www.drupal.org/project/drupal/issues/2997982. Chris@17: $select = $database->select('taxonomy_term_hierarchy', 'h'); Chris@17: $select->join('taxonomy_term_data', 'd', 'h.tid = d.tid'); Chris@17: $sandbox['max'] = $select Chris@17: ->countQuery() Chris@17: ->execute() Chris@17: ->fetchField(); Chris@17: } Chris@17: Chris@17: // Save the hierarchy. Chris@17: $select = $database->select('taxonomy_term_hierarchy', 'h'); Chris@17: $select->join('taxonomy_term_data', 'd', 'h.tid = d.tid'); Chris@17: $hierarchy = $select Chris@17: ->fields('h', ['tid', 'parent']) Chris@17: ->fields('d', ['vid', 'langcode']) Chris@17: ->range($sandbox['current'], $sandbox['limit']) Chris@17: ->orderBy('tid', 'ASC') Chris@17: ->orderBy('parent', 'ASC') Chris@17: ->execute() Chris@17: ->fetchAll(); Chris@17: Chris@17: // Restore data. Chris@17: $insert = $database->insert('taxonomy_term__parent') Chris@17: ->fields(['bundle', 'entity_id', 'revision_id', 'langcode', 'delta', 'parent_target_id']); Chris@17: Chris@17: foreach ($hierarchy as $row) { Chris@17: if ($row->tid !== $sandbox['tid']) { Chris@17: $sandbox['delta'] = 0; Chris@17: $sandbox['tid'] = $row->tid; Chris@17: } Chris@17: Chris@17: $insert->values([ Chris@17: 'bundle' => $row->vid, Chris@17: 'entity_id' => $row->tid, Chris@17: 'revision_id' => $row->tid, Chris@17: 'langcode' => $row->langcode, Chris@17: 'delta' => $sandbox['delta'], Chris@17: 'parent_target_id' => $row->parent, Chris@17: ]); Chris@17: Chris@17: $sandbox['delta']++; Chris@17: $sandbox['current']++; Chris@17: } Chris@17: Chris@17: $insert->execute(); Chris@17: Chris@17: $sandbox['#finished'] = empty($sandbox['max']) ? 1 : ($sandbox['current'] / $sandbox['max']); Chris@17: Chris@17: if ($sandbox['#finished'] >= 1) { Chris@17: // Update the entity type because the 'taxonomy_term_hierarchy' table is no Chris@17: // longer part of its shared tables schema. Chris@17: $definition_update_manager = \Drupal::entityDefinitionUpdateManager(); Chris@17: $definition_update_manager->updateEntityType($definition_update_manager->getEntityType('taxonomy_term')); Chris@17: Chris@17: // \Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema::onEntityTypeUpdate() Chris@17: // only deletes *known* entity tables (i.e. the base, data and revision Chris@17: // tables), so we have to drop it manually. Chris@17: $database->schema()->dropTable('taxonomy_term_hierarchy'); Chris@17: Chris@17: return t('Taxonomy term hierarchy has been converted to default entity reference storage.'); Chris@17: } Chris@17: } Chris@17: Chris@17: /** Chris@17: * Update views to use {taxonomy_term__parent} in relationships. Chris@17: */ Chris@17: function taxonomy_update_8503() { Chris@17: $config_factory = \Drupal::configFactory(); Chris@17: Chris@17: foreach ($config_factory->listAll('views.view.') as $id) { Chris@17: $view = $config_factory->getEditable($id); Chris@17: Chris@17: foreach (array_keys($view->get('display')) as $display_id) { Chris@17: $changed = FALSE; Chris@17: Chris@17: foreach (['relationships', 'filters', 'arguments'] as $handler_type) { Chris@17: $base_path = "display.$display_id.display_options.$handler_type"; Chris@17: $handlers = $view->get($base_path); Chris@17: Chris@17: if (!$handlers) { Chris@17: continue; Chris@17: } Chris@17: Chris@17: foreach ($handlers as $handler_key => $handler_config) { Chris@17: $table_path = "$base_path.$handler_key.table"; Chris@17: $field_path = "$base_path.$handler_key.field"; Chris@17: $table = $view->get($table_path); Chris@17: $field = $view->get($field_path); Chris@17: Chris@17: if (($table && ($table === 'taxonomy_term_hierarchy')) && ($field && ($field === 'parent'))) { Chris@17: $view->set($table_path, 'taxonomy_term__parent'); Chris@17: $view->set($field_path, 'parent_target_id'); Chris@17: Chris@17: $changed = TRUE; Chris@17: } Chris@17: } Chris@17: } Chris@17: Chris@17: if ($changed) { Chris@17: $view->save(TRUE); Chris@17: } Chris@17: } Chris@17: } Chris@17: } Chris@17: Chris@17: /** Chris@17: * Add the publishing status fields to taxonomy terms. Chris@17: */ Chris@17: function taxonomy_update_8601() { Chris@17: $definition_update_manager = \Drupal::entityDefinitionUpdateManager(); Chris@17: $entity_type = $definition_update_manager->getEntityType('taxonomy_term'); Chris@17: Chris@17: // Bail out early if a field named 'status' is already installed. Chris@17: if ($definition_update_manager->getFieldStorageDefinition('status', 'taxonomy_term')) { Chris@17: $message = \Drupal::state()->get('taxonomy_update_8601_skip_message', t('The publishing status field has not been added to taxonomy terms. See this page for more information on how to install it.', [ Chris@17: ':link' => 'https://www.drupal.org/node/2985366', Chris@17: ])); Chris@17: return $message; Chris@17: } Chris@17: Chris@17: // Add the 'published' entity key to the taxonomy_term entity type. Chris@17: $entity_keys = $entity_type->getKeys(); Chris@17: $entity_keys['published'] = 'status'; Chris@17: $entity_type->set('entity_keys', $entity_keys); Chris@17: Chris@17: $definition_update_manager->updateEntityType($entity_type); Chris@17: Chris@17: // Add the status field. Chris@17: $status = BaseFieldDefinition::create('boolean') Chris@17: ->setLabel(t('Publishing status')) Chris@17: ->setDescription(t('A boolean indicating the published state.')) Chris@17: ->setRevisionable(TRUE) Chris@17: ->setTranslatable(TRUE) Chris@17: ->setDefaultValue(TRUE); Chris@17: Chris@17: $has_content_translation_status_field = $definition_update_manager->getFieldStorageDefinition('content_translation_status', 'taxonomy_term'); Chris@17: if ($has_content_translation_status_field) { Chris@17: $status->setInitialValueFromField('content_translation_status', TRUE); Chris@17: } Chris@17: else { Chris@17: $status->setInitialValue(TRUE); Chris@17: } Chris@17: $definition_update_manager->installFieldStorageDefinition('status', 'taxonomy_term', 'taxonomy_term', $status); Chris@17: Chris@17: // Uninstall the 'content_translation_status' field if needed. Chris@17: if ($has_content_translation_status_field) { Chris@17: $content_translation_status = $definition_update_manager->getFieldStorageDefinition('content_translation_status', 'taxonomy_term'); Chris@17: $definition_update_manager->uninstallFieldStorageDefinition($content_translation_status); Chris@17: } Chris@17: Chris@17: return t('The publishing status field has been added to taxonomy terms.'); Chris@17: } Chris@18: Chris@18: /** Chris@18: * Add an index on the 'taxonomy_term__parent' field table. Chris@18: */ Chris@18: function taxonomy_update_8701() { Chris@18: $entity_definition_update_manager = \Drupal::entityDefinitionUpdateManager(); Chris@18: $storage_definition = $entity_definition_update_manager->getFieldStorageDefinition('parent', 'taxonomy_term'); Chris@18: $entity_definition_update_manager->updateFieldStorageDefinition($storage_definition); Chris@18: }