Поделиться через


Создание элементов управления пользовательским интерфейсом с помощью надстроек SharePoint, размещенных у поставщика

Создание элементов управления UX в надстройках SharePoint, размещенных у поставщика, которые работают и ведут себя как элементы управления пользовательского интерфейса на хост-сайте.

В этой статье описаны три примера, в которых показано, как реализовать элементы управления UX в надстройке, размещенной у поставщика:

  • Core.PeoplePicker — показывает, как добавить элемент управления выбора людей.

  • Core.TaxonomyMenu — показывает, как реализовать локализуемый элемент управления меню таксономии.

  • Core.TaxonomyPicker — показывает, как реализовать элемент управления выбора таксономии.

В этих примерах используется JavaScript и JSOM для взаимодействия с SharePoint, а междоменная библиотека — для обработки вызовов функций из надстройки в домен хост-сайта.

Примечание.

Код, приведенный в этой статье, предоставляется "как есть" без какой-либо явной или подразумеваемой гарантии, включая подразумеваемые гарантии пригодности для какой-либо цели, для продажи или гарантии отсутствия нарушения прав иных правообладателей.

Элемент выбора людей

В примере Core.PeoplePicker показано, как реализовать элемент управления "Выбор людей" в надстройке, размещенной у поставщика. Когда пользователь начинает вводить имя в поле текстового ввода, элемент управления ищет в хранилище профилей пользователя потенциальные совпадения и отображает их в пользовательском интерфейсе. Надстройка отображает настраиваемый и расширяемый элемент управления выбора людей, который выполняется на удаленном узле и запрашивает хранилище профилей пользователей на хост-сайте для сопоставления входных данных пользователя.

элемент управления Люди средства выбора

элемент управления Люди средства выбора

Примечание.

Решение Visual Studio для примера содержит модуль с именем "Dummy", который гарантирует, что при развертывании надстройки создается веб-сайт надстройки. Для междоменных вызовов требуется веб-сайт надстройки.

Папка Scripts проекта Core.PeoplePickerWeb содержит файлы app.js и peoplepickercontrol.js (а также файлы ресурсов средства выбора людей для дополнительной поддержки языков). Файл app.js извлекает контекст клиента с помощью междоменной библиотеки и перехватывает HTML-код в файле Default.aspx в элемент управления выбора людей. Файл Default.aspx содержит <div> теги, реализующие как текстовое поле, так и возможность поиска людей.

<div id="divAdministrators" class="cam-peoplepicker-userlookup ms-fullWidth">
  <span id="spanAdministrators"></span>
<asp:TextBox ID="inputAdministrators" runat="server" CssClass="cam-peoplepicker-edit" Width="70"></asp:TextBox>
</div>
<div id="divAdministratorsSearch" class="cam-peoplepicker-usersearch ms-emphasisBorder"></div>
<asp:HiddenField ID="hdnAdministrators" runat="server" />


Затем файл app.js создает и настраивает элемент управления выбора людей.

//Make a people picker control.
//1. context = SharePoint Client Context object
//2. $('#spanAdministrators') = SPAN that will 'host' the people picker control
//3. $('#inputAdministrators') = INPUT that will be used to capture user input
//4. $('#divAdministratorsSearch') = DIV that will show the 'drop-down' of the picker
//5. $('#hdnAdministrators') = INPUT hidden control that will host resolved users
peoplePicker = new CAMControl.PeoplePicker(context, $('#spanAdministrators'), $('#inputAdministrators'), $('#divAdministratorsSearch'), $('#hdnAdministrators'));
// required to pass the variable name here!
peoplePicker.InstanceName = "peoplePicker";
// Hook up everything.
peoplePicker.Initialize();


Элемент управления "Выбор людей" запрашивает объект ClientPeoplePickerWebServiceInterface в библиотеке JSOM для начала поиска пользователей, имена которых соответствуют введенным символьным строкам.

