none
Получить значение из ClientPeoplePicker для каждого элемента списка JS RRS feed

  • Вопрос

  • Всем привет!
    Есть SharePoint 2013, имеется список с двумя полями "Title" и "User" (тип "Пользователь или группа"). В данном список есть значения.

    Мне нужно с помощью JS перебрать каждый элемент списка, вытащить значение из поля User и, скажем, вывести на страницу.

    Накидал следующий скрипт (если выводить содержимое поля "Title" - всё работает отлично, но поле "User" - это уже объект и как вытащить содержимое и вывести на страницу я не знаю и прошу вашей помощи!):

    var collListItemToBeUpdated = "";
        var ListItemToBeUpdated = "";
      var userProfileProperties;
      //Get Current Context	
      var clientContext = new SP.ClientContext.get_current();
      
      //Get Instance of People Manager Class
      var peopleManager = new SP.UserProfiles.PeopleManager(clientContext);
    	
        function getItemsToBeUpdated() 
        {
             //var clientContext = new SP.ClientContext.get_current();
             var oList = clientContext.get_web().get_lists().getByTitle('Logins');
             var camlQuery = new SP.CamlQuery();
             camlQuery.set_viewXml('<View><Query><OrderBy><FieldRef Name=\'Title\' Ascending=\'True\' /></OrderBy></Query><ViewFields><FieldRef Name=\'Title\' /><FieldRef Name=\'User\' /></ViewFields><QueryOptions /></View>');
             collListItemToBeUpdated = oList.getItems(camlQuery);
             clientContext.load(collListItemToBeUpdated);
             clientContext.executeQueryAsync(getItemsToBeUpdatedSuccess, getItemsToBeUpdatedFailed);
    		 //alert('Done!!!');
        }
        function getItemsToBeUpdatedSuccess()
        {
             ListItemToBeUpdated= collListItemToBeUpdated.getEnumerator();
            var itemArray = [];
            var oList = clientContext.get_web().get_lists().getByTitle('Logins');
    
    		var markup = 'Elements in the list: <br>';
             while(ListItemToBeUpdated.moveNext())
             {
                var oItem = ListItemToBeUpdated.get_current();
    			markup += 'User is: ' + oItem.get_item('User') + '<br>';
             }  
    		 displayDiv.innerHTML = markup;
            clientContext.executeQueryAsync(updateMultipleListItemsSuccess, updateMultipleListItemsFailed);
        }
        function getItemsToBeUpdatedFailed(sender, args)
        {
            alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
        }
    
        function updateMultipleListItemsSuccess() 
        {    
            alert('Items Updated');
        }
    
        function updateMultipleListItemsFailed(sender, args) 
        {    
            alert('Request failed. ' + args.get_message() + '\n' + args.get_stackTrace());
        }
        </script>
    	
    	<input type="button" value="updateMultipleListItems" onclick="getItemsToBeUpdated()" />
    	<div id="displayDiv"></div>

    13 января 2016 г. 8:25

Ответы

Все ответы

  • Надо так:

    markup += 'User is: ' + oItem.get_item('User').get_lookupValue() + '<br>';

    13 января 2016 г. 15:37
  • Большое спасибо!

    Т.к. данный вопрос решен, то я пойду дальше. 

    Далее задача такая: я успешно получил ФИО из ClientPeoplePicker и мне нужно получить его доменный логин и записать его в другое поле этого же списка (столбец "Title").

    В рамках другой задачи (не перебор элементов списка) я логин успешно получаю, но тут немного другая задача.

    Я в цикле перебираю элементы списка, получаю ФИО и тут же нужно получить логин и записать его в другое поле этого же списка (столбец "Title").

    Вот цикл:

    var userProfileProperties;
    		var peopleManager = new SP.UserProfiles.PeopleManager(clientContext);
            while(ListItemToBeUpdated.moveNext())
             {
                var oItem = ListItemToBeUpdated.get_current();
    			var userName = oItem.get_item('User').get_lookupValue();
    			userProfileProperties = peopleManager.getPropertiesFor(userName);
    			var login = userProfileProperties.get_userProfileProperties()['AccountName'].split('\\');
             }

    Загвоздка в том, что скрипт вылетает с ошибкой: "Свойство или поле "UserProfileProperties" не было правильно инициализировано. Это действие не было запрошено, или запрос не был выполнен. Возможно, это действие должно быть запрошено явным образом."
    В рамках другой задачи две последние строки:

    userProfileProperties = peopleManager.getPropertiesFor(userName);
    			var login = userProfileProperties.get_userProfileProperties()['AccountName'].split('\\');

    я выносил в отдельную функцию, которая срабатывала при вызове clientContext.executeQueryAsync. Но я не могу в цикле вызывать clientContext.executeQueryAsync, т.к. эта функция асинхронная и цикл пойдет дальше и не будет ждать результата работы вызванной функции. А мне нужно получается дождаться...

    Может быть сумбурно описал... если у вас будут вопросы - пишите, я более подробно опишу ситуацию.

    14 января 2016 г. 6:34
  • Добрый день,

    может стоит отказаться от циклических операций через JSOM?

    14 января 2016 г. 6:48
  • Добрый день,

    может стоит отказаться от циклических операций через JSOM?

    Я абсолютно не против, но каким образом тогда мне перебрать все элементы списка, получить ФИО с ClientPeoplePicker, затем получить логин и записать его в поле "Title"?

    Вполне возможно, что я не вижу более легкого способа...

    Буду признателен за совет!

    14 января 2016 г. 7:02
  • Изначально задача вроде бы стояла вывести данные на страницу:

    Мне нужно с помощью JS перебрать каждый элемент списка, вытащить значение из поля User и, скажем, вывести на страницу.

    Тогда можно схитрить и у поля указать в свойствах "Показать поле:Учетная запись" , тогда сразу будет возвращаться логин.

    Если же стоит задача обновить поле "Title" у всех элементов списка, то мне кажется не правильно использовать JSOM, может посмотреть в сторону powershell скрипта.


    14 января 2016 г. 13:47