Bloqueo de contenido (anti-edición concurrente)
Evita que múltiples usuarios editen una entidad de contenido simultáneamente implementando un bloqueo pesimista que bloquea automáticamente el contenido cuando comienza la edición y lo libera al guardar o al navegar fuera de la página.
content_lock
Install
composer require 'drupal/content_lock:8.x-2.4'
composer require 'drupal/content_lock:8.x-2.2'
Overview
El módulo Content Lock implementa una estrategia de bloqueo pesimista para prevenir conflictos de edición en sitios ocupados con contenido dinámico. Cuando un usuario comienza a editar una entidad, esta se bloquea exclusivamente, impidiendo que otros usuarios realicen cambios hasta que se libere el bloqueo.
Los bloqueos se liberan automáticamente cuando se envía el formulario o cuando el usuario navega fuera de la página. El módulo soporta bloqueo a nivel de entidad, a nivel de traducción (con el módulo Conflict), y a nivel de operación de formulario. Los bloqueos obsoletos pueden liberarse automáticamente después de un período de tiempo configurable mediante cron.
Los administradores con el permiso 'Break content lock' pueden liberar forzosamente los bloqueos mantenidos por otros usuarios. El módulo proporciona una integración completa con Views para mostrar y gestionar el contenido bloqueado, incluyendo una vista preconstruida accesible en /admin/content/locked-content.
Features
- Bloqueo pesimista que bloquea exclusivamente el contenido cuando un usuario comienza a editar, previniendo conflictos de edición simultánea
- Liberación automática del bloqueo cuando se envía el formulario, el usuario cierra sesión o la sesión del usuario termina
- Tiempo de espera configurable para la liberación automática de bloqueos obsoletos mediante cron (predeterminado 30 minutos)
- Configuración de bloqueo por tipo de entidad y por bundle con opción 'All' para configuración rápida
- Soporte de bloqueo a nivel de traducción cuando el módulo Conflict está instalado, permitiendo la edición concurrente de diferentes traducciones
- Bloqueo a nivel de operación de formulario con modos de lista de permitidos y lista de denegados para control granular sobre qué operaciones de formulario activan el bloqueo
- Funcionalidad de romper bloqueo que permite a los administradores liberar forzosamente los bloqueos mantenidos por otros usuarios
- Página de Views preconstruida en /admin/content/locked-content mostrando todos los nodos actualmente bloqueados con acción de desbloqueo masivo
- Integración completa con Views con campos, filtros, ordenaciones y relaciones para datos de bloqueo
- Integración de operaciones de entidad añadiendo la opción 'Break lock' en los listados de entidades para contenido bloqueado
- Arquitectura basada en eventos con ContentLockLockedEvent y ContentLockReleaseEvent para extensibilidad
- Integración con el módulo Trash para prevenir el bloqueo innecesario de entidades en la papelera
- Opción de modo detallado para mostrar mensajes informativos cuando el contenido está bloqueado o se accede mientras está bloqueado
Use Cases
Prevención de conflictos de edición en flujos de trabajo editoriales
En un sitio de noticias con múltiples editores, habilite el bloqueo de contenido para el tipo de nodo 'article'. Cuando el Editor A abre un artículo para editar, se bloquea. Si el Editor B intenta editar el mismo artículo, ve un mensaje indicando que está bloqueado por el Editor A. Esto previene el escenario frustrante donde los cambios del Editor B se pierden porque el Editor A guardó primero.
Gestión de trabajo de traducción concurrente
Para un sitio multilingüe con múltiples traductores, instale el módulo Conflict y habilite 'Bloquear solo a nivel de traducción de entidad' para nodos. Esto permite que el traductor alemán trabaje en la versión alemana mientras el traductor francés edita simultáneamente la versión francesa del mismo contenido, sin conflictos.
Bloqueo selectivo de operaciones de formulario
Configure el bloqueo de operación de formulario en modo de lista de denegados y excluya la operación 'delete'. Esto permite a los usuarios eliminar contenido incluso mientras otro usuario lo está editando (útil para gestores de contenido que necesitan eliminar contenido desactualizado rápidamente), mientras sigue protegiendo la operación de edición del acceso concurrente.
Monitoreo y gestión de bloqueos
Use la vista incorporada 'Contenido bloqueado' en /admin/content/locked-content para monitorear todos los nodos actualmente bloqueados. Los gestores de contenido con permiso 'break content lock' pueden usar la operación masiva para liberar múltiples bloqueos obsoletos a la vez, o usar el enlace 'Romper bloqueo' en las operaciones de entidad.
Limpieza automática de bloqueos mediante tiempo de espera
Establezca el tiempo de espera del bloqueo a 30 minutos en la configuración. Cuando los usuarios olvidan cerrar los formularios de edición (navegando fuera sin guardar o cancelar), los bloqueos se liberan automáticamente por cron después de 30 minutos, asegurando que el contenido no permanezca bloqueado indefinidamente.
Tips
- Siempre establezca un valor de tiempo de espera para liberar automáticamente los bloqueos olvidados - el valor predeterminado recomendado es 30 minutos (1800 segundos)
- Use la opción de bundle 'All' (*) cuando habilite el bloqueo por primera vez para un tipo de entidad, luego refine a bundles específicos si es necesario
- Otorgue el permiso 'break content lock' a los administradores del sitio y gestores de contenido que necesiten resolver conflictos de bloqueo
- Para personalizar los mensajes de bloqueo, considere usar el módulo String Overrides (https://www.drupal.org/project/stringoverrides)
- Implemente hook_content_lock_entity_lockable() para excluir programáticamente entidades específicas del bloqueo basándose en lógica de negocio personalizada
- Suscríbase a ContentLockLockedEvent y ContentLockReleaseEvent para integrar con sistemas de notificación o registro
- El servicio content_lock puede inyectarse en código personalizado para verificar, adquirir o liberar bloqueos programáticamente
Technical Details
Admin Pages 3
/admin/config/content/content_lock
Página de configuración principal para establecer el comportamiento del bloqueo de contenido, seleccionar tipos de entidad y bundles protegidos, y configurar los ajustes de tiempo de espera.
/admin/content/locked-content
Página de Views que muestra todo el contenido actualmente bloqueado con información sobre el propietario del bloqueo, marca de tiempo e idioma. Proporciona operaciones masivas para romper bloqueos y operaciones individuales de entidad.
/admin/lock/break/{entity_type}/{entity}/{langcode}/{form_op}
Formulario de confirmación para romper un bloqueo de contenido en una entidad específica. Generado dinámicamente para cada tipo de entidad habilitado.
Permissions 2
Hooks 1
hook_content_lock_entity_lockable
Determina si una entidad es bloqueable. Se llama desde isLockable() para permitir que los módulos controlen programáticamente qué entidades pueden ser bloqueadas. Si este hook devuelve FALSE para una entidad, cualquier bloqueo existente será ignorado.
Troubleshooting 5
Configure un valor de tiempo de espera razonable (ej., 30 minutos) en la configuración de Content Lock. Los bloqueos se liberarán automáticamente por cron después de este período. Asegúrese de que cron se ejecute regularmente en su sitio.
La opción 'Bloquear solo a nivel de traducción de entidad' requiere que el módulo Conflict esté instalado. Instale y habilite el módulo Conflict (https://www.drupal.org/project/conflict) para habilitar esta característica.
Content Lock deshabilita automáticamente el caché para vistas que incluyen datos de bloqueo. Si aún experimenta problemas, verifique que la configuración de caché de la vista esté establecida en 'Ninguno' y limpie todos los cachés.
Por diseño, los usuarios sin el permiso 'break content lock' no pueden eliminar contenido bloqueado por otros. Otorgue el permiso 'break content lock' o configure el bloqueo de operación de formulario para excluir la operación de eliminación del bloqueo.
Asegúrese de que el formulario se esté enviando correctamente (no solo navegando fuera). La liberación del bloqueo ocurre en el manejador de envío del formulario. Verifique si hay errores de JavaScript que puedan prevenir el envío del formulario.
Security Notes 3
- El permiso 'break content lock' debe otorgarse cuidadosamente ya que permite a los usuarios anular bloqueos establecidos por otros usuarios
- Content Lock previene la eliminación de contenido bloqueado por usuarios sin permiso de romper, protegiendo contra la pérdida accidental de datos
- El módulo usa bloqueo a nivel de base de datos (tabla content_lock) y el servicio de bloqueo de Drupal para prevenir condiciones de carrera al adquirir bloqueos