¿Se pueden desbloquear automáticamente los elementos de contenido después de cierto tiempo?

10

La mayoría de nuestros usuarios no entienden que deben guardar o cancelar cuando editan su contenido, por lo que constantemente tenemos decenas de artículos y categorías bloqueados. Me doy cuenta de que el administrador puede hacer esto manualmente, pero la edición se realiza las 24 horas, los 7 días de la semana, y es bastante tedioso revisar constantemente todos los elementos para determinar si la edición se ha abandonado o no.

¿Hay alguna manera de hacer que las cerraduras se agoten de alguna manera?

PIB
fuente

Respuestas:

5

Puede definir un trabajo cron por hora o usar phpMyAdmin y ejecutar 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: Reemplace joscon el prefijo de su tabla.

La verificación SQL anterior en artículos y categorías que se retiraron hace más de dos horas o una hora respectivamente. Supongo que un artículo y una categoría deben guardarse dentro de dos horas y una hora respectivamente. Puede aumentar esos números.

Farahmand
fuente
Pensé que sería un trabajo para SQL, pero esperaba algún tipo de característica oculta en las versiones más recientes.
PIB
1
AFAIK no hay una función incorporada, pero puede usar el complemento Autocheckin .
Farahmand
5

Intentando evitar crons siempre que sea posible, pero según la respuesta de @Farahmand, pongo una variación de este código en un onUserLogout()evento de complemento de usuario :

Cuando cualquier usuario inicia sesión a cabo , el plugin cheques-en cualquiera de su contenido, así como cualquier otro registro de salida que pueden haber sido abandonados. Solo quería que ciertos grupos de usuarios se vieran afectados, y asegurarme de que el contenido de los usuarios administradores nunca se viera afectado (por nuestras propias razones internas, tal vez demasiado para instalaciones típicas, pero en nuestro caso tenemos grupos de usuarios personalizados que pueden estar en varios de los grupos de usuarios estándar, por lo que han tenido en cuenta esa superposición).

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

Estoy seguro de que el SQL se puede ajustar para zonas horarias, etc., pero aquí está la declaración 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))
        )
PIB
fuente
2
idea genial esta después del cierre de sesión del usuario
FFrewin
2
Buena respuesta. Para evitar ajustar las zonas horarias, puede reemplazar checked_out_time < NOW() - INTERVAL 12 HOURcon checked_out_time < JFactory::getDate('now +12 hours')- No probado.
Farahmand