内容项可以在一定时间后自动解锁吗?


10

我们的大多数用户都不知道他们在编辑内容时应该保存或取消,因此我们不断有数十篇文章和类别被锁定。我意识到这可以由管理员手动完成,但是编辑是24/7进行的,因此不断检查所有项目以确定是否放弃编辑是相当繁琐的工作。

有办法让锁超时吗?

Answers:


5

您可以定义每小时的cron作业或使用phpMyAdmin并执行以下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;

注意:jos表前缀替换。

上面的SQL签入文章和类别分别签出了两个多小时或一个小时前。我假设一篇文章和一个类别应分别保存在两个小时和一个小时内。您可以增加这些数字。


认为这对于SQL来说是一项工作,但希望在新版本中使用某种隐藏功能。
GDP

1
AFAIK没有内置功能,但是您可以使用Autocheckin插件。
Farahmand 2014年

5

尝试尽可能避免使用cron,但是基于@Farahmand的回答,我在用户插件onUserLogout()事件中添加了以下代码的变体:

任何用户注销,插件将检入任何内容以及可能已放弃的任何其他检出。我只希望某些用户组受到影响,并确保任何管理员用户的内容都不会受到影响(由于我们自己的内部原因-可能对于典型安装而言有些过分,但是在我们的情况下,我们有一些自定义用户组可以标准用户组,因此已解决了这一重叠)。

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

我确定可以针对时区等调整SQL,但这是生成的SQL语句:

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

2
登出用户后的好主意
FFrewin

2
好答案。为避免调整时区,您可以将其替换checked_out_time < NOW() - INTERVAL 12 HOURchecked_out_time < JFactory::getDate('now +12 hours')-未测试。
Farahmand 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.