Moodle:是否可以仅从 javascript 访问用户

问题描述 投票:0回答:2

我的目的只是能够在任何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 似乎没有在那里被过滤。

为这么小的信息创建一个插件似乎是错误的。我能做什么?

moodle moodle-api
2个回答
1
投票

您可以使用ajax通过Web服务请求用户信息,例如

core_user_get_users_by_field
。但是,您应该首先确定
userid
,这可以在登录后从顶部菜单链接(个人资料链接等)中检索。但无论如何我还是建议开发这个插件


0
投票

如果用户登录,您可以从页面上的多个不同位置获取用户的 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));
© www.soinside.com 2019 - 2024. All rights reserved.