博客地址:http://blog.csdn.net/FoxDave
经典SharePoint网站往往都是经典页面如wiki页面、web部件页面,这些页面无法通过现代化接口展示。但是经典网站却可以承载现代化客户端页面,本篇就是介绍如何这样做。在我们最大化使用现代化列表和库的接口、将网站连接到Office 365组之后,把页面转换为现代化客户端页面是我们最后的任务。
SharePoint PnP现代化框架 (Nuget,source 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 = "[email protected]";
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
}
}