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


Вызов модуля подготовки PnP из скрипта на сайте

Примечание.

В этой статье используется последняя версия PnP PowerShell, выпущенная в январе 2021. Поскольку функции Azure работают на PowerShell Core, то вам понадобится использовать эту версию PnP PowerShell в своей функции Azure. Дополнительные сведения об этой версии PnP PowerShell см. в статье https://pnp.github.io/powershell.

Макеты сайтов — удобный способ стандартизации внешнего вида семейств веб-сайтов. Однако они не поддерживают некоторые задачи, например, не позволяют добавить нижний колонтитул на каждую страницу. Вы можете подготовить настройщик заполнителей сайта на основе шаблона, созданного с помощью модуля подготовки PnP. Затем этот настройщик приложений может обновить структуру страницы, например, чтобы зарегистрировать нижний колонтитул на каждой странице.

В этой статье описано, как создать макет сайта, который применяет шаблон подготовки PnP к сайту. Шаблон добавит настройщик заполнителей для отображения нижнего колонтитула.

В этой статье используются следующие компоненты:

  • макет и скрипт сайта;
  • Power Automate
  • хранилище очередей Azure
  • Функции Azure
  • решение SharePoint Framework (SPFx);
  • шаблон сайта PnP;
  • скрипт PnP PowerShell;
  • регистрация приложения в Azure AD.

Эти компоненты используются для активации кода подготовки PnP после создания сайта и применения макета.

Примечание.

Платформа подготовки PnP & подсистема подготовки PnP — это решения с открытым кодом, в которых активное сообщество предоставляет поддержку. SLA для поддержки инструмента с открытым исходным кодом со стороны Майкрософт отсутствует.

Настройка доступа к клиенту на уровне приложения

В этом руководстве мы будем использовать проверку подлинности с идентификатором клиента и сертификатом.

  1. На своем компьютере создайте новый самозаверяющий сертификат с помощью PnP PowerShell:

    Register-PnPAzureADApp -ApplicationName "PnPFlowDemo" -Tenant "contoso.onmicrosoft.com" -DeviceLogin -Out .
    

    Замените contoso.onmicrosoft.com своим клиентом.

    Внимательно следуйте всем указаниям.

    В результате выполнения команды будет зарегистрировано новое приложение Azure AD, будут правильно заданы разрешения, а вам будет нужно дать согласие на использование этого приложения в своем клиенте. Обратите внимание, что для этого вам потребуется доступ с правами записи к Azure AD.

  2. Скопируйте значения, которые возвращает командлет, поскольку позже вам понадобится файл pfx и значение AzureAppId.

Создание хранилища очередей Azure

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

Чтобы настроить хранилище очередей Azure:

  1. Перейдите на портал Azure и войдите.
  2. Выберите пункт + Создать ресурс.
  3. Выберите Хранилище в списке решений Azure Marketplace, а затем выберите Учетная запись хранения — BLOB-объект, файл, таблица, очередь в столбце "Рекомендованные".
  4. Укажите значения в обязательных полях. Выберите Закрепить на панели мониторинга и нажмите Создать. Создание учетной записи хранения может занять несколько минут.
  5. Откройте учетную запись хранения и перейдите в раздел Очереди.
  6. Выберите + Очередь в верхней части экрана.
  7. Введите имя pnpprovisioningqueue или собственное значение, соответствующее стандарту именования. Запишите имя очереди; это значение понадобится вам при создании функции Azure.
  8. Перейдите в раздел Ключи доступа и запишите имя учетной записи хранения и значение ключа key1. Эти значения понадобятся вам при создании потока.

Создание потока

Примечание.

Триггер запроса , используемый ниже, теперь является Премиум и поэтому требует дополнительного лицензирования.

Чтобы поместить сообщение в очередь, необходимо создать поток.

  1. Перейдите на сайт Power Automate, войдите в систему и выберите пункт Создать из пустого в верхней части страницы.

  2. Нажмите Поиск среди сотен соединителей и триггеров, чтобы выбрать триггер.

  3. Выполните поиск по запросу и выберите Запрос — при получении HTTP-запроса [Премиум].

  4. Введите следующий код JSON в теле запроса:

    {
        "type": "object",
        "properties": {
            "webUrl": {
                "type": "string"
            },
            "parameters": {
                "type": "object",
                "properties": {
                    "event": {
                        "type": "string"
                    },
                    "product": {
                        "type": "string"
                    }
                }
            }
        }
    }
    
  5. Нажмите + Новый шаг и выберите Добавить действие.

  6. Выполните поиск по запросу Очереди Azure и выберите Очереди Azure - Поместить сообщение в очередь.

  7. Введите описательное имя подключения.

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

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

  10. Нажмите кнопку Создать.

  11. Выберите имя очереди pnpprovisioningqueue.

  12. В теле запроса вы указали входящий параметр webUrl. Чтобы поместить значение этого поля в очередь, щелкните поле Сообщение и выберите webUrl в средстве выбора динамического контента.

  13. Нажмите Сохранить поток. При этом будет создан URL-адрес, который вы скопируете на следующем шаге.

  14. Выберите первый шаг потока ("При получении HTTP-запроса") и скопируйте URL-адрес.

  15. Сохраните поток.

