Перенос пунктов меню "Изменение блока управления" (ECB) в расширения SharePoint Framework
В течение последних нескольких лет большинство корпоративных решений, созданных на основе Microsoft 365 и SharePoint Online, использовали возможности сайта CustomAction
SharePoint Feature Framework для расширения пользовательского интерфейса страниц. Благодаря "современному" пользовательскому интерфейсу SharePoint большинство из этих настроек больше не доступны. С помощью расширений SharePoint Framework можно предоставить аналогичные функции в "современном" пользовательском интерфейсе.
В этом руководстве описано, как перенести устаревшие "классические" настройки в текущую модель: SharePoint Framework расширения.
Сначала рассмотрим доступные разработчикам варианты для создания расширений SharePoint Framework.
- Настройщик приложений. Расширьте встроенный "современный" пользовательский интерфейс SharePoint, добавив пользовательские элементы HTML и клиентский код в заранее определенные заполнители на "современных" страницах. Дополнительные сведения о настройщиках приложений см. в разделе Создание первого расширения SharePoint Framework (Hello World, часть 1)
- Набор команд. добавляет пользовательские пункты меню ECB и настраиваемые кнопки на панель команд или в представление списка или библиотеки. С этими командами можно связать любое действие на стороне клиента. Дополнительные сведения о наборах команд см. в разделе Создание первого расширения набора команд ListView.
- Настройщик полей. Настройте отображение поля в представлении списка, используя настраиваемые элементы HTML и клиентский код. Дополнительные сведения о настройщиках полей см. в разделе Создание первого расширения настройщика полей.
Наиболее полезное в нашем контексте расширение — набор команд.
Предположим, что у вас есть CustomAction
в SharePoint Online элемент пользовательского меню ECB для документов в библиотеке. Назначение пункта меню ECB — открытие настраиваемой страницы с предоставлением идентификаторов списка и выбранного в текущий момент пункта в строке запроса целевой страницы.
В следующем фрагменте кода вы увидите XML-код, определяющий CustomAction
с помощью SharePoint Feature Framework.
<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<CustomAction
Id="OpenDetailsPageWithItemReference"
Title="Show Details"
Description="Opens a new page with further details about the currently selected item"
Sequence="1001"
RegistrationType="List"
RegistrationId="101"
Location="EditControlBlock">
<UrlAction Url="ShowDetails.aspx?ID={ItemId}&List={ListId}" />
</CustomAction>
</Elements>
Как видите, файл элементов признаков определяет элемент типа CustomAction
для добавления нового элемента в EditControlBlock
расположение (то есть ECB) для любого документа в любой библиотеке (RegistrationType
is List
and RegistrationId
is 101
).
На приведенном ниже рисунке представлены выходные данные вышеописанного дополнительного действия в представлении списка для библиотеки.
Обратите внимание на то, что настраиваемый элемент ECB в SharePoint Feature Framework работает и в "современном" списке. Если не использовать код JavaScript, то дополнительное действие для списков будет работать и в "современных" списках.
Ниже описано, как перенести старое решение в SharePoint Framework.
Создание решения SharePoint Framework
С помощью консоли создайте папку для проекта:
md spfx-ecb-extension
Перейдите в папку проекта:
cd spfx-ecb-extension
Создайте веб-часть решения SharePoint Framework, запустив генератор SharePoint Yeoman.
yo @microsoft/sharepoint
При появлении запроса введите следующие значения (выберите вариант по умолчанию для всех запросов, не перечисленных ниже).
- Как называется ваше решение?: spfx-ecb-extension
- Какие базовые пакеты нужно выбрать как целевые для ваших компонентов? Только SharePoint Online (последняя версия)
- Какой тип клиентского компонента нужно создать?: Расширение
- Какой тип клиентского расширения нужно создать? Набор команд ListView
- Как называется набор команд? CustomECB
На этом этапе Yeoman устанавливает необходимые зависимости и выполняет скаффолдинг файлов и папок решения вместе с расширением CustomFooter. Это может занять несколько минут.
Запустите Visual Studio Code (или другой редактор кода) и начните разработку решения. Чтобы запустить Visual Studio Code, можно выполнить приведенный ниже оператор.
code .
Определение нового элемента ECB
Чтобы воспроизвести такое поведение пункта меню ECB, созданного с помощью SharePoint Feature Framework, нужно реализовать такую же логику с помощью клиентского кода в новом решении SharePoint Framework. Чтобы выполнить эту задачу, сделайте следующее:
Откройте файл ./src/extensions/customEcb/CustomEcbCommandSet.manifest.json. Скопируйте значение свойства
id
и сохраните его в надежном месте, так как оно понадобится вам позже.В том же файле измените массив
items
в нижней части файла, чтобы определить одну команду для набора команд. Вызовите команду ShowDetails, а затем укажите название и тип команды. На приведенном ниже снимке экрана показано, как должен выглядеть файл манифеста.{ "$schema": "https://developer.microsoft.com/json-schemas/spfx/command-set-extension-manifest.schema.json", "id": "5d3bac4c-e040-44ed-ab43-464490d22762", "alias": "CustomEcbCommandSet", "componentType": "Extension", "extensionType": "ListViewCommandSet", "version": "*", "manifestVersion": 2, "requiresCustomScript": false, "items": { "ShowDetails": { "title": { "default": "Show Details" }, "type": "command" } } }
Откройте файл ./src/extensions/customEcb/CustomEcbCommandSet.ts и измените содержимое в соответствии со следующим фрагментом кода:
import { Guid } from '@microsoft/sp-core-library'; import { override } from '@microsoft/decorators'; import { BaseListViewCommandSet, Command, IListViewCommandSetListViewUpdatedParameters, IListViewCommandSetExecuteEventParameters } from '@microsoft/sp-listview-extensibility'; import { Dialog } from '@microsoft/sp-dialog'; import * as strings from 'CustomEcbCommandSetStrings'; export interface ICustomEcbCommandSetProperties { targetUrl: string; } export default class CustomEcbCommandSet extends BaseListViewCommandSet<ICustomEcbCommandSetProperties> { @override public onInit(): Promise<void> { return Promise.resolve(); } @override public onListViewUpdated(event: IListViewCommandSetListViewUpdatedParameters): void { const compareOneCommand: Command = this.tryGetCommand('ShowDetails'); if (compareOneCommand) { // This command should be hidden unless exactly one row is selected. compareOneCommand.visible = event.selectedRows.length === 1; } } @override public onExecute(event: IListViewCommandSetExecuteEventParameters): void { switch (event.itemId) { case 'ShowDetails': const itemId: number = event.selectedRows[0].getValueByName("ID"); const listId: Guid = this.context.pageContext.list.id; window.location.replace(`${this.properties.targetUrl}?ID=${itemId}&List=${listId}`); break; default: throw new Error('Unknown command'); } } }
Обратите внимание на оператор
import
в самом начале файла. Он ссылается на типGuid
, который будет использоваться для хранения идентификатора текущего списка.Интерфейс
ICustomEcbCommandSetProperties
объявляет одно свойство с именемtargetUrl
, которое можно использовать для предоставления URL-адреса целевой страницы, открываемой при выборе пункта меню ECB.Переопределенный метод
onExecute()
выполняет дополнительное действие. Обратите внимание на фрагмент кода, считывающий идентификатор выбранного элемента из аргументаevent
, а также идентификатор исходного списка из объектаpageContext
.Наконец, обратите внимание на переопределение метода
onListViewUpdated()
, который по умолчанию включал командуShowDetails
, только если выбран один элемент.Перенаправление на целевой URL-адрес выполняется с помощью классического кода JavaScript и функции
window.location.replace()
. В методе можно написать любой кодonExecute()
TypeScript. В качестве примера можно использовать платформу диалоговых окон SharePoint Framework, чтобы открыть новое диалоговое окно и взаимодействовать с пользователями.Примечание.
Дополнительные сведения о SharePoint Framework Dialog Framework см. в статье Использование настраиваемых диалоговых окон с расширениями SharePoint Framework.
На приведенном ниже рисунке показан результат.
Тестирование решения в режиме отладки
Вернитесь в окно консоли и выполните приведенную ниже команду, чтобы выполнить сборку и запустить локальный сервер Node.js для размещения решения.
gulp serve --nobrowser
Теперь откройте любой браузер и перейдите к "современной" библиотеке на любом "современном" сайте группы. Добавьте приведенные ниже параметры строки запроса к URL-адресу страницы AllItems.aspx.
?loadSpfx=true&debugManifestsFile=https://localhost:4321/temp/manifests.js&customActions={"6c5b8ee9-43ba-4cdf-a106-04857c8307be":{"location":"ClientSideExtension.ListViewCommandSet.ContextMenu","properties":{"targetUrl":"ShowDetail.aspx"}}}
В приведенной выше строке запроса замените GUID на сохраненное ранее значение
id
из файла CustomEcbCommandSet.manifest.json.Кроме того, существует
location
свойство, которое принимает значение ClientSideExtension.ListViewCommandSet.ContextMenu, которое указывает SPFx на отображение набора команд в качестве элемента меню ECB. Ниже представлены допустимые значения свойстваlocation
.- ClientSideExtension.ListViewCommandSet.ContextMenu: контекстное меню элементов.
- ClientSideExtension.ListViewCommandSet.CommandBar — меню верхнего уровня для набора команд в списке или библиотеке.
- ClientSideExtension.ListViewCommandSet: контекстное меню и панель команд (соответствует
SPUserCustomAction.Location="CommandUI.Ribbon"
).
В строке запроса есть свойство с именем
properties
, которое представляет сериализацию JSON объекта типаICustomEcbCommandSetProperties
, который является типом настраиваемых свойств, запрошенных настраиваемым набором команд для отрисовки.При выполнении запроса страницы появится запрос разрешения на запуск кода с домена localhost (окно с заголовком "Разрешить скрипты отладки?"). Если вы хотите отладить и протестировать решение локально, необходимо разрешить загрузку скриптов отладки.
Примечание.
Либо можно создавать записи конфигурации службы в файле config/serve.json проекта для автоматизации создания параметров строки запроса отладки, как описано в этом документе: Отладка решений SharePoint Framework на современных страницах SharePoint
Упаковка и размещение решения
Если вы довольны результатом, упакуйте решение и разместите его в настоящей инфраструктуре.
Прежде чем собирать пакет, необходимо объявить XML-файл Feature Framework для подготовки расширения.
Обзор элементов Feature Framework
В редакторе кода откройте вложенную папку /sharepoint/assets папки решения и измените файлelements.xml . В приведенном ниже фрагменте кода показано, как должен выглядеть файл.
<?xml version="1.0" encoding="utf-8"?> <Elements xmlns="http://schemas.microsoft.com/sharepoint/"> <CustomAction Title="CustomEcb" RegistrationId="101" RegistrationType="List" Location="ClientSideExtension.ListViewCommandSet.ContextMenu" ClientSideComponentId="6c5b8ee9-43ba-4cdf-a106-04857c8307be" ClientSideComponentProperties="{"targetUrl":"ShowDetails.aspx"}"> </CustomAction> </Elements>
Как видите, он напоминает файл SharePoint Feature Framework из "классической" модели, но использует атрибут
ClientSideComponentId
для обращения кid
настраиваемого расширения, а также атрибутClientSideComponentProperties
для настройки специальных свойств конфигурации, необходимых расширению.Откройте файл ./config/package-solution.json в решении. В файле можно увидеть ссылку на файлelements.xml в
assets
разделе.{ "$schema": "https://developer.microsoft.com/json-schemas/spfx-build/package-solution.schema.json", "solution": { "name": "spfx-ecb-extension-client-side-solution", "id": "b8ff6fdf-16e9-4434-9fdb-eac6c5f948ee", "version": "1.0.2.0", "features": [ { "title": "Custom ECB Menu Item.", "description": "Deploys a custom ECB menu item sample extension", "id": "f30a744c-6f30-4ccc-a428-125a290b5233", "version": "1.0.0.0", "assets": { "elementManifests": [ "elements.xml" ] } } ] }, "paths": { "zippedPackage": "solution/spfx-ecb-extension.sppkg" } }
Пакет, упаковка и развертывание компонента SharePoint Framework
Подготовьте и разверните решение для клиента SharePoint Online:
Выполните приведенную ниже задачу, чтобы создать пакет решения. При этом создается сборка выпуска проекта:
gulp bundle --ship
Выполните приведенную ниже задачу, чтобы упаковать решение. Эта команда создает пакет *.sppkg в папке sharepoint/solution .
gulp package-solution --ship
Добавьте или перетащите новый пакет клиентского решения в каталог приложений в клиенте и нажмите кнопку Развернуть.
Установка и запуск решения
Откройте браузер и перейдите на любой "современный" сайт.
Перейдите на страницу Содержимое сайта и добавьте новое приложение.
Выберите Из вашей организации, чтобы просмотреть решения, доступные в каталоге приложений.
Выберите решение spfx-ecb-extension-client-side-solution и установите его на целевом сайте.
После завершения установки приложения откройте библиотеку Документы на сайте. Выбрав один документ, вы увидите пользовательский пункт меню ECB в действии.
Наслаждайтесь новым настраиваемым пунктом меню ECB, созданным с помощью расширений SharePoint Framework!