Hace unos días en Ymbra tuvimos un desafio sobre entidades en Drupal 7 que consistía en que no se cargaban durante una ejecución de cron. El principal problema era que cron no se ejecutaba con las credenciales suficientes y necesitábamos más permisos pare ejecutar ciertas tareas.
Estas entidades tenían restricciones de acceso que habíamos definido y en el momento que se ejecutaba cron como usuario anónimo (aunque se lanzara como el usuario con id=1) estas restricciones se respetaban y no podíamos cargar nuestra entidad para mandar su contenido en un correo electrónico.
Entonces ¿Qué podemos hacer para lanzar cron como administrador?
En hook_cron()
podemos hacer:
/** * Implements hook_cron(). */ function mymodule_cron() { global $user; $user = user_load(1); }
Y también hay que asegurarse que este hook se ejecuta antes que el hook (en este caso otro hook_cron
) que necesita permisos elevados modificando el campo weight de mymodule
en la tabla system
.
Es importante comentar que se ejecuta el cron de Drupal en el navegador (lo que antes se conocía como poorman's cron) no es una buena práctica y podría causar problemas con esta solución. Por tanto recomendamos ejecutar cron con Drush en un cron de sistema de vuestro servidor.
Como medida adicional podéis devolver la variable global $user a su estado anónimo una vez que hayáis terminado el código que necesitaba los privilegios para minimizar el impacto.
Podéis leer más sobre este tema en este hilo relacionado.