我的目的只是能够在任何moodle页面上的javascript中检索基本用户信息(id、用户名、姓氏、名字),而无需创建插件。
我看到Moodle中有一个javascript全局变量:
M
,但里面没有用户信息。
有没有一种方法可以仅以 JavaScript 的另一种方式从任何页面上的登录用户访问用户信息(至少是 ID)?
我已经尝试使用 generico 过滤器来创建一个块,我将能够从中检索信息
<span data-firstname="@@USER:firstname@@" data-lastname="@@USER:lastname@@" data-userid="@@USER:id@@" id="useriddata"></span>
但是因为我希望它出现在任何页面上,所以我尝试了 Moodle > Extra HTML 文本区域。遗憾的是它不起作用,因为 HTML 似乎没有在那里被过滤。
为这么小的信息创建一个插件似乎是错误的。我能做什么?
您可以使用ajax通过Web服务请求用户信息,例如
core_user_get_users_by_field
。但是,您应该首先确定 userid
,这可以在登录后从顶部菜单链接(个人资料链接等)中检索。但无论如何我还是建议开发这个插件
如果用户登录,您可以从页面上的多个不同位置获取用户的 ID。之后,您可以从编辑个人资料页面获取有关用户的信息。 您还可以使用类似的方法轻松获取课程信息和评分,但这超出了本问题的范围。 下面是一些可以帮助您入门的代码:
function getUserId() {
// First we look for the user's id in the link to their profile page
const profileLink = document.querySelector('.logininfo > .logininfo > a');
if (profileLink !== null) {
const urlParameters = profileLink.href.split('?')[1].split('&');
const count = urlParameters.length;
for (let index = 0; index < length; index++) {
const parameter = urlParameters[index];
const [key, value] = parameter.split('=');
if (key === 'id') {
return value;
}
}
}
// Next we look for any element with the data-user-id attribute
const userIdDatasetElement = document.querySelector('*[data-user-id]');
if (userIdDatasetElement !== null) {
const userId = userIdDatasetElement?.dataset?.userId;
if (typeof userId === 'string') {
return userId;
}
}
// When that doesn't work we try to find an element with the data-route-param attribute
const fallbackElement = document.querySelector('*[data-route-param]');
if (fallbackElement !== null) {
const userId = fallbackElement?.dataset?.userId;
if (typeof userId === 'string') {
return userId;
}
}
// And finally, we fail silently if we can't find it
return '0';
}
async function getUserDetails(host = location.host, userId = getUserId()) {
// Fetch the edit page for the user's profile
const response = await fetch(`https://${host}/user/edit.php?id=${userId}&course=1`);
const text = await response.text();
// Parse it into a DOM object, alternatively you could use RegExp on the text if resources are scarce
const parser = new DOMParser();
const dom = parser.parseFromString(text, "text/html");
// Pull the values from the necessary fields, these may differ by installation, update as needed
const firstName = dom.querySelector('#id_firstname')?.value;
const lastName = dom.querySelector('#id_lastname')?.value;
const altName = dom.querySelector('#id_alternatename')?.value;
const email = dom.querySelector('#id_email')?.value;
const emailVisibility = dom.querySelector('#id_maildisplay > option[selected]')?.innerText;
const moodleNetProfileId = dom.querySelector('#id_moodlenetprofile')?.value;
const city = dom.querySelector('#id_city')?.value;
const country = dom.querySelector('#id_country > option[selected]')?.innerText;
const timeZone = dom.querySelector('#id_timezone > option[selected]')?.innerText;
const description = dom.querySelector('#id_description_editor')?.value;
const image = dom.querySelector('img.userpicture')?.src;
// Finally, we return the information
return {
userId,
firstName,
lastName,
altName,
email,
emailVisibility,
moodleNetProfileId,
city,
country,
timeZone,
description,
image
};
}
// Here's an example. Run it in the DevTools console on your Moodle installation to see the magic :)
getUserDetails().then((userObject) => console.dir(userObject));