สามารถปลดล็อกไอเท็มเนื้อหาโดยอัตโนมัติหลังจากผ่านไประยะเวลาหนึ่งหรือไม่?


10

ผู้ใช้ส่วนใหญ่ของเราไม่เข้าใจว่าพวกเขาควรบันทึกหรือยกเลิกเมื่อพวกเขาแก้ไขเนื้อหาของพวกเขาดังนั้นเราจึงมีคะแนนของบทความและหมวดหมู่ที่ถูกล็อค ฉันรู้ว่าผู้ดูแลระบบสามารถทำสิ่งนี้ได้ด้วยตนเอง แต่การแก้ไขดำเนินไปตลอด 24/7 และค่อนข้างน่าเบื่อที่จะต้องผ่านรายการทั้งหมดที่กำหนดว่าการแก้ไขนั้นถูกทอดทิ้งหรือไม่

มีวิธีใดบ้างที่จะให้การล็อคหมดเวลา

คำตอบ:


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

5

พยายามหลีกเลี่ยง crons ทุกครั้งที่ทำได้ แต่ตามคำตอบจาก @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 HOURด้วยchecked_out_time < JFactory::getDate('now +12 hours')- ไม่ผ่านการทดสอบ
Farahmand
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.