Os itens de conteúdo podem ser desbloqueados automaticamente após um certo período de tempo?


10

A maioria dos nossos usuários não entende que eles devem Salvar ou Cancelar ao editar seu conteúdo, portanto, temos constantemente vários artigos e categorias bloqueados. Percebo que isso pode ser feito manualmente pelo administrador, mas a edição continua 24 horas por dia, 7 dias por semana, e é entediante examinar constantemente todos os itens para determinar se a edição foi abandonada ou não.

Existe uma maneira de que os bloqueios expirem de alguma forma?

Respostas:


5

Você pode definir uma tarefa cron de hora em hora ou usar o phpMyAdmin e executar este 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;

Nota: Substitua jospelo seu prefixo da tabela.

O SQL acima faz check-in de artigos e categorias com check-out há mais de duas horas ou uma hora, respectivamente. Presumo que um artigo e uma categoria devem ser salvos dentro de duas horas e uma hora, respectivamente. Você pode aumentar esses números.


Achei que seria um trabalho para o SQL, mas esperava algum tipo de recurso oculto nas versões mais recentes.
GDP

1
AFAIK não há recurso interno, mas você pode usar o plug- in Autocheckin .
Farahmand

5

Tentando evitar crons sempre que possível, mas com base na resposta de @Farahmand, coloquei uma variação desse código em um onUserLogout()evento do plug-in do usuário :

Quando qualquer usuário efetua logout , o plug-in faz check-in de seu conteúdo, bem como quaisquer outros check-outs que possam ter sido abandonados. Queria que apenas determinados grupos de usuários fossem afetados e garantisse que qualquer conteúdo de usuário administrativo nunca fosse afetado (por nossos próprios motivos internos - talvez exagero em instalações típicas, mas, no nosso caso, temos grupos de usuários personalizados que podem estar em vários dos grupos de usuários padrão, portanto, foram responsáveis ​​por essa sobreposição).

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

Tenho certeza de que o SQL pode ser ajustado para fusos horários etc., mas aqui está a instrução SQL resultante:

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
arrefecer ideia este após o logout do usuário
FFrewin

2
Boa resposta. Para evitar o ajuste de fusos horários, você pode substituir checked_out_time < NOW() - INTERVAL 12 HOURpor checked_out_time < JFactory::getDate('now +12 hours')- Não testado.
Farahmand
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.