it-swarm.com.de

Können Inhaltselemente nach einer bestimmten Zeit automatisch entsperrt werden?

Die meisten unserer Benutzer verstehen nicht, dass sie speichern oder abbrechen sollten, wenn sie ihren Inhalt bearbeiten, daher haben wir ständig Dutzende Artikel und Kategorien, die gesperrt sind. Mir ist klar, dass dies manuell vom Administrator durchgeführt werden kann, aber die Bearbeitung erfolgt rund um die Uhr und es ist ziemlich mühsam, ständig alle Elemente durchzugehen, um festzustellen, ob die Bearbeitung abgebrochen wurde oder nicht.

Gibt es eine Möglichkeit, das Sperren-Timeout irgendwie zu haben?

10
GDP

Sie können einen Stunden-Cron-Job definieren oder phpMyAdmin verwenden und diese SQL ausführen:

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;

Anmerkung: Ersetzen Sie jos durch Ihr Tabellenpräfix.

Mit der obigen SQL-Anweisung werden Artikel und Kategorien eingecheckt, die vor mehr als zwei Stunden bzw. einer Stunde ausgecheckt wurden. Ich gehe davon aus, dass ein Artikel und eine Kategorie innerhalb von zwei Stunden bzw. einer Stunde gespeichert werden sollten. Sie können diese Zahlen erhöhen.

5
Farahmand

Ich habe versucht, Cron zu vermeiden, aber basierend auf der Antwort von @Farahmand habe ich eine Variation dieses Codes in ein User Plugin onUserLogout() -Ereignis eingefügt:

Wenn ein Benutzer sich out anmeldet, checkt das Plugin einen seiner Inhalt sowie alle anderen Check-outs, die möglicherweise abgebrochen wurden. Ich wollte, dass nur bestimmte Benutzergruppen betroffen sind und dass der Inhalt von Administratoren niemals betroffen ist (aus unseren eigenen internen Gründen - vielleicht übertrieben für gewöhnlich) In unserem Fall haben wir jedoch benutzerdefinierte Benutzergruppen, die zu mehreren Standardbenutzergruppen gehören können.

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;
}

Ich bin sicher, dass die SQL für Zeitzonen usw. angepasst werden kann, aber hier ist die resultierende SQL-Anweisung:

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))
        )
5
GDP