Поток должен выглядеть следующим образом:

Снимок экрана: поток

Проверка потока

Чтобы проверить поток, необходимо отправить POST-запрос. Это можно сделать через PowerShell, как показано в следующем примере.

$uri = "[the URI you copied in step 14 when creating the flow]"
$body = "{webUrl:'somesiteurl'}"
Invoke-RestMethod -Uri $uri -Method Post -ContentType "application/json" -Body $body

После перехода на главный экран потока вы увидите журнал выполнения. Состояние Succeeded означает, что поток выполнен успешно. Теперь перейдите к новой очереди Azure и нажмите кнопку Обновить. Должна появиться запись о правильном вызове потока.

Подготовка решения SPFx

В этом разделе вы будете использовать существующее решение SPFx Regions Footer Application Customizer. Выполните инструкции из файла Readme в репозитории примера, чтобы создать и подготовить решение.

Создание шаблона подготовки PnP

Скопируйте следующий шаблон подготовки XML в новый файл и сохраните его с именем FlowDemoTemplate.xml.

<?xml version="1.0"?>
<pnp:Provisioning xmlns:pnp="http://schemas.dev.office.com/PnP/2017/05/ProvisioningSchema">
  <pnp:Preferences Generator="OfficeDevPnP.Core, Version=2.20.1711.0, Culture=neutral, PublicKeyToken=3751622786b357c2" />
  <pnp:Templates ID="CONTAINER-FLOWDEMO">
    <pnp:ProvisioningTemplate ID="TEMPLATE-FLOWDEMO" Version="1" BaseSiteTemplate="GROUP#0" Scope="RootSite">
      <pnp:CustomActions>
        <pnp:WebCustomActions>
          <pnp:CustomAction Name="spfx-react-app-customizer" Description="Custom action for Application Customizer" Location="ClientSideExtension.ApplicationCustomizer" Title="spfx-react-app-customizer" Sequence="0" Rights="" RegistrationType="None" ClientSideComponentId="67fd1d01-84e8-4fbf-85bd-4b80768c6080" ClientSideComponentProperties="{&quot;SourceTermSetName&quot;:&quot;Regions&quot;}" />
        </pnp:WebCustomActions>
      </pnp:CustomActions>
    </pnp:ProvisioningTemplate>
  </pnp:Templates>
</pnp:Provisioning>

Примечание.

Шаблон подготовки добавляет в решение дополнительное действие. Идентификатор ClientSideComponentId связан с подготовленным ранее решением Regions Footer Application Customizer. Чтобы запустить эту демонстрацию с собственным решением SPFx, измените значения атрибутов ClientSideComponentId и (необязательно) ClientSideComponentProperties в XML-файле.

Создание функции Azure

  1. Перейдите на портал Azure.

  2. Выберите пункт + Создать ресурс.

  3. Выполните поиск по запросу Приложение-функция и создайте приложение-функцию. В поле Хранение выберите Использовать имеющееся, а затем укажите созданную ранее учетную запись хранения. Задайте другие значения в соответствии с необходимостью, но не забудьте выбрать PowerShell Core в качестве параметра Среда выполнения и выбрать 7.0 в качестве параметра Версия

    Снимок экрана: портал Azure с выделенными полями

  4. После создания перейдите в новое приложение-функцию

  5. Выберите Файлы приложения

    Снимок экрана: приложение-функция с записью файлов приложения, выделенной в меню

  6. В выпадающем меню выберите requirements.psd1 и добавьте новую запись следующим образом

    # This file enables modules to be automatically managed by the Functions service.
    # See https://aka.ms/functionsmanageddependency for additional information.
    #
    @{
        # For latest supported version, go to 'https://www.powershellgallery.com/packages/Az'.
        'Az' = '5.*'
        # For the latest supported version, go to 'https://www.powershellgallery.com/packages/PnP.PowerShell'.
        'PnP.PowerShell' = '1.*'
    }
    

    Сохраните файл. Обратите внимание: если вы не собираетесь использовать командлеты Azure PowerShell, то вы можете удалить эту запись из файла. Файл requirements.psd1 гарантирует, что определенные модули PowerShell будут доступны для всех функций. При первом выполнении функции Azure эти модули будут загружены и станут доступными. Вы также можете использовать подстановочные знаки для версии. Просмотрите для получения дополнительных сведений об этом файле.

  7. Создать новую функцию Azure Функции>Добавить:

    Снимок экрана: портал Azure с выделенным параметром

  8. Создание новой функции триггера хранилища очередей Azure:

    Снимок экрана: портал Azure с выделенной новой функцией триггера очередей

  9. Назовите функцию ApplyPnPProvisioningTemplate.

  10. Введите имя созданной ранее очереди.

  11. Нажмите кнопку Добавить. Откроется новая страница, на которой можно изменить функцию.

