我正在使用sharepoint services 3.0并且我已经创建了一个自定义列表表单。我在这种形式中有一个peoplepicker字段,需要将其默认设置为当前用户。
这是我到目前为止所得到的:
首先是我的人民选择:
函数PeoplePicker(){
this.context = null;
this.web = null;
this.currentUser = null;
this.parentTagId = null
this.SetParentTagId = function(id){
this.parentTagId = id;
}
this.SetLoggedInUser = function(){
if(this.parentTagId != null){
this.getWebUserData();
}
}
this.getWebUserData = function(){
this.context = new SP.ClientContext.get_current();
this.web = this.context.get_web();
this.currentUser = this.web.get_currentUser();
this.currentUser.retrieve();
this.context.load(this.web);
this.context.executeQueryAsync(Function.createDelegate(this, this.onSuccessMethod),
Function.createDelegate(this, this.onFailureMethod));
}
this.onSuccessMethod = function(){
this.setDefaultValue(this.currentUser.get_title());
}
this.onFailureMethod = function(){
alert('request failed ' + args.get_message() + '\n' + args.get_stackTrace());
}
this.setDefaultValue = function(value){
var parentTag = document.getElementById(this.parentTagId);
if (parentTag != null) {
var peoplePickerTag = this.getTagFromIdentifierAndTitle(parentTag, 'div',
'UserField_upLevelDiv', 'People Picker');
if (peoplePickerTag) {
peoplePickerTag.innerHTML = value;
}
}
}
this.getTagFromIdentifierAndTitle = function(parentElement, tagName, identifier, title){
var len = identifier.length;
var tags = parentElement.getElementsByTagName(tagName);
for (var i = 0; i < tags.length; i++) {
var tempString = tags[i].id;
if (tags[i].title == title && (identifier == "" ||
tempString.indexOf(identifier) == tempString.length - len)) {
return tags[i];
}
}
return null;
}
}
其次我在asp内容中使用它的方式:
ExecuteOrDelayUntilScriptLoaded(SetWebUserData,“PeoplePicker.js”);
function SetWebUserData(){ var pplPicker = new PeoplePicker(); //设置选择器的人员的父标签ID。 pplPicker.SetParentTagId( 'ctl00_PlaceHolderMain_g_ec44fef5_c1a6_4ade_b7e4_2b80803724a1_ff6_1_ctl00_ctl00_UserField'); pplPicker.SetLoggedInUser(); }
但是当我加载表单时没有任何反应......我使用了错误的父标记ID吗?我从页面的源代码中获取了它......
任何帮助都会很棒!
答案 0 :(得分:3)
我是这样做的。
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script type="text/javascript">
$(window).load(function(){
var columnName = 'Manager Name';
var searchText = RegExp("FieldName=\"" + columnName + "\"", "gi");
$("td.ms-formbody").each(function() {
if(searchText.test($(this).html())) {
$(this).find("div[Title='People Picker']").html(getUserName());
return false;
}
});
function getUserName() {
var wshell=new ActiveXObject("wscript.shell");
var userName=wshell.ExpandEnvironmentStrings("%username%");
return userName;}
});
</script>
我的人员选择器字段被命名为“管理员名称”,但它是一个变量,因此您可以更改它。我使用函数getUserName()来设置人员选择器的值。 getUserName使用Environment String用户名。有些人会告诉你这不是最好用的东西,因为它可能是“伪造的”。我处于严格控制的企业环境中。就个人而言,我认为大多数用户甚至不知道如何做到这一点。
我认为您遇到的问题是人员选择器字段所需的价值不仅仅是字符串。我相信它正在寻找一个键值对,这意味着您需要在SharePoint站点中分配的用户名和ID号。为了解决这个问题,我使用的代码只是将用户名sting放在html表单字段中。
希望这有帮助。
答案 1 :(得分:2)
这是我实现的方式,这里我已经将用户名作为查询字符串传递,如果没有填充当前用户。根据您的需要进行修改。
var Dname = queryString('DName');
if(Dname!= null)
{
var pp = getPickerInputElement('Employee');
if(pp != null)
{
pp.innerHTML =Dname;
document.getElementById('Emp').innerHTML=Dname;
}
}
else
{
fillPeoplePickerWithCurrentUser('Employee');
}
function fillPeoplePickerWithCurrentUser(pickerName)
{
var currentUser =getUserData();
}
function getUserData()
{
context = new SP.ClientContext.get_current();
web = context.get_web();
currentUser = web.get_currentUser();
currentUser.retrieve();
context.load(web);
context.executeQueryAsync(onSuccessMethod, onFaiureMethodl);
}