migration projets: body markdown, images HD, légendes, personnes prénom/nom

- ProjetNode: body Markdown->HTML (strip HTML brut), images + légendes lues
  depuis public://drive_shared_leshed/Page{UID}
- ImageResizeImport: nouveau process plugin, redimensionne les images en web HD
  (max 1920px) et crée le fichier managé (idempotent)
- field_images: caption via image_field_caption, alt depuis les légendes
- PersonneGenerate: nom dans field_nom (titre auto-généré via auto_entitylabel),
  dédup sur field_nom + field_prenom
- title: skip_on_empty (ligne ignorée si "Nom du projet" vide)
- CER: relation curateur sur field_projets_curates (distinct de field_projet_s_lie_s)
- deps: + league/commonmark, image_field_caption, auto_entitylabel ; - migrate_file
This commit is contained in:
2026-07-26 16:26:18 +02:00
parent 829653a9e9
commit a2cb5f9dcf
28 changed files with 1600 additions and 142 deletions
@@ -0,0 +1,10 @@
status: 1
pattern: '[node:field_prenom] [node:field_nom]'
escape: false
preserve_titles: false
save: true
chunk: 50
dependencies:
config:
- node.type.personne
new_content_behavior: 0
@@ -6,7 +6,7 @@ id: projet_curateur
label: 'Projet - Curateur'
enabled: true
first_field: field_invite_accompagne_curate_p
second_field: field_projet_s_lie_s
second_field: field_projets_curates
add_direction: append
bundles:
node:
@@ -8,7 +8,7 @@ id: node.personne.title
field_name: title
entity_type: node
bundle: personne
label: Nom
label: Title
description: ''
required: true
translatable: true
@@ -162,4 +162,9 @@ content:
size: 60
placeholder: ''
third_party_settings: { }
url_redirects:
weight: 50
region: content
settings: { }
third_party_settings: { }
hidden: { }
@@ -89,4 +89,9 @@ content:
size: 60
placeholder: ''
third_party_settings: { }
url_redirects:
weight: 50
region: content
settings: { }
third_party_settings: { }
hidden: { }
@@ -4,8 +4,10 @@ status: true
dependencies:
config:
- field.field.node.personne.body
- field.field.node.personne.field_nom
- field.field.node.personne.field_prenom
- field.field.node.personne.field_projet_s_lie_s
- field.field.node.personne.field_projets_curates
- field.field.node.personne.field_type_de_personne
- node.type.personne
module:
@@ -23,7 +25,7 @@ third_party_settings:
label: Details
region: content
parent_name: ''
weight: 4
weight: 5
format_type: details_sidebar
format_settings:
classes: ''
@@ -41,7 +43,7 @@ mode: default
content:
body:
type: text_textarea_with_summary
weight: 2
weight: 3
region: content
settings:
rows: 9
@@ -49,6 +51,14 @@ content:
placeholder: ''
show_summary: false
third_party_settings: { }
field_nom:
type: string_textfield
weight: 2
region: content
settings:
size: 60
placeholder: ''
third_party_settings: { }
field_prenom:
type: string_textfield
weight: 1
@@ -59,7 +69,17 @@ content:
third_party_settings: { }
field_projet_s_lie_s:
type: entity_reference_autocomplete
weight: 3
weight: 4
region: content
settings:
match_operator: CONTAINS
match_limit: 10
size: 60
placeholder: ''
third_party_settings: { }
field_projets_curates:
type: entity_reference_autocomplete
weight: 26
region: content
settings:
match_operator: CONTAINS
@@ -257,6 +257,11 @@ content:
size: 60
placeholder: ''
third_party_settings: { }
url_redirects:
weight: 50
region: content
settings: { }
third_party_settings: { }
hidden:
created: true
sticky: true
@@ -4,8 +4,10 @@ status: true
dependencies:
config:
- field.field.node.personne.body
- field.field.node.personne.field_nom
- field.field.node.personne.field_prenom
- field.field.node.personne.field_projet_s_lie_s
- field.field.node.personne.field_projets_curates
- field.field.node.personne.field_type_de_personne
- node.type.personne
module:
@@ -23,6 +25,14 @@ content:
third_party_settings: { }
weight: 101
region: content
field_nom:
type: string
label: above
settings:
link_to_entity: false
third_party_settings: { }
weight: 109
region: content
field_prenom:
type: string
label: above
@@ -39,6 +49,14 @@ content:
third_party_settings: { }
weight: 108
region: content
field_projets_curates:
type: entity_reference_label
label: above
settings:
link: true
third_party_settings: { }
weight: 110
region: content
field_type_de_personne:
type: entity_reference_label
label: above
@@ -5,34 +5,26 @@ dependencies:
config:
- core.entity_view_mode.node.teaser
- field.field.node.personne.body
- field.field.node.personne.field_nom
- field.field.node.personne.field_prenom
- field.field.node.personne.field_projet_s_lie_s
- field.field.node.personne.field_projets_curates
- field.field.node.personne.field_type_de_personne
- node.type.personne
module:
- text
- user
id: node.personne.teaser
targetEntityType: node
bundle: personne
mode: teaser
content:
body:
type: text_summary_or_trimmed
label: hidden
settings:
trim_length: 600
third_party_settings: { }
weight: 101
region: content
links:
settings: { }
third_party_settings: { }
weight: 100
region: content
content: { }
hidden:
body: true
field_nom: true
field_prenom: true
field_projet_s_lie_s: true
field_projets_curates: true
field_type_de_personne: true
langcode: true
links: true
search_api_excerpt: true
@@ -13,8 +13,10 @@ dependencies:
- field.field.node.projet.field_portage
- field.field.node.projet.field_projet_s_lie_s
- field.field.node.projet.field_type_de_projet
- image.style.medium
- node.type.projet
module:
- image_delta_formatter
- text
- user
id: node.projet.teaser
@@ -26,23 +28,40 @@ content:
type: text_summary_or_trimmed
label: hidden
settings:
trim_length: 600
trim_length: 100
third_party_settings: { }
weight: 101
weight: 2
region: content
links:
settings: { }
field_artiste_s_invite_s:
type: entity_reference_entity_view
label: hidden
settings:
view_mode: teaser
link: false
third_party_settings: { }
weight: 100
weight: 1
region: content
field_images:
type: image_delta_formatter
label: hidden
settings:
deltas:
- 1
deltas_reversed: false
image_link: content
image_style: medium
image_loading:
attribute: lazy
third_party_settings: { }
weight: 0
region: content
hidden:
field_artiste_s_invite_s: true
field_dates: true
field_images: true
field_invite_accompagne_curate_p: true
field_partenaire_s: true
field_portage: true
field_projet_s_lie_s: true
field_type_de_projet: true
langcode: true
links: true
search_api_excerpt: true
+3
View File
@@ -1,6 +1,7 @@
_core:
default_config_hash: 4GIX5Esnc_umpXUBj4IIocRX7Mt5fPhm4AgXfE3E56E
module:
auto_entitylabel: -100
actions_permissions: 0
address: 0
admin_toolbar: 0
@@ -52,6 +53,8 @@ module:
help: 0
honeypot: 0
image: 0
image_delta_formatter: 0
image_field_caption: 0
inline_entity_form: 0
language: 0
layout_builder: 0
@@ -0,0 +1,19 @@
uuid: 7f1a16d3-57ea-4861-ad4f-1312ceadd1e7
langcode: fr
status: true
dependencies:
config:
- field.storage.node.field_nom
- node.type.personne
id: node.personne.field_nom
field_name: field_nom
entity_type: node
bundle: personne
label: Nom
description: ''
required: true
translatable: false
default_value: { }
default_value_callback: ''
settings: { }
field_type: string
@@ -11,7 +11,7 @@ entity_type: node
bundle: personne
label: Prenom
description: ''
required: false
required: true
translatable: false
default_value: { }
default_value_callback: ''
@@ -0,0 +1,29 @@
uuid: 75b15206-7946-48cb-b7b9-17c27ad00c25
langcode: fr
status: true
dependencies:
config:
- field.storage.node.field_projets_curates
- node.type.personne
- node.type.projet
id: node.personne.field_projets_curates
field_name: field_projets_curates
entity_type: node
bundle: personne
label: projets_curates
description: ''
required: false
translatable: false
default_value: { }
default_value_callback: ''
settings:
handler: 'default:node'
handler_settings:
target_bundles:
projet: projet
sort:
field: _none
direction: ASC
auto_create: false
auto_create_bundle: ''
field_type: entity_reference
@@ -35,4 +35,7 @@ settings:
title: ''
width: null
height: null
caption: ''
caption_field: 1
caption_field_required: 0
field_type: image
@@ -0,0 +1,21 @@
uuid: 14aa5aef-0840-4e3d-a78a-027e2c61844f
langcode: fr
status: true
dependencies:
module:
- node
id: node.field_nom
field_name: field_nom
entity_type: node
type: string
settings:
max_length: 255
case_sensitive: false
is_ascii: false
module: core
locked: false
cardinality: 1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false
@@ -0,0 +1,19 @@
uuid: c5d97546-10d2-46e0-9324-1164bdd04cbb
langcode: fr
status: true
dependencies:
module:
- node
id: node.field_projets_curates
field_name: field_projets_curates
entity_type: node
type: entity_reference
settings:
target_type: node
module: core
locked: false
cardinality: -1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false
@@ -15,6 +15,8 @@ source:
plugin: projet_node
data_fetcher_plugin: http
data_parser_plugin: google_sheets
constants:
images_destination: 'public://projets/'
urls: 'https://sheets.googleapis.com/v4/spreadsheets/1561Gv1C-IlCTmg64Z8HnznvOeLbvwhA_k1l6aq95zFA/values/Projets'
fields:
-
@@ -56,7 +58,32 @@ process:
type:
plugin: default_value
default_value: projet
title: title
title:
plugin: skip_on_empty
method: row
source: title
message: 'Projet ignoré : « Nom du projet » vide.'
body/value: body_html
body/format:
plugin: default_value
default_value: wysiwyg
field_images:
plugin: sub_process
source: images
process:
target_id:
plugin: image_resize_import
source: uri
destination: destination
max_width: 1920
max_height: 1920
reuse: true
skip_on_missing_source: true
alt: alt
image_field_caption/value: caption
image_field_caption/format:
plugin: default_value
default_value: wysiwyg
field_dates/value:
plugin: leshed_date
source: date_start
+1 -1
View File
@@ -1,3 +1,4 @@
langcode: fr
_core:
default_config_hash: R7HmKRbuDsDQNpqEWt7wWcf0ygaE3u-NQQr-w_LhHJk
auto_redirect: true
@@ -7,4 +8,3 @@ warning: false
ignore_admin_path: false
access_check: false
route_normalizer_enabled: true
langcode: fr
+149 -89
View File
@@ -3,7 +3,8 @@ langcode: fr
status: true
dependencies:
config:
- field.storage.node.field_prenom
- field.storage.node.field_projet_s_lie_s
- field.storage.node.field_projets_curates
- field.storage.node.field_type_de_projet
module:
- node
@@ -107,69 +108,6 @@ display:
multi_type: separator
separator: ', '
field_api_classes: false
field_prenom:
id: field_prenom
table: node__field_prenom
field: field_prenom
relationship: none
group_type: group
admin_label: ''
plugin_id: field
label: ''
exclude: true
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: false
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
click_sort_column: value
type: string
settings:
link_to_entity: true
group_column: value
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
separator: ', '
field_api_classes: false
title:
id: title
table: node_field_data
@@ -183,7 +121,7 @@ display:
label: Titre
exclude: false
alter:
alter_text: true
alter_text: false
text: '{{ field_prenom }} {{ title }}'
make_link: false
path: ''
@@ -298,25 +236,132 @@ display:
multi_type: separator
separator: ', '
field_api_classes: false
name:
id: name
table: users_field_data
field: name
relationship: uid
entity_type: user
entity_field: name
field_projet_s_lie_s:
id: field_projet_s_lie_s
table: node__field_projet_s_lie_s
field: field_projet_s_lie_s
relationship: none
group_type: group
admin_label: ''
plugin_id: field
label: Auteur
label: 'Projet(s) lié(s)'
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
type: user_name
click_sort_column: target_id
type: entity_reference_label
settings:
link: true
group_column: target_id
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
separator: ', '
field_api_classes: false
field_projets_curates:
id: field_projets_curates
table: node__field_projets_curates
field: field_projets_curates
relationship: none
group_type: group
admin_label: ''
plugin_id: field
label: projets_curates
exclude: false
alter:
alter_text: false
text: ''
make_link: false
path: ''
absolute: false
external: false
replace_spaces: false
path_case: none
trim_whitespace: false
alt: ''
rel: ''
link_class: ''
prefix: ''
suffix: ''
target: ''
nl2br: false
max_length: 0
word_boundary: true
ellipsis: true
more_link: false
more_link_text: ''
more_link_path: ''
strip_tags: false
trim: false
preserve_tags: ''
html: false
element_type: ''
element_class: ''
element_label_type: ''
element_label_class: ''
element_label_colon: true
element_wrapper_type: ''
element_wrapper_class: ''
element_default_classes: true
empty: ''
hide_empty: false
empty_zero: false
hide_alter_empty: true
click_sort_column: target_id
type: entity_reference_label
settings:
link: true
group_column: target_id
group_columns: { }
group_rows: true
delta_limit: 0
delta_offset: 0
delta_reversed: false
delta_first_last: false
multi_type: separator
separator: ', '
field_api_classes: false
status:
id: status
table: node_field_data
@@ -658,9 +703,10 @@ display:
columns:
node_bulk_form: node_bulk_form
type: title
field_prenom: title
title: title
name: name
field_type_de_projet: field_type_de_projet
field_projets_curates: field_projet_s_lie_s
field_projet_s_lie_s: field_projet_s_lie_s
status: status
changed: changed
operations: operations
@@ -678,13 +724,6 @@ display:
separator: ''
empty_column: false
responsive: ''
field_prenom:
sortable: false
default_sort_order: asc
align: ''
separator: ''
empty_column: false
responsive: ''
title:
sortable: true
default_sort_order: asc
@@ -692,13 +731,21 @@ display:
separator: '<br/>'
empty_column: false
responsive: ''
name:
sortable: false
default_sort_order: asc
field_type_de_projet:
align: ''
separator: ''
empty_column: false
responsive: priority-low
responsive: ''
field_projets_curates:
align: ''
separator: ''
empty_column: false
responsive: ''
field_projet_s_lie_s:
align: ''
separator: ''
empty_column: false
responsive: ''
status:
sortable: true
default_sort_order: asc
@@ -737,6 +784,17 @@ display:
plugin_id: standard
required: true
show_admin_links: false
header:
result:
id: result
table: views
field: result
relationship: none
group_type: group
admin_label: ''
plugin_id: result
empty: false
content: 'Affichage de @start à @end sur @total'
display_extenders: { }
cache_metadata:
max-age: 0
@@ -749,7 +807,8 @@ display:
- 'user.node_grants:view'
- user.permissions
tags:
- 'config:field.storage.node.field_prenom'
- 'config:field.storage.node.field_projet_s_lie_s'
- 'config:field.storage.node.field_projets_curates'
- 'config:field.storage.node.field_type_de_projet'
page_1:
id: page_1
@@ -783,5 +842,6 @@ display:
- 'user.node_grants:view'
- user.permissions
tags:
- 'config:field.storage.node.field_prenom'
- 'config:field.storage.node.field_projet_s_lie_s'
- 'config:field.storage.node.field_projets_curates'
- 'config:field.storage.node.field_type_de_projet'