В моем курсе, когда пользователь пытается провести тест (например, викторина 1) и не может достичь оценки выше прохождения, он автоматически помещается в группу «под штрафом». Чтобы быть удаленным из этого статуса, пользователь должен пройти специальную викторину под названием «Исходная викторина» и достичь хотя бы прохождения. Трид на выкуп может быть предпринята несколько раз. < /P>
Я уже реализовал логику для этой группы. Я сталкиваюсь с проблемой, связанной с групповым контролем доступа. Когда пользователь добавляется или удаляется из группы «под штрафом», их разрешения на доступ не обновляются соответственно, чтобы отразить их текущее членство в группе. Мне нужна система, чтобы немедленно обновить пользователь доступ. У меня нет проблем, когда я вручную назначаю пользователя группе с ролью учителя. Я приведу приведенный ниже код для расщепления группы и кэша. Если кто -то знаком с этой проблемой или имеет предложения для исправления, ваша помощь будет очень оценена. < /P>
Код: Выделить всё
private static function add_user_to_group($userid, $courseid, $groupname) {
global $DB;
// Cari grup berdasarkan nama
if ($group = $DB->get_record('groups', ['courseid' => $courseid, 'name' => $groupname])) {
// Cek apakah user sudah ada di grup
if (!$DB->record_exists('groups_members', ['groupid' => $group->id, 'userid' => $userid])) {
$record = new \stdClass();
$record->groupid = $group->id;
$record->userid = $userid;
$record->timeadded = time();
$DB->insert_record('groups_members', $record);
error_log("[Gamification] User $userid added to group '$groupname' with comprehensive cache clearing");
// Send a notification to the user
$user = $DB->get_record('user', ['id' => $userid]);
if ($user) {
$message = get_string('penaltyapplied', 'local_rpg_gamification', $groupname);
// This will ensure the user sees the notification next time they access the site
\core\notification::add($message, \core\notification::WARNING);
}
// Clear cache
self::comprehensive_cache_clear($courseid, $userid);
}
} else {
// Group doesn't exist - log an error
error_log("[Gamification] ERROR: Group '$groupname' not found in course $courseid");
}
}
private static function comprehensive_cache_clear($courseid, $userid) {
global $DB;
error_log("[Cache Clear] Starting comprehensive cache clear for user $userid in course $courseid");
try {
// 1. Rebuild course cache (handles modinfo safely with locking)
rebuild_course_cache($courseid, true);
// 2. Clear group membership cache
\cache_helper::purge_by_definition('core', 'groupdata');
// 3. Clear general access cache
\accesslib_clear_all_caches($userid);
// 4. Clear group data cache
$groupcache = \cache::make('core', 'groupdata');
$groupcache->delete($courseid);
$groupcache->purge();
// 5. Clear capability cache
$capcache = \cache::make('core', 'capabilities');
$capcache->delete($userid);
// 6. Clear user data cache
$usercache = \cache::make('core', 'userdata');
$usercache->delete($userid);
// 7. Mark context dirty
$context = \context_course::instance($courseid);
$context->mark_dirty();
error_log("[Cache Clear] Comprehensive cache clear completed successfully");
} catch (\Exception $e) {
error_log("[Cache Clear] Error during cache clearing: " . $e->getMessage());
}
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... ion-access
Мобильная версия