27. Juni 2019

Migrieren von Drupal 6-Dateien zu Drupal 8-Medienentitäten

by Richard Papp

8 bietet bereits die notwendigen Konfigurationsdateien und PHP-Plugins, um Dateien von Drupal 6 zu migrieren. Wenn Sie jedoch das Drupal 8 Core Media für Ihre Dateien verwenden, müssen Sie eine zweite hinzufügen.

Ich gehe davon aus, dass Sie eine Drupal 8 Migration mit den migrate tools und migrate plus Modulen durchführen.

Datei-Migration

Kopieren Sie /core/modules/file/migrations/d6_file.yml nach config/install/migrate_plus.migration.d6_file.yml in Ihrem benutzerdefinierten Modul und setzen Sie den Pfad der Quelldatei:

# Jede Migration, die eine Datei von Drupal 6 fid referenziert, sollte diese
# Migration als eine optionale Abhängigkeit angeben.
id: d6_file
label: Öffentliche Dateien
audit: true
migration_group: d6
migrations_tags:
  - Drupal 6
  - Inhalt
source:
  plugin: d6_file
  constants:
    # Das Tool, das diese Migration konfiguriert, muss source_base_path setzen. Er
    # stellt den voll qualifizierten Pfad dar, relativ zu dem URIs in der Tabelle der Dateien
    # Tabelle angegeben sind, und muss mit einem / enden. Siehe source_full_path
    # Konfiguration in der Prozesspipeline dieser Migration als Beispiel.
    source_base_path: '/path/to/drupal6/files/to/migrate'
...

Drupal 8 weigert sich, ein Modul zu installieren, dessen Konfiguration bereits importiert wurde. Um diesen Fehler zu vermeiden, fügen Sie eine Abhängigkeit von Ihrem benutzerdefinierten Modul in die Migrationsdatei ein. Wenn Sie das Modul deinstallieren, wird Drupal 8 auch die Konfiguration entfernen:

dependencies:
  enforced:
    module:
      - custom_migrate_module

Migration von Medieneinheiten

Kopieren Sie /core/modules/file/migrations/d6_file.yml nach config/install/migrate_plus.migration.d6_media_entity.yml in Ihr eigenes Modul.

Ändern Sie die Plugin-ID und das Label, den Prozess und die Zielkonfiguration, um Medienentitäten zu erstellen:

Vor (Auszug)

id: d6_file
label: Öffentliche Dateien
...
process:
    # Wenn Sie sowohl diese Migration als auch d6_user_picture_file in einer eigenen
    # Migration verwenden und die Migrationen inkrementell ausführen, wird dringend empfohlen
    # fid-Zuordnung zu entfernen, um mögliche ID-Konflikte zu vermeiden.
    # Konflikte zu vermeiden. Aus diesem Grund ist dieses Mapping standardmäßig auskommentiert.
    # fid: fid
  filename: filename
  source_full_path:
    -
      plugin: concat
      delimiter: /
      source:
        - constants/source_base_path
        - filepath
    -
      plugin: urlencode
  destination_full_path:
    plugin: file_uri
    source:
      - filepath
      - file_directory_path
      - temp_directory_path
      - is_public
  uri:
    plugin: file_copy
    source:
      - '@source_full_path'
      - '@destination_full_path'
  filemime: filemime
  # Die Dateigröße muss nicht migriert werden, sie wird beim Speichern der Dateieinheiten berechnet.
  # dateigröße: dateigröße
  status: status
  changed: timestamp
  uid: uid
destination:
  plugin: entity:file

Nachher (Auszug)

id: d6_media_entity
label: Medienentitäten
migration_group: d6
...
process:
  langcode:
    plugin: default_value
    default_value: 'de'
  field_media_file/target_id:
    plugin: migration_lookup
    migration: d6_file
    source: fid
  feld_media_file/display:
    plugin: default_value
    default_value: 0
  field_media_file/description:
    plugin: default_value
    default_value: ''
  status: status
  changed: timestamp
  uid:
    plugin: migration_lookup
    migration: d6_user
    source: uid
destination:
  plugin: entity:media
  default_bundle: file

Oder wenn Sie Bilder migrieren:

id: d6_media_entity
label: Media entities
migration_group: d6
...
process:
  langcode:
    plugin: default_value
    default_value: 'de'
  field_media_image/target_id:
    plugin: migration_lookup
    migration: d6_file
    source: fid
  feld_media_image/alt: filename
  field_media_image/title:
    plugin: default_value
    default_value: ''
  status: status
  changed: timestamp
  uid:
    plugin: migration_lookup
    migration: d6_user
    source: uid
destination:
  plugin: entity:media
  default_bundle: image

Zuletzt fügen Sie die Migrationsabhängigkeiten zu config/install/migrate_plus.migration.d6_media_entity.yml hinzu:

migration_dependencies:
  required:
    - d6_user
    - d6_datei
dependencies:
  enforced:
    module:
      - custom_migrate_module

Die Ausführung dieser beiden Migrationen kopiert Ihre Dateien aus dem Drupal 6- in das Drupal 8-Dateiverzeichnis und erstellt für jede dieser Dateien eine Medienentität.

Medienentitäten zu Knoten zuweisen

Um Medienentitäten Medienfeldern auf Knoten zuzuordnen, müssen Sie dem Feld die Medienentitäts-ID (anstelle der Datei-ID) zuweisen, z.B.:

id: d6_node
label: Nodes
audit: true
migration_group: d6
migration_tags:
  - Drupal 6
  - Inhalt
deriver: Drupal\Node\Plugin\migrate\D6NodeDeriver
source:
  plugin: d6_node
process:
  field_media:
    plugin: sub_process
    source: uploads
    process:
      destination_id:
        plugin: migration_lookup
        migration: d6_media_entity
        source: fid
        no_stub: true
      display: list
      description: description
...
destination:
  plugin: entity:node

Es kann sein, dass Sie ein benutzerdefiniertes Quell-Plugin erstellen müssen, um die ID der Datei abzurufen, die an einen Knoten angehängt ist.

Tools

Neuen Kommentar hinzufügen