Общее
Поля людей довольно сложны, но я сделаю все возможное, чтобы объяснить, что я узнал, поработав с ними при обновлении моей библиотеки ( SPUtility.js ). Вы можете взглянуть на класс SPUserField
в библиотеке, чтобы увидеть. В основном я использовал Firebug + Firefox, чтобы перепроектировать поле. К сожалению, поле генерируется по-разному в зависимости от того, какой браузер используется.
- В Firefox отображается обычный старый
textarea
.
- В IE, похоже, используется редактируемый контент div.
Сначала список элементов управления, составляющих поле:
- upLevelDiv - редактируемый контент div с помощью downlevelTextBox
- downlevelTextBox - Textarea
- hiddenSpanData - текстовое поле, в котором хранятся некоторые данные
- checkNames - пользователь нажимает кнопку ImageButton для проверки введенных имен с помощью AJAX
На самом деле есть еще пара элементов управления, но я не нашел их полезными (HiddenEntityKey, HiddenEntityDisplayText).
Получение контроля
Я не уверен, как работает HTML на странице ASPX, но в обычной форме SharePoint есть <span class="ms-usereditor">
. Все остальные элементы управления содержатся в этом диапазоне. Это позволяет относительно легко получить другие элементы управления:
var controls = this.Controls.select('span.ms-usereditor');
if (null !== controls && 1 === controls.length) {
this.spanUserField = controls[0];
this.upLevelDiv = $(this.spanUserField.id + '_upLevelDiv');
this.textareaDownLevelTextBox = $(this.spanUserField.id + '_downlevelTextBox');
this.linkCheckNames = $(this.spanUserField.id + '_checkNames');
this.txtHiddenSpanData = $(this.spanUserField.id + '_hiddenSpanData');
}
Настройка поля
Чтобы понять, я также включил детали для настройки поля.
if (Prototype.Browser.IE) {
this.upLevelDiv.innerHTML = value;
this.txtHiddenSpanData.setValue(value);
this.linkCheckNames.click();
}
else { // FireFox (maybe others?)
this.textareaDownLevelTextBox.setValue(value);
this.linkCheckNames.onclick();
}
Получение значения поля
После нажатия кнопки Проверить имена и выполнения AJAX ваши элементы управления должны быть заполнены новой информацией. UpLevelDiv, кажется, содержит большую его часть, но hiddenSpanData также содержит некоторые.
После выполнения upLevelDiv (или hiddenSpanData), вероятно, будет содержать что-то вроде этого:
<SPAN class=ms-entity-resolved id=spanDOMAIN\account12345 title=DOMAIN\account12345 contentEditable=false tabIndex=-1>
<DIV id=divEntityData style="DISPLAY: none" description="DOMAIN\account12345" isresolved="True" displaytext="LastName, FirstName" key="DOMAIN\account12345">
<DIV data='<ArrayOfDictionaryEntry xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><DictionaryEntry><Key xsi:type="xsd:string">SPUserID</Key><Value xsi:type="xsd:string">2</Value></DictionaryEntry><DictionaryEntry><Key xsi:type="xsd:string">Email</Key><Value xsi:type="xsd:string">email@address.com</Value></DictionaryEntry><DictionaryEntry><Key xsi:type="xsd:string">DisplayName</Key><Value xsi:type="xsd:string">LastName, FirstName</Value></DictionaryEntry><DictionaryEntry><Key xsi:type="xsd:string">Department</Key><Value xsi:type="xsd:string">My Department Name</Value></DictionaryEntry><DictionaryEntry><Key xsi:type="xsd:string">SIPAddress</Key><Value xsi:type="xsd:string">sip@address.com</Value></DictionaryEntry><DictionaryEntry><Key xsi:type="xsd:string">PrincipalType</Key><Value xsi:type="xsd:string">User</Value></DictionaryEntry><DictionaryEntry><Key xsi:type="xsd:string">Title</Key><Value xsi:type="xsd:string">My Job Title</Value></DictionaryEntry></ArrayOfDictionaryEntry>'></DIV></DIV><SPAN oncontextmenu=onContextMenuSpnRw(); onmousedown=onMouseDownRw(); id=content contentEditable=true tabIndex=-1>LastName, FirstName</SPAN></SPAN>
Затем все, что вам нужно сделать, - это проанализировать ArrayOfDictionaryEntry
объект XML, чтобы прочитать их электронную почту.