首页 > 解决方案 > Moodle 用户选择器

问题描述

我说的是用户选择器,它有 2 列,中间有一些箭头。

我试图复制 /admin/roles/admins.php 中的内容,但没有成功。

我在 admin/roles 的 lib.php 中发现了一些有趣的函数,如下所示:

function core_role_get_potential_user_selector(context $context, $name, $options) {
$blockinsidecourse = false;
if ($context->contextlevel == CONTEXT_BLOCK) {
    $parentcontext = $context->get_parent_context();
    $blockinsidecourse = in_array($parentcontext->contextlevel, array(CONTEXT_MODULE, CONTEXT_COURSE));
}

if (($context->contextlevel == CONTEXT_MODULE || $blockinsidecourse) &&
        !is_inside_frontpage($context)) {
    $potentialuserselector = new core_role_potential_assignees_below_course('addselect', $options);
} else {
    $potentialuserselector = new core_role_potential_assignees_course_and_above('addselect', $options);
}

return $potentialuserselector;

}

我几乎正在开发一个本地插件,我想在给定课程 ID 上批量过期不同用户的证书。

另外,我可以为证书更新执行原始 SQL UPDATE 查询吗?

我会很感激一些提示,谢谢!

标签: phpmoodle

解决方案


复制用户选择器的关键admin/roles/admins.php是创建两个扩展的类(每个“用户列表列”一个)user_selector_base(在 admins.php 中,您可以找到示例core_role_admins_existing_selectorcore_role_admins_potential_selector)。

基本上,您需要扩展基类user_selector_base并实现find_users您认为合适的方法(取决于您要在左列和右列中显示的用户类型)。

该方法的职责是构建一个 SQL 查询,该查询从user给定$search查询的表中选择用户(因为选择器具有关联的搜索输入),但除此之外,您对 WHERE 条件执行的其余操作取决于您想要什么显示在您的列表中(在 admins.php 示例中,您会发现他们尝试显示按站点管理员 ID 过滤的站点管理员)。

这个用户选择器类可以在实例化之后和通常$OUTPUT->header()调用之后打印$selector->display();

请注意,其余逻辑admins.php是独立于用户选择器“控制”的,这意味着用户选择器本身不负责将用户从一列转移到另一列的逻辑,它们只是打印用户并允许您恢复有关哪些已被选择的信息。

如果您注意,admins.php您可能会注意到原始开发人员添加了一些输入提交(和确认步骤)+可选参数获取,最终负责添加/删除管理员列表的用户。

我几乎正在开发一个本地插件,我想在给定课程 ID 上批量过期不同用户的证书。

在这种情况下,您可能必须使用 WHERE / JOIN 为一个列/用户选择器类构建查询,该类考虑具有未过期证书的用户,而另一个列/用户选择器类考虑具有给定课程 ID 的过期用户的用户。您可能必须将此课程 ID 作为参数从其他地方传递给您的页面(然后传递给用户选择器类),否则您也必须将课程选择器添加到此页面。

另外,我可以为证书更新执行原始 SQL UPDATE 查询吗?

是的,您必须编写更新证书过期状态的逻辑,但根据您使用的认证插件,可能存在一些帮助程序/API(您可能需要在编写自己的查询之前对其进行检查)。


推荐阅读