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 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.

Ir al contenido