Назначение группы Moodle Использование кода не обновлять доступ к ограничениюPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Назначение группы Moodle Использование кода не обновлять доступ к ограничению

Сообщение Anonymous »

Итак, я в настоящее время разрабатываю локальный плагин на Moodle 4.4, который автоматически назначает пользователя группе. Здесь случай: < /p>
В моем курсе, когда пользователь пытается провести тест (например, викторина 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());
}
}
Ниже приведен пример: пользователь Nathanael 32 не находится ни в одной группе, но он не мог получить доступ к окончательной викторине



Подробнее здесь: https://stackoverflow.com/questions/796 ... ion-access
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»