พยายามหลีกเลี่ยง 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))
)