Les éléments de contenu peuvent-ils être déverrouillés automatiquement après un certain temps?

10

La plupart de nos utilisateurs ne comprennent pas qu'ils doivent enregistrer ou annuler lorsqu'ils modifient leur contenu, nous avons donc constamment des dizaines d'articles et de catégories verrouillés. Je me rends compte que cela peut être fait manuellement par l'administrateur, mais l'édition se fait 24h / 24 et 7j / 7, et il est plutôt fastidieux de parcourir constamment tous les éléments pour déterminer si l'édition a été abandonnée ou non.

Existe-t-il un moyen de faire expirer les verrous d'une manière ou d'une autre?

PIB
la source

Réponses:

5

Vous pouvez définir un travail cron horaire ou utiliser phpMyAdmin et exécuter ce SQL:

UPDATE `jos_content` c    SET c.checked_out = 0, c.checked_out_time = 0 WHERE HOUR(TIMEDIFF(CONVERT_TZ(NOW(), @@session.time_zone, '+00:00'), c.checked_out_time)) >= 2;
UPDATE `jos_categories` c SET c.checked_out = 0, c.checked_out_time = 0 WHERE HOUR(TIMEDIFF(CONVERT_TZ(NOW(), @@session.time_zone, '+00:00'), c.checked_out_time)) >= 1;

Remarque: remplacez-le jospar le préfixe de votre table.

La vérification SQL ci-dessus dans les articles et catégories qui ont été extraits il y a plus de deux heures ou une heure respectivement. Je suppose qu'un article et une catégorie doivent être enregistrés respectivement dans les deux heures et une heure. Vous pouvez augmenter ces chiffres.

Farahmand
la source
Je pensais que ce serait un travail pour SQL, mais j'espérais une sorte de fonctionnalité cachée dans les nouvelles versions.
PIB du
1
AFAIK il n'y a pas de fonction intégrée mais vous pouvez utiliser le plugin Autocheckin .
Farahmand
5

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))
        )
PIB
la source
2
idée sympa celle-ci après la déconnexion de l'utilisateur
FFrewin
2
Bonne réponse. Pour éviter d'ajuster les fuseaux horaires, vous pouvez remplacer checked_out_time < NOW() - INTERVAL 12 HOURpar checked_out_time < JFactory::getDate('now +12 hours')- Non testé.
Farahmand