...
scopo di migrate_skip_on_404 = non controlla se la riga della sorgente contiene l'url verso il file o meno, ma controlla se effettivamente il file esista per essere importato o meno.
Per lo scopo, si utilizzerà \Drupal::httpClient()->request che si preocupa a conumare i json esposti dal sito d7 di uniss e scaricare i file json localmente nel sito di d9.
Descrizione di cineca_migrate_announcements
Il modulo in installazione crea un file json con i campi necessari per la migrazione. Serve perché le migrazioni danno errore se non trovano il file o anche le singole voci da importare.
Di seguito, tramite lUna volta ottenuti i json, che vengono chiamati tramite l'evento MigrateEvents::PRE_IMPORT , viene utilizzato per l'importazione dei importato il file json , contenente i dati necessari per le migrazioni.la migrazione.
Analisi dei singoli file di migrazione
Code Block | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
# id deve essere identico all'ultima parte del nome del file (migrate_plus.migration.bandi_file.yml)
# Per la migrazione dei file sono necessari 3 campi
# - filename che serve per poterlo manipolare insieme ad un path di nostra scelta (l'ho messo nelle costanti) per salvarlo nel nostro file system
# - filepath (url preferibilmente absolute) della posizione del file fisico che vogliamo importare
# - file_id (occorre averlo sempre, perché migration lo mappa insieme al nuovo id che li darà una volta importato)
# utile per poterlo usare in altre migrazioni con il plugin migration_lookup, per i rollback, etc.
id: bandi_file
label: "Bando (File) from d7, json source"
migration_group: bandi_group
# La migrazione viene divisa in 3 parti (source, process, destination)
# ognuna di queste ha delle particolarità
source:
# possono essere usate delle costanti, qui il modo per poterle dichiarare
constants:
DRUPAL_FILE_DIRECTORY: 'public://bandi/'
plugin: url
data_fetcher_plugin: file
data_parser_plugin: json
urls:
- sites/default/files/migrations/bandi.json
# serve per distinguere i livelli
item_selector: '/Bandi'
# in fields viene definita la mappatura del campo trovato in sorgente, con come lo si voglia usare qui
# selector la chiave trovata nel file json
# name il nome con il quale intendiamo usarlo qui.
fields:
-
name: src_file_id
label: 'Photo ID'
selector: file_id
-
name: src_filename
label: 'filename'
selector: filename
-
name: src_filepath
label: 'File path'
selector: filepath
ids:
# obbligatorio, questo il modulo migration lo utilizza per la tabella che crea (migration_map_bandi_file) per popolare la colonna sourceId1
src_file_id:
type: string
process:
# pseudo field, qui creiamo il filepath completo (vogliamo che finisca nel nostro file system es. public://bandi/filename.pdf)
psf_destination_full_path:
-
plugin: concat
source:
- constants/DRUPAL_FILE_DIRECTORY
- src_filename
-
plugin: urlencode
# la vera copia
uri:
# questo plugin fa si che non venga interotta la migrazione se filepath del file sorgente è vuota
-
plugin: skip_on_empty
source: src_filepath
method: row
message: 'Cannot import empty document.'
# questo plugin controlla se il filepath dato corrisponde veramente ad un file, altrimenti non blocca la migrazione, salta solo questo file
-
plugin: skip_on_404
source: src_filepath
method: row
# infine la vera copia dal url della sorgente al nostro file system grazie al pseudo campo (psf_destination_full_path [nome arbitrario])
-
plugin: file_copy
source:
- src_filepath
- '@psf_destination_full_path'
file_exists: 'replace'
# la destinazione è la entity:file, viene salvato nel file system, registrato in DB nel table file_managed, mostrato in backend in content > files
destination:
plugin: 'entity:file'
migration_dependencies: {}
dependencies:
enforced:
module:
- cineca_migrate_announcements
|