將經典頁面轉換成現代客戶端頁面

Justin-Liu發表於2018-08-06

部落格地址:http://blog.csdn.net/FoxDave

經典SharePoint網站往往都是經典頁面如wiki頁面、web部件頁面,這些頁面無法通過現代化介面展示。但是經典網站卻可以承載現代化客戶端頁面,本篇就是介紹如何這樣做。在我們最大化使用現代化列表和庫的介面、將網站連線到Office 365組之後,把頁面轉換為現代化客戶端頁面是我們最後的任務。
SharePoint PnP現代化框架 (Nugetsource code)支援頁面的轉換,我們將在下面進行講解。

重要資訊:SharePoint PnP現代化框架目前是預覽版,如果遇到任何問題請在PnP Tools GitHub issue list提出。

開始之前

預設情況下現代化網站頁面功能在大多數網站是啟用的,但是可能後來被關閉了。如果是這種情況,掃描工具會告訴我們哪些網站關閉了現代化頁面功能。修復這個問題可以使用下面的PnP中示例的PowerShell指令碼:

$minimumVersion = New-Object System.Version("2.24.1803.0")
if (-not (Get-InstalledModule -Name SharePointPnPPowerShellOnline -MinimumVersion $minimumVersion -ErrorAction Ignore))
{
    Install-Module SharePointPnPPowerShellOnline -MinimumVersion $minimumVersion -Scope CurrentUser
}
Import-Module SharePointPnPPowerShellOnline -DisableNameChecking -MinimumVersion $minimumVersion

Connect-PnPOnline -Url "<your web url>"

# Enable modern page feature
Enable-PnPFeature -Identity "B6917CB1-93A0-4B97-A84D-7CF49975D4EC" -Scope Web -Force

頁面轉換解決方案概述

下面的圖片分4個步驟解釋了頁面轉換過程:
1. 在開始的時候我們需要告訴轉換引擎我們想要如何轉換頁面,這是通過提供一個頁面轉換模型操作的。該模型是一個XML檔案,描述了每個經典web部件需要對映成等價的現代化web部件。每個經典web部件包含一個關於相關屬性和對映資訊的列表。
2. 下一步是分析我們想要轉換的頁面:轉換引擎會將頁面分解為web部件的集合 (wiki文字會分解為一個或多個wiki文字web部件)並嘗試檢測使用的佈局。
3. 從步驟2的分析中獲得的資訊對於將web部件對映為現代化等價的內容還有些不足,因此在本步驟中我們將通過呼叫函式來增強我們獲得的資訊:這些函式使用步驟2中獲得的屬性,基於步驟2中輸入的屬性來生成新的屬性。本步驟結束後我們就有了所有需要的資訊去對映web部件,除此之外我們需要呼叫定義選擇器去了解我們需要哪個對映,免得一個經典web部件能夠對映到多個客戶端配置。
4. 最後一個步驟就是建立並配置客戶端頁面了,然後將對映的現代化客戶端web部件新增上去。
這裡寫圖片描述

針對.NET開發者的頁面轉換快速開始

頁面轉換引擎是用.NET構建的,通過nuget包發行。在我們將這個包新增到解決方案時,可以看到兩個額外的檔案被新增到了解決方案中。
這裡寫圖片描述
webpartmapping.xml和webpartmapping_latestfrompackage.xml表示描述如何轉換的轉換模型。我們往往會根據我們的需要對webpartmapping.xml檔案進行調整,例如對我們自己的web部件新增額外的對映。如果在之後我們安裝了更新版本的nuget包,我們的webpartmapping.xml檔案預設不會被覆蓋,但是會覆蓋webpartmapping_latestfrompackage.xml。因此我們可以使用這個檔案來對我們自己的對映跟最新的既有對映進行比較,並進行需要的修改。

我們現在可以使用下面的來自Modernization.PageTransformation sample on GitHub的程式碼來在給定的網站中轉換所有頁面。

string siteUrl = "https://contoso.sharepoint.com/sites/mytestsite";
string userName = "joe@contoso.onmicrosoft.com";
AuthenticationManager am = new AuthenticationManager();
using (var cc = am.GetSharePointOnlineAuthenticatedContextTenant(siteUrl, userName, GetSecureString("Password")))
{
    var pageTransformator = new PageTransformator(cc);
    var pages = cc.Web.GetPages();
    foreach (var page in pages)
    {
        PageTransformationInformation pti = new PageTransformationInformation(page)
        {
            // If target page exists, then overwrite it
            Overwrite = true,
        };

        try
        {
            Console.WriteLine($"Transforming page {page.FieldValues["FileLeafRef"]}");
            pageTransformator.Transform(pti);
        }
        catch(ArgumentException ex)
        {
            Console.WriteLine($"Page {page.FieldValues["FileLeafRef"]} could not be transformed: {ex.Message}");
        }
    }
}

