Привет,
Мне нужно написать какой-то javascript, который получает содержимое поля пользователя на веб-сайте sharepoint. Я могу получить большинство полей с помощью javascript-функции getTagFromIdentifierAndTitle из Использование Javascript для управления полем формы списка, но не UserFields.
Итак, как я могу получить UserFields?
Спасибо!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я проследил, как адресная книга взаимодействует с полем пользователя. Для получения значений используется функция getUplevel (ctx), а для установки значений может использоваться функция EntityEditorCallback (xml, ctx). Первая функция вернет смешанную строку html / xml с информацией о пользователе. Второй вход функции должен быть строкой XML в специальном формате.
// Get values
var ctx='ctl00_m_g_e5a1501a_..._ctl04_ctl00_ctl00_UserField';
var values=getUplevel(ctx);
alert(values);
// Set values
var xml='<Entities Append = "False" Error = "" Separator = ";" MaxHeight = "3">'+
'<Entity Key = "DOMAIN\\loginname" DisplayText = "Display Name" IsResolved = "True" Description = "DOMAIN\\loginname">'+
'<ExtraData>'+
'<ArrayOfDictionaryEntry xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd = "http://www.w3.org/2001/XMLSchema">'+
'<DictionaryEntry><Key xsi:type = "xsd:string">DisplayName</Key><Value xsi:type = "xsd:string">Display Name</Value></DictionaryEntry>'+
'<DictionaryEntry><Key xsi:type = "xsd:string">Email</Key><Value xsi:type = "xsd:string">[email protected]</Value></DictionaryEntry>'+
'<DictionaryEntry><Key xsi:type = "xsd:string">SPUserID</Key><Value xsi:type = "xsd:string">1</Value></DictionaryEntry>'+
'<DictionaryEntry><Key xsi:type = "xsd:string">PrincipalType</Key><Value xsi:type = "xsd:string">User</Value></DictionaryEntry>'+
'</ArrayOfDictionaryEntry>'+
'</ExtraData>'+
'<MultipleMatches />'+
'</Entity>'+
'</Entities>';
EntityEditorCallback(xml,ctx);
Сложная часть - это атрибут ctx, который должен быть идентификатором целевого поля. В пользовательском поле html нет атрибута title, поэтому найти нужный элемент по отображаемому имени с помощью js очень сложно. Предлагаю передать id поля в javascript со стороны сервера. Например, вы можете создать настраиваемую веб-часть, в которой вы пишете идентификаторы полей страницы из коллекции SPContext.Current.FormContext.FieldControlCollection.
Вот код, который я собрал. Он основан на точном HTML, который SharePoint использует для PeoplePicker. Он работает как в IE, так и в Firefox. Для параметра columnName передайте «общедоступное» имя столбца, а не внутреннее имя.
function getParentElementByTagName(baseNode, tagName)
{
var currNode;
if (baseNode !== null)
{
currNode = baseNode.parentNode;
while((currNode !== null) && (currNode.nodeName != tagName))
{
currNode = currNode.parentNode;
}
return currNode;
}
else
{
return null;
}
}
function getPeoplePickerCell(columnName)
{
var search = 'FieldName = "' + columnName + '"';
var nodes = document.getElementsByTagName("TEXTAREA");
for(var i=0; i < nodes.length; i++)
{
if (nodes[i].title == "People Picker")
{
var outerCell = getParentElementByTagName(nodes[i], "SPAN").parentNode.parentNode;
if (outerCell.innerHTML.indexOf(search) > 0)
{
return nodes[i].parentNode;
}
}
}
return null;
}
function getSPPeoplePicker(columnName, value)
{
var cell = getPeoplePickerCell(columnName);
if (cell !== null)
{
return cell.childNodes[0].innerHTML;
}
else
{
return null;
}
}
function setSPPeoplePicker(columnName, value)
{
var cell = getPeoplePickerCell(columnName);
if (cell !== null)
{
cell.childNodes[0].innerHTML = value;
cell.childNodes[1].value = value;
}
}
function disableSPPeoplePicker(columnName)
{
var cell = getPeoplePickerCell(columnName);
if (cell !== null)
{
disableElement(cell.childNodes[0]);
disableElement(cell.childNodes[1]);
}
}
function enableSPPeoplePicker(columnName)
{
var cell = getPeoplePickerCell(columnName);
if (cell !== null)
{
enableElement(cell.childNodes[0]);
enableElement(cell.childNodes[1]);
}
}