if (searchText.length >= parent.GetMinimalCharactersBeforeSearching()) {
                            resultDisplay = 'Searching...';
                            if (typeof resultsSearching != 'undefined') {
                                resultDisplay = resultsSearching;
                            }

                  var searchbusy = parent.Format('<div class=\'ms-emphasisBorder\' style=\'width: 400px; padding: 4px; border-left: none; border-bottom: none; border-right: none; cursor: default;\'>{0}</div>', resultDisplay);
                            parent.PeoplePickerDisplay.html(searchbusy);
                            // Display the suggestion box.
                            parent.ShowSelectionBox();

                   var query = new SP.UI.ApplicationPages.ClientPeoplePickerQueryParameters();
                            query.set_allowMultipleEntities(false);
                            query.set_maximumEntitySuggestions(2000);
                            query.set_principalType(parent.GetPrincipalType());
                            query.set_principalSource(15);
                            query.set_queryString(searchText);
                            var searchResult = SP.UI.ApplicationPages.ClientPeoplePickerWebServiceInterface.clientPeoplePickerSearchUser(parent.SharePointContext, query);

                  // Update the global queryID variable so that you can correlate incoming delegate calls.
                            parent._queryID = parent._queryID + 1;
                            var queryIDToPass = parent._queryID;
                            parent._lastQueryID = queryIDToPass;

                  // Make the SharePoint request.
                            parent.SharePointContext.executeQueryAsync(Function.createDelegate(this, function () { parent.QuerySuccess(queryIDToPass, searchResult); }),
                                                Function.createDelegate(this, function () { parent.QueryFailure(queryIDToPass); }));

Элемент управления меню таксономии

В примере Core.TaxonomyMenu показано, как реализовать локализуемый элемент управления меню таксономии, который заполняется из хранилища терминов в надстройке, размещенной у поставщика. Надстройка также настраивает необходимые языки, группы, наборы и термины для заполнения меню и проверяет языковые предпочтения пользователя для задания языка интерфейса.

Надстройка реализует класс TaxonomyHelper (CSOM), который настраивает хранилище терминов и заполняет его терминами. Затем он передает в корневую папку сайта файл JavaScript, в котором отображаются навигационные ссылки.

Надстройка настраивает хранилище терминов на хост-сайте. Он использует объекты и методы CSOM для создания группы терминов и набора, а затем заполняет набор терминов четырьмя терминами.

Экран настройки банка терминов

Экран настройки банка терминов

При нажатии кнопки Настройка хранилища терминов надстройка:

  • Убедитесь, что в хранилище терминов включены необходимые языки (английский, немецкий, французский и шведский).
  • Создает группу терминов и набор терминов и заполняет набор терминов четырьмя новыми терминами.

Следующий код в классе TaxonomyHelper проверяет, включены ли необходимые языки, и если они не включены, они включаются.

var languages = new int[] { 1031, 1033, 1036, 1053 };
            Array.ForEach(languages, l => { 
                if (!termStore.Languages.Contains(l)) 
                    termStore.AddLanguage(l); 
            });

            termStore.CommitAll();
            clientContext.ExecuteQuery();

// Create the term group.
termGroup = termStore.CreateGroup("Taxonomy Navigation", groupId);
                clientContext.Load(termGroup);
                clientContext.ExecuteQuery();

Наконец, следующий код в том же классе TaxonomyHelper создает каждый новый термин вместе с метками для немецкого, французского и шведского языков. Он также задает значение для свойства _Sys_Nav_SimpleLinkUrl , которое эквивалентно свойству Simple Link или Header в средстве управления хранилищем терминов. В этом случае URL-адрес для каждого термина указывает на корневой сайт.

var term = termSet.CreateTerm(termName, 1033, Guid.NewGuid());
term.CreateLabel(termNameGerman, 1031, false);
term.CreateLabel(termNameFrench, 1036, false);
term.CreateLabel(termNameSwedish, 1053, false);
term.SetLocalCustomProperty("_Sys_Nav_SimpleLinkUrl", clientContext.Web.ServerRelativeUrl);

Затем надстройка вставляет файл topnav.js в корневую папку хост-сайта. Этот файл содержит Код JavaScript, который вставляет ссылки из этого набора терминов в навигацию домашней страницы хост-сайта. В пользовательском интерфейсе надстройки также показано, как навигационные ссылки будут отображаться на хост-сайте после отправки надстройкой файла JavaScript.

В следующем коде в файле topnav.js используется JSOM для проверка предпочитаемого языка пользователя.

var targetUser = "i:0#.f|membership|" + _spPageContextInfo.userLoginName;
        context = new SP.ClientContext.get_current();
var peopleManager = new SP.UserProfiles.PeopleManager(context);
var userProperty = peopleManager.getUserProfilePropertyFor(targetUser, "SPS-MUILanguages");

Затем надстройка определяет, соответствует ли предпочтительный язык пользователя одному из включенных языков. Если он находит совпадение, следующий код получает термины и связанные метки для предпочтительного языка пользователя.

while (termEnumerator.moveNext()) {
    var currentTerm = termEnumerator.get_current();
    var label = currentTerm.getDefaultLabel(lcid);

    termItems.push(currentTerm);
    termLabels.push(label);
    context.load(currentTerm);

Наконец, следующий код в файле topnav.js вставляет ссылки, содержащие термины, в верхний элемент навигации хост-сайта.

html += "<ul style='margin-top: 0px; margin-bottom: 0px;'>"
        for (var i in termItems) {
            var term = termItems[i];
            var termLabel = termLabels[i];
            var linkName = termLabel.get_value() != 0 ? termLabel.get_value() : term.get_name();
            var linkUrl = term.get_localCustomProperties()['_Sys_Nav_SimpleLinkUrl'];

            html += "<li style='display: inline;list-style-type: none; padding-right: 20px;'><a href='" + linkUrl + "'>" + linkName + "</a></li>";
        }
        html += "</ul>";

        $('#DeltaTopNavigation').html(html);
        SP.UI.Notify.removeNotification(nid);

Элемент управления "Выбор таксономии"

В примере Core.TaxonomyPicker показано, как реализовать элемент управления выбора таксономии в надстройке, размещенной у поставщика. Когда пользователь начинает вводить термин в поле текстового ввода, элемент управления ищет в хранилище терминов потенциальные совпадения и отображает их в списке под полем ввода.

Надстройка создает HTML-страницу, соответствующую требованиям средства выбора таксономии JSOM, а затем добавляет и настраивает элемент управления. Он использует библиотеку JSOM для запроса хранилища терминов хост-сайта. Средство выбора таксономии взаимодействует со службой управляемых метаданных SharePoint, для которой требуется разрешение на запись в область разрешения таксономии, чтобы она могла читать из закрытых наборов терминов и записывать в открытые наборы терминов. Убедитесь, что в файле AppManifest.xml задано разрешение на запись на соответствующем область.

Папка Scripts проекта Core.TaxonomyPicker содержит файлы app.js и taxonomypickercontrol.js (а также файл ресурсов средства выбора таксономии для дополнительной поддержки языка). Файл app.js извлекает контекст клиента с помощью междоменной библиотеки и перехватывает HTML-код в файле Default.aspx в элемент управления выбора таксономии. Файл Default.aspx содержит скрытое поле, которое реализует как текстовое поле, так и возможность выбора таксономии. Он также добавляет маркированный список для отображения предложений, возвращаемых из хранилища терминов.

<div style="left: 50%; width: 600px; margin-left: -300px; position: absolute;">
            <table>
                <tr>
                    <td class="ms-formlabel" valign="top"><h3 class="ms-standardheader">Keywords Termset:</h3></td>
                    <td class="ms-formbody" valign="top">
                        <div class="ms-core-form-line" style="margin-bottom: 0px;">
                            <asp:HiddenField runat="server" id="taxPickerKeywords" />
                        </div>
                    </td>
                </tr>
            </table>

            <asp:Button runat="server" OnClick="SubmitButton_Click" Text="Submit" />

            <asp:BulletedList runat="server" ID="SelectedValues" DataTextField="Label" />
</div>

Затем файл app.js создает и настраивает элемент управления выбора таксономии.

// Load scripts for calling taxonomy APIs.
                    $.getScript(layoutsRoot + 'init.js',
                        function () {
                            $.getScript(layoutsRoot + 'sp.taxonomy.js',
                                function () {
                                    // Bind the taxonomy picker to the default keywords term set.
                                    $('#taxPickerKeywords').taxpicker({ isMulti: true, allowFillIn: true, useKeywords: true }, context);
                                });
                        });


Элемент управления выбора таксономии использует следующий код для открытия экземпляра TaxonomySession в JSOM для загрузки всех терминов из хранилища терминов.

// Get the taxonomy session by using CSOM.
            var taxSession = SP.Taxonomy.TaxonomySession.getTaxonomySession(spContext);
            //Use the default term store...this could be extended here to support additional term stores.
            var termStore = taxSession.getDefaultSiteCollectionTermStore();

            // Get the term set based on the properties of the term set.
            if (this.Id != null)
                this.RawTermSet = termStore.getTermSet(this.Id); // Get term set by ID.
            else if (this.UseHashtags)
                this.RawTermSet = termStore.get_hashTagsTermSet(); // Get the hashtags term set.
            else if (this.UseKeywords)
                this.RawTermSet = termStore.get_keywordsTermSet(); // Get the keywords term set.

            // Get all terms for the term set and organize them in the async callback.
            this.RawTerms = this.RawTermSet.getAllTerms();
            spContext.load(this.RawTermSet);
            spContext.load(this.RawTerms);
            spContext.executeQueryAsync(Function.createDelegate(this, this.termsLoadedSuccess), Function.createDelegate(this, this.termsLoadedFailed));

Затем элемент управления "Выбор таксономии" ищет потенциальные совпадения из загруженных терминов и при необходимости добавляет новые термины в хранилище терминов.

См. также