使用PowerShell快速開始頁面轉換

頁面轉換引擎也能在PowerShell中使用。它允許引擎在網站現代化指令碼中進行整合,除了頁面轉換還做一些其他的如安裝解決方案、將網站連線到Office 365組、應用租戶品牌等事情。下面的指令碼顯示瞭如何使用PowerShell呼叫轉換引擎。

function Use-PnPModernizationFramework
{
    param(
        [string] $PathToModernizationBinaries
    )

    begin
    {
    }

    process
    {
        Add-Type -Path "$PathToModernizationBinaries\SharePointPnP.Modernization.Framework.dll"
    }

    end
    {
        return $PathToModernizationBinaries
    }
}

function Invoke-PnPModernizationPageTransformation
{
    param(
        [string] $PathToModernizationBinaries,
        [string] $WebPartMappingFile = $null,
        $Page,
        [bool] $Overwrite = $false,
        [bool] $HandleWikiImagesAndVideos = $true,
        [bool] $ReplaceHomePageWithDefaultHomePage = $false,
        [bool] $TargetPageTakesSourcePageName = $false
    )

    begin
    {

    }

    process
    {
        [bool] $transformOK = $true
        try 
        {            
            # Create the PageTransformationInformation object and populate it
            $pageTransformationInformation = New-Object -TypeName SharePointPnP.Modernization.Framework.Transform.PageTransformationInformation -ArgumentList $Page
            $pageTransformationInformation.Overwrite = $Overwrite
            $pageTransformationInformation.HandleWikiImagesAndVideos = $HandleWikiImagesAndVideos
            $pageTransformationInformation.ReplaceHomePageWithDefaultHomePage = $ReplaceHomePageWithDefaultHomePage
            $pageTransformationInformation.TargetPageTakesSourcePageName = $TargetPageTakesSourcePageName

            # Instantiate the page transformator
            $pageTransformator = $null
            if ($WebPartMappingFile -ne "")
            {
                $pageTransformator = New-Object -TypeName SharePointPnP.Modernization.Framework.Transform.PageTransformator -ArgumentList $Page.Context, "$WebPartMappingFile"
            }
            else 
            {
                $pageTransformator = New-Object -TypeName SharePointPnP.Modernization.Framework.Transform.PageTransformator -ArgumentList $Page.Context, "$PathToModernizationBinaries\webpartmapping.xml"
            }

            # Transform
            $pageTransformator.Transform($pageTransformationInformation)  
        }
        catch [Exception]
        {
            Write-Host $_.Exception.Message -ForegroundColor Red
            $transformOK = $false
        }

    }

    end
    {
        return $transformOK
    }

}

#######################################################
# MAIN section                                        #
#######################################################
# variables
$CAMLQueryByExtension = "<View Scope='Recursive'><Query><Where><Contains><FieldRef Name='File_x0020_Type'/><Value Type='text'>aspx</Value></Contains></Where></Query></View>"
$CAMLQueryByExtensionAndName = "<View Scope='Recursive'><Query><Where><And><Contains><FieldRef Name='File_x0020_Type'/><Value Type='text'>aspx</Value></Contains><BeginsWith><FieldRef Name='FileLeafRef'/><Value Type='text'>{0}</Value></BeginsWith></And></Where></Query></View>"
$binaryFolder = "C:\github\BertPnPTools\Solutions\SharePoint.Modernization\SharePointPnP.Modernization.Framework\bin\Debug"

# Load the SharePoint Modernization framework
Use-PnPModernizationFramework -PathToModernizationBinaries $binaryFolder

# Connect to site
Connect-PnPOnline -Url https://bertonline.sharepoint.com/sites/espctest2 -Verbose

# Get all pages
# [string] $query = $CAMLQueryByExtension

# Get specific aspx page(s)
[string] $query = [string]::Format($CAMLQueryByExtensionAndName, "contentbyquery.aspx")

# Load the pages
$pages = Get-PnPListItem -List SitePages -Query $query 

# Modernize the found pages
foreach($page in $pages)
{
    Write-Host "Modernizing " $page.FieldValues["FileLeafRef"] "..."    
    if (Invoke-PnPModernizationPageTransformation -Page $page -WebPartMappingFile "$binaryFolder\webpartmapping.xml" -Overwrite $true)
    {
        Write-Host "Done!" -ForegroundColor Green
    }
}

相關文章