Cercando di evitare i cron quando possibile, ma in base alla risposta di @Farahmand, ho inserito una variante di questo codice in un onUserLogout()
evento Plugin utente :
Quando un utente si disconnette , il plug-in esegue il check-in di tutti i loro contenuti, nonché qualsiasi altro check-out che potrebbe essere stato abbandonato. Volevo che solo alcuni gruppi di utenti fossero interessati e per garantire che il contenuto di qualsiasi utente amministratore non fosse mai interessato (per motivi interni - forse eccessivo per installazioni tipiche, ma nel nostro caso abbiamo gruppi di utenti personalizzati che possono trovarsi in molti dei gruppi di utenti standard, quindi hanno tenuto conto di tale sovrapposizione).
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;
}
Sono sicuro che SQL può essere regolato per fusi orari, ecc., Ma ecco l'istruzione SQL risultante:
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))
)