Introducción
En proyectos complejos de Drupal, es habitual tener múltiples nodos que deben compartir información o mantener campos sincronizados entre sí. Esto puede ocurrir en sitios multilenguaje, sistemas de fichas de producto, clonado de contenido o cuando se relacionan entidades automáticamente.
En esta guía avanzada te mostramos cómo sincronizar campos personalizados entre nodos en Drupal 9/10, utilizando código PHP, servicios del núcleo y estrategias seguras de sincronización.
Índice
- 1. Casos comunes donde sincronizar campos
- 2. Cómo están estructurados los campos en Drupal
- 3. Cómo acceder a campos desde PHP
- 4. Copiar valores simples entre nodos
- 5. Copiar valores múltiples o de referencia
- 6. Sincronizar al guardar (hook_entity_presave)
- 7. Sincronizar por lote (batch API)
- 8. Validar tipos, formatos y estructuras
- 9. Errores comunes y cómo evitarlos
- 10. Conclusión y recomendaciones
1. Casos comunes de sincronización
- Multilenguaje: sincronizar valores entre versiones de un mismo nodo
- Duplicación de contenido (clones)
- Sincronización de campos entre tipo A (fichas) y tipo B (resúmenes)
- Relaciones entre productos, eventos o autores compartidos
2. Estructura de los campos personalizados
Los campos están contenidos en objetos FieldItemList
. Ejemplo:
$valor = $nodo->get('field_precio')->value;
✔️ Algunos campos tienen estructura compleja (multivalor, referencias, entity collections).
3. Acceso a campos entre nodos
$origen = Node::load($nid_origen); $destino = Node::load($nid_destino); $valor = $origen->get('field_precio')->value; $destino->set('field_precio', $valor); $destino->save();
💡 Este ejemplo es básico y sirve como patrón para sincronizar campos.
4. Copiar campos simples
- text (corto o largo)
- number (integer, decimal)
- boolean
- list (textual)
💡 Siempre valida que el campo existe antes de copiar.
5. Copiar campos de múltiples valores o referencias
$items = $origen->get('field_tags'); $destino->set('field_tags', []); foreach ($items as $item) { $destino->get('field_tags')->appendItem($item->target_id); }
✔️ También puedes usar entity_reference_revisions
si trabajas con paragraphs.
6. Sincronizar automáticamente al guardar
function mi_modulo_entity_presave(EntityInterface $entity) { if ($entity->getEntityTypeId() === 'node' && $entity->bundle() === 'producto') { if ($relacion = $entity->get('field_clon_origen')->target_id) { $origen = Node::load($relacion); $entity->set('field_precio', $origen->get('field_precio')->value); } } }
✔️ Este ejemplo sincroniza automáticamente el precio al guardar.
7. Sincronizar por lote (batch)
Ideal para catálogos grandes. Usa la Batch API de Drupal:
$nids = \Drupal::entityQuery('node')->condition('type', 'producto')->execute(); foreach ($nids as $nid) { batch_set([...]); }
💡 Controla errores, interrumpe si falla, y guarda logs.
8. Validar tipos y estructuras
- ✔️ Verifica que ambos nodos tengan el campo
- ✔️ Compara cardinalidad (simple vs multivalor)
- ✔️ Usa
isEmpty()
antes de sobrescribir
9. Errores comunes
- ❌ No cargar el nodo antes de usar
get()
- ❌ Sobrescribir campos complejos con valores simples
- ❌ No validar la existencia del campo en ambos bundles
10. Conclusión
Sincronizar campos entre nodos en Drupal requiere entender cómo se estructuran, cómo acceder a ellos, y cuándo intervenir (presave, batch, hook). Con un enfoque organizado puedes automatizar tareas, mantener datos coherentes y ahorrar tiempo en mantenimiento.
📩 ¿Quieres que desarrollemos un módulo personalizado para sincronización masiva o mantener versiones sincronizadas automáticamente? Escríbenos.