php - 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 查询吗?
我会很感激一些提示,谢谢!
解决方案
复制用户选择器的关键admin/roles/admins.php
是创建两个扩展的类(每个“用户列表列”一个)user_selector_base
(在 admins.php 中,您可以找到示例core_role_admins_existing_selector
和core_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(您可能需要在编写自己的查询之前对其进行检查)。
推荐阅读
- pandas - 熊猫每行获得上下栅栏
- variables - 在 Azure Pipeline 任务失败中设置变量
- java - 在 weblogic 12c 中编译 JSP 失败。类方法未定义
- android - AndroidX 迁移 - androidx.legacy:legacy-support-v4 或 androidx.appcompat:appcompat
- react-native - 使用带有样式组件的 react i18next
- c# - 如何在 Xamarin 中使用 GraphQL 将数据存储在 Apollo 缓存中?
- android - 停止从 BroadcastReceiver 启动的 Android 媒体播放器循环
- android - 如何在现有的 React Native App 中集成原生 ios 相机 SDK?
- javascript - 我正在尝试在模式对话框中打开视频
- python - 无法覆盖 django 信号中的变量值