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

10

Die meisten unserer Benutzer verstehen nicht, dass sie speichern oder abbrechen sollten, wenn sie ihren Inhalt bearbeiten. Daher haben wir ständig zahlreiche Artikel und Kategorien, die gesperrt sind. Mir ist klar, dass dies vom Administrator manuell 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 Zeitlimit für die Sperren irgendwie zu überschreiten?

BIP
quelle

Antworten:

5

Sie können einen stündlichen 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;

Hinweis: Ersetzen Sie josdurch Ihr Tabellenpräfix.

Die oben genannten SQL-Check-in-Artikel und -Kategorien, 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.

Farahmand
quelle
Ich dachte, es wäre ein Job für SQL, hoffte aber auf eine versteckte Funktion in den neueren Versionen.
BIP
1
AFAIK gibt es keine eingebaute Funktion, aber Sie können das Autocheckin- Plugin verwenden.
Farahmand
5

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

Wenn jeder Benutzer anmeldet heraus , das Plugin überprüft in einem der ihren Inhalt sowie alle anderen Check-outs , die aufgegeben wurden. Ich wollte, dass nur bestimmte Benutzergruppen betroffen sind und dass der Inhalt eines Administrators niemals betroffen ist (aus eigenen internen Gründen - möglicherweise übertrieben für typische Installationen, aber in unserem Fall haben wir benutzerdefinierte Benutzergruppen, die in mehreren der Benutzergruppen enthalten sein können Standardbenutzergruppen, haben also diese Überlappung berücksichtigt).

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 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))
        )
BIP
quelle
2
coole Idee diese nach dem Abmelden des Benutzers
FFrewin
2
Gute Antwort. Zur Vermeidung von Zeitzonen anpassen, können Sie ersetzen checked_out_time < NOW() - INTERVAL 12 HOURmit checked_out_time < JFactory::getDate('now +12 hours')- Nicht getestet.
Farahmand