You are here

function _multiversion_add_workspace_field_in_url_alias_table in Multiversion 8

Add workspace field in url_alias table.

Parameters

bool $install:

Throws

\Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException

2 calls to _multiversion_add_workspace_field_in_url_alias_table()
multiversion_install in ./multiversion.install
Implements hook_install().
multiversion_update_8108 in ./multiversion.install
Add workspace field in url_alias table.

File

./multiversion.module, line 669

Code

function _multiversion_add_workspace_field_in_url_alias_table($install = FALSE) {
  $database = \Drupal::database();
  $schema = $database
    ->schema();
  $table = 'url_alias';
  $field = 'workspace';
  if (!$schema
    ->fieldExists($table, $field)) {
    $spec = [
      'description' => 'The workspace the alias belongs to.',
      'type' => 'int',
      'unsigned' => TRUE,
      'default' => $install ? 1 : 0,
      'size' => 'normal',
    ];
    $schema
      ->addField($table, $field, $spec);
  }
  $table_data = $database
    ->select($table)
    ->fields($table)
    ->execute()
    ->fetchAll();
  $entity_type_manager = \Drupal::entityTypeManager();
  $entity_type_manager
    ->clearCachedDefinitions();
  $entity_ids = [];
  foreach ($table_data as $row) {
    $row_data = (array) $row;
    $source_elements = explode('/', $row_data['source']);
    if (!empty($source_elements[1]) && !empty($source_elements[2]) && is_numeric($source_elements[2])) {
      if ($entity_type_manager
        ->getDefinition($source_elements[1], FALSE)) {
        $entity_ids[$source_elements[1]][$row_data['pid']] = $source_elements[2];
      }
    }
  }
  $workspaces = Workspace::loadMultiple();
  foreach ($workspaces as $workspace_id => $workspace) {
    foreach ($entity_ids as $entity_type_id => $ids) {
      $storage = $entity_type_manager
        ->getStorage($entity_type_id);
      if ($storage instanceof ContentEntityStorageInterface) {
        $storage
          ->useWorkspace($workspace_id);
        $entities = $storage
          ->loadMultiple($ids);
        $storage
          ->useWorkspace(NULL);
      }
      if (empty($entities)) {
        continue;
      }
      foreach ($ids as $pid => $entity_id) {
        if (in_array($entity_id, array_keys($entities))) {
          $database
            ->update($table)
            ->fields([
            $field => $workspace_id,
          ])
            ->condition('pid', $pid)
            ->execute();
        }
      }
    }
  }
}