Примечание.

Учетная запись хранилища должна находиться в той же области, что и приложение функции Azure, поскольку ресурсы, общающиеся друг с другом, должны быть размещены в одной области. Это требование для Функций Azure.

Завершение создания функции Azure

  1. Перейдите на главный экран приложения-функции, выберите Расширенные инструменты в меню слева и нажмите Перейти. Откроется новая вкладка.

  2. Выберите PowerShell в меню Консоль отладки в верхней части.

  3. Перейдите к site\wwwroot\InvokePnPSiteTemplate (или site\wwwroot[имя функции])

  4. Перетащите ранее созданный файл FlowDemoTemplate.xml на страницу. Это действие отправит файл в папку.

  5. Перетащите ранее сгенерированный файл cert.pfx на страницу. Это действие отправит файл в папку.

  6. Перейдите назад к функции и выберите Код + Тест для изменения функции.

  7. Замените скрипт PowerShell следующим кодом:

    param([string] $QueueItem, $TriggerMetadata)
    
    # Write out the queue message and insertion time to the information log.
    Write-Host "PowerShell queue trigger function processed work item: $QueueItem"
    Write-Host "Queue item insertion time: $($TriggerMetadata.InsertionTime)"
    Connect-PnPOnline -ClientId [insertyourAzureAppIdhere] -CertificatePath D:\home\site\wwwroot\InvokePnPSiteTemplate\cert.pfx -Tenant 'contoso.onmicrosoft.com' -Url $QueueItem
    Write-Output "Connected to site"
    Invoke-PnPSiteTemplate -Path D:\home\site\wwwroot\InvokePnPSiteTemplate\FlowDemoTemplate.xml
    

    Замените [insertyourAppIdHere] значением, которое командлет Register-PnPAzureApp вернул для идентификатора AzureAppId.

    Замените contoso.onmicrosoft.com сведениями своего клиента.

Создание макета сайта

Откройте PowerShell и подключитесь к своему клиенту, используя Connect-PnPOnline.

Connect-PnPOnline -Url https://[yourtenant]-admin.sharepoint.com

Теперь вы можете получить имеющиеся макеты сайта.

Get-PnPSiteDesign

Чтобы создать макет сайта, необходимо создать скрипт сайта. Макет сайта — это контейнер, который ссылается на один или несколько скриптов.

  1. Скопируйте приведенный ниже код JSON в буфер обмена и измените его. Задайте для свойства url значение, скопированное при создании потока. URL-адрес будет выглядеть примерно так, как показано ниже.

    https://prod-27.westus.logic.azure.com:443/workflows/ef7434cf0d704dd48ef5fb6...oke?api-version=2016-06-01&sp=%2Ftriggers%2Fmanual%2Frun

    {
        "$schema": "schema.json",
        "actions": [
        {
                "verb": "triggerFlow",
                "url": "[paste the workflow trigger URL here]",
                "name": "Apply Template",
                "parameters": {
                    "event":"",
                    "product":""
                }
        }
        ],
        "bindata": {},
        "version": 1
    }
    
  2. Еще раз выделите JSON и скопируйте его в буфер обмена.

  3. Откройте консоль PowerShell и введите следующую команду, чтобы скопировать скрипт в переменную и создать скрипт сайта:

    $script = Get-Clipboard -Raw
    Add-PnPSiteScript -Title "Apply PnP Site Template" -Content $script
    Get-PnPSiteScript
    
  4. Появится список из одного или нескольких скриптов сайта, включая только что созданный. Выделите идентификатор созданного скрипта сайта и скопируйте его в буфер обмена.

  5. Создайте макет сайта, используя следующую команду:

    Add-PnPSiteDesign -Title "Site with footer" -SiteScriptIds [Paste the ID of the Site Script here] -WebTemplate TeamSite
    

Проверка результатов

После создания хранилища очередей Azure вы создали идентификатор приложения для доступа на уровне приложения, функцию Azure и макет сайта. Затем вы активировали поток Power Automate из макета сайта.

Чтобы проверить результаты, создайте новый сайт. В клиенте SharePoint выберите SharePoint>Создать сайт>Сайт группы. Новый макет сайта должен появиться в списке доступных макетов. Обратите внимание, что макет сайта применяется после создания сайта. Если поток настроен правильно, он будет активирован. Вы можете проверить работу потока, просмотрев журнал выполнения. Обратите внимание, что нижний колонтитул может появиться не сразу; если вы его не видите, подождите минуту и перезагрузите сайт.