如何使用 Javascript 检索用户属性
How to Retrieve User Properties with Javascript
您好,我在 Content Editor Web Part
中有以下代码,它检索当前用户的名称并将其显示在消息框中:
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script language="javascript" type="text/javascript">
function getUser() {
var userid = _spPageContextInfo.userId;
//alert(userid);
var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/web/getuserbyid(" + userid + ")";
var requestHeaders = { "accept": "application/json;odata=verbose" };
$.ajax({
url: requestUri,
contentType: "application/json;odata=verbose",
headers: requestHeaders,
success: onSuccess,
error: onError
});
function onSuccess(data, request) {
var loginName = data.d.Title;
alert(loginName);
}
function onError(error) {
alert("Error on retrieving current user.");
}
}
$(document).ready(function() {
getUser();
});
</script>
我还能够显示带有 alert(data.d.Email);
的电子邮件。
但是,当我尝试调用 data.d.Groups
时(根据 the documentation - 这表明 Groups
属性 存在),我看到一个消息框 [object Object]
。
如何从这个(我假设是一个)集合中检索单个项目?
我试过了:
var group = data.d.Groups[0];
alert(group);
但这只是undefined
。
我认为这个对象将包含我的部门是不是错了?
无论哪种方式,是否有一种遍历这些对象的方法,或者我是否正确地完成了但在一个空数组上?
谢谢
尝试记录群组
function onSuccess(data, request) {
var loginName = data.d.Title;
console.log(loginName);
var groups = data.d.Groups;
console.log(groups);
}
我在 F12
控制台中看不到上述任何日志 window... (Internet Explorer)
尝试 2 - 记录成功
使用下面的代码,我能够获得与以前相同的结果,但是这次 console.log()
调用确实有效(仍然不知道为什么以前的没有):
ExecuteOrDelayUntilScriptLoaded(init,'sp.js');
var currentUser;
function init(){
this.clientContext = new SP.ClientContext.get_current();
this.oWeb = clientContext.get_web();
currentUser = this.oWeb.get_currentUser();
this.clientContext.load(currentUser);
this.clientContext.executeQueryAsync(Function.createDelegate(this,this.onQuerySucceeded), Function.createDelegate(this,this.onQueryFailed));
}
function onQuerySucceeded() {
var groups = currentUser.get_groups();
alert(groups);
console.log(groups);
var name = currentUser.get_loginName();
alert(name);
console.log(name);
var id = currentUser.get_id();
alert(name);
var title = currentUser.get_title();
alert(title);
var email = currentUser.get_email();
alert(email);
}
function onQueryFailed(sender, args) {
alert('Request failed. \nError: ' + args.get_message() + '\nStackTrace: ' + args.get_stackTrace());
}
调用console.log(groups);
后,F12控制台出现以下内容:
"data.d.Groups" 是对象,当您将其传递给 .html(data.d.Groups) 时,您将获得它作为 [object Object] 只是因为对象将转换为字符串 Just循环对象,你会得到键和值
for (key in data.d.Groups){
alert("key: " + key + "value :" + data.d.Groups[key]);
}
我找到了一个相当丑陋的解决方案,但它确实有效。
首先,我们需要在准备阶段调用一些.js文件:
<script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.0.min.js"></script>
<script src="/_layouts/15/SP.Runtime.js"></script>
<script src="/_layouts/15/SP.js"></script>
<script src="/_layouts/15/SP.UserProfiles.js"></script>
然后,在 <script language="javascript" type="text/javascript">
标签内,我们声明了一些全局变量和 2 个主要函数...
var currentUser;
var currentUserName;
var property = "Department";
1. GetCurrentUserProperty(属性):
这个函数实际上只为我们获取当前用户,如果成功将调用 loadUserData
(实际上获取我们之前为给定用户定义的 property
:
// This function first gets the current user's firstname.lastname username (e.g. Joe.Bloggs).
// If this is successful, it calls the loadUserData function, which will retrieve the user's
// property which was defined in the global "property" variable.
function GetCurrentUserProperty(){
this.clientContext = new SP.ClientContext.get_current();
this.oWeb = clientContext.get_web();
currentUser = this.oWeb.get_currentUser();
this.clientContext.load(currentUser);
this.clientContext.executeQueryAsync(onQueryUserSuccess, onQueryUserFail);
}
function onQueryUserSuccess() {
// If the query is successful, extract the first.last username and then call loadUserData
window.currentUserName= currentUser.get_loginName().split("\")[1];
loadUserData(window.currentUserName);
}
function onQueryUserFail(sender, args) {
alert('Failed to retrieve user name');
}
2。 loadUserData
此函数接受给定的 user.name 并将为该用户获取存储在 property
中的 属性。在这里,在 success
函数中,我只是将结果输出到 alert
window:
function loadUserData(userName){
//Get Current Context
var clientContext = new SP.ClientContext.get_current();
//Get Instance of People Manager Class
var peopleManager = new SP.UserProfiles.PeopleManager(clientContext);
//Property to fetch from the User Profile
var strDepartment = window.property;
//If you are on On-Premise:
var targetUser = "BARDOM1\" + userName;
//Create new instance of UserProfileProperty
departmentProperty = peopleManager.getUserProfilePropertyFor(targetUser, strDepartment)
//Execute the Query. (No load method necessary)
clientContext.executeQueryAsync(onSuccess, onFail);
}
function onSuccess() {
var messageText = window.property + " is " + departmentProperty .get_value();
alert(messageText);
}
function onFail(sender, args) {
alert("Error: " + args.get_message());
}
最后,要真正运行这个过程,我们需要调用GetCurrentUserProperty();
。我将所有这些代码放入一个名为 testproperty.js
的文件中,并将其保存在 SiteAssets
中。然后,在我们希望代码为 运行 的页面上,添加一个 Content Editor Web Part
并在编辑 -> 路径中调用 ../../SiteAssets/testproperty.js
。这将在页面加载后 运行 - 希望这对其他可能卡在这个问题上的人有所帮助!
您好,我在 Content Editor Web Part
中有以下代码,它检索当前用户的名称并将其显示在消息框中:
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script language="javascript" type="text/javascript">
function getUser() {
var userid = _spPageContextInfo.userId;
//alert(userid);
var requestUri = _spPageContextInfo.webAbsoluteUrl + "/_api/web/getuserbyid(" + userid + ")";
var requestHeaders = { "accept": "application/json;odata=verbose" };
$.ajax({
url: requestUri,
contentType: "application/json;odata=verbose",
headers: requestHeaders,
success: onSuccess,
error: onError
});
function onSuccess(data, request) {
var loginName = data.d.Title;
alert(loginName);
}
function onError(error) {
alert("Error on retrieving current user.");
}
}
$(document).ready(function() {
getUser();
});
</script>
我还能够显示带有 alert(data.d.Email);
的电子邮件。
但是,当我尝试调用 data.d.Groups
时(根据 the documentation - 这表明 Groups
属性 存在),我看到一个消息框 [object Object]
。
如何从这个(我假设是一个)集合中检索单个项目?
我试过了:
var group = data.d.Groups[0];
alert(group);
但这只是undefined
。
我认为这个对象将包含我的部门是不是错了?
无论哪种方式,是否有一种遍历这些对象的方法,或者我是否正确地完成了但在一个空数组上?
谢谢
尝试记录群组
function onSuccess(data, request) {
var loginName = data.d.Title;
console.log(loginName);
var groups = data.d.Groups;
console.log(groups);
}
我在 F12
控制台中看不到上述任何日志 window... (Internet Explorer)
尝试 2 - 记录成功
使用下面的代码,我能够获得与以前相同的结果,但是这次 console.log()
调用确实有效(仍然不知道为什么以前的没有):
ExecuteOrDelayUntilScriptLoaded(init,'sp.js');
var currentUser;
function init(){
this.clientContext = new SP.ClientContext.get_current();
this.oWeb = clientContext.get_web();
currentUser = this.oWeb.get_currentUser();
this.clientContext.load(currentUser);
this.clientContext.executeQueryAsync(Function.createDelegate(this,this.onQuerySucceeded), Function.createDelegate(this,this.onQueryFailed));
}
function onQuerySucceeded() {
var groups = currentUser.get_groups();
alert(groups);
console.log(groups);
var name = currentUser.get_loginName();
alert(name);
console.log(name);
var id = currentUser.get_id();
alert(name);
var title = currentUser.get_title();
alert(title);
var email = currentUser.get_email();
alert(email);
}
function onQueryFailed(sender, args) {
alert('Request failed. \nError: ' + args.get_message() + '\nStackTrace: ' + args.get_stackTrace());
}
调用console.log(groups);
后,F12控制台出现以下内容:
"data.d.Groups" 是对象,当您将其传递给 .html(data.d.Groups) 时,您将获得它作为 [object Object] 只是因为对象将转换为字符串 Just循环对象,你会得到键和值
for (key in data.d.Groups){
alert("key: " + key + "value :" + data.d.Groups[key]);
}
我找到了一个相当丑陋的解决方案,但它确实有效。
首先,我们需要在准备阶段调用一些.js文件:
<script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.0.min.js"></script>
<script src="/_layouts/15/SP.Runtime.js"></script>
<script src="/_layouts/15/SP.js"></script>
<script src="/_layouts/15/SP.UserProfiles.js"></script>
然后,在 <script language="javascript" type="text/javascript">
标签内,我们声明了一些全局变量和 2 个主要函数...
var currentUser;
var currentUserName;
var property = "Department";
1. GetCurrentUserProperty(属性):
这个函数实际上只为我们获取当前用户,如果成功将调用 loadUserData
(实际上获取我们之前为给定用户定义的 property
:
// This function first gets the current user's firstname.lastname username (e.g. Joe.Bloggs).
// If this is successful, it calls the loadUserData function, which will retrieve the user's
// property which was defined in the global "property" variable.
function GetCurrentUserProperty(){
this.clientContext = new SP.ClientContext.get_current();
this.oWeb = clientContext.get_web();
currentUser = this.oWeb.get_currentUser();
this.clientContext.load(currentUser);
this.clientContext.executeQueryAsync(onQueryUserSuccess, onQueryUserFail);
}
function onQueryUserSuccess() {
// If the query is successful, extract the first.last username and then call loadUserData
window.currentUserName= currentUser.get_loginName().split("\")[1];
loadUserData(window.currentUserName);
}
function onQueryUserFail(sender, args) {
alert('Failed to retrieve user name');
}
2。 loadUserData
此函数接受给定的 user.name 并将为该用户获取存储在 property
中的 属性。在这里,在 success
函数中,我只是将结果输出到 alert
window:
function loadUserData(userName){
//Get Current Context
var clientContext = new SP.ClientContext.get_current();
//Get Instance of People Manager Class
var peopleManager = new SP.UserProfiles.PeopleManager(clientContext);
//Property to fetch from the User Profile
var strDepartment = window.property;
//If you are on On-Premise:
var targetUser = "BARDOM1\" + userName;
//Create new instance of UserProfileProperty
departmentProperty = peopleManager.getUserProfilePropertyFor(targetUser, strDepartment)
//Execute the Query. (No load method necessary)
clientContext.executeQueryAsync(onSuccess, onFail);
}
function onSuccess() {
var messageText = window.property + " is " + departmentProperty .get_value();
alert(messageText);
}
function onFail(sender, args) {
alert("Error: " + args.get_message());
}
最后,要真正运行这个过程,我们需要调用GetCurrentUserProperty();
。我将所有这些代码放入一个名为 testproperty.js
的文件中,并将其保存在 SiteAssets
中。然后,在我们希望代码为 运行 的页面上,添加一个 Content Editor Web Part
并在编辑 -> 路径中调用 ../../SiteAssets/testproperty.js
。这将在页面加载后 运行 - 希望这对其他可能卡在这个问题上的人有所帮助!