Intentando evitar crons siempre que sea posible, pero según la respuesta de @Farahmand, pongo una variación de este código en un onUserLogout()
evento de complemento de usuario :
Cuando cualquier usuario inicia sesión a cabo , el plugin cheques-en cualquiera de su contenido, así como cualquier otro registro de salida que pueden haber sido abandonados. Solo quería que ciertos grupos de usuarios se vieran afectados, y asegurarme de que el contenido de los usuarios administradores nunca se viera afectado (por nuestras propias razones internas, tal vez demasiado para instalaciones típicas, pero en nuestro caso tenemos grupos de usuarios personalizados que pueden estar en varios de los grupos de usuarios estándar, por lo que han tenido en cuenta esa superposición).
function onUserLogout() {
$groups_include = '2,4,10'; // Affect Registered, Publishers, and Custom Group
$groups_exclude = '7,8'; // Don't affect Administrators or Super Users
$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->update($db->quoteName('#__content'))
->set('checked_out = 0, checked_out_time = 0')
->where('( checked_out = '.JFactory::getUser()->id.' ) OR (
checked_out_time < NOW() - INTERVAL 12 HOUR
AND checked_out IN (SELECT GROUP_CONCAT(user_id) FROM scm_user_usergroup_map WHERE group_id IN ('.$groups_include.'))
AND checked_out NOT IN (SELECT GROUP_CONCAT(user_id) FROM scm_user_usergroup_map WHERE group_id IN ('.$groups_exclude.'))
)'
);
$db->setQuery($query);
$db->execute();
return true;
}
Estoy seguro de que el SQL se puede ajustar para zonas horarias, etc., pero aquí está la declaración SQL resultante:
UPDATE `gdp_content`
SET checked_out = 0, checked_out_time = 0
WHERE ( checked_out = 30 ) OR (
checked_out_time < NOW() - INTERVAL 12 HOUR
AND checked_out IN (SELECT GROUP_CONCAT(user_id) FROM scm_user_usergroup_map WHERE group_id IN (2,10,11))
AND checked_out NOT IN (SELECT GROUP_CONCAT(user_id) FROM scm_user_usergroup_map WHERE group_id IN (7,8))
)