En essayant d'éviter les crons autant que possible, mais sur la base de la réponse de @Farahmand, j'ai mis une variation de ce code dans un onUserLogout()
événement User Plugin :
Lorsque tout utilisateur se connecte sur , les contrôles dans le plugin-tout de leur contenu, ainsi que toute autre check-out qui peuvent avoir été abandonnés. Je voulais que seuls certains groupes d'utilisateurs soient affectés, et pour m'assurer que le contenu des utilisateurs administrateurs n'a jamais été affecté (pour nos propres raisons internes - peut-être exagéré pour les installations typiques, mais dans notre cas, nous avons des groupes d'utilisateurs personnalisés qui peuvent être dans plusieurs des groupes d'utilisateurs standard, ont donc pris en compte ce chevauchement).
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;
}
Je suis sûr que le SQL peut être ajusté pour les fuseaux horaires, etc., mais voici l'instruction SQL résultante:
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))
)