Entender e configurar o modelo de transformação de página de publicação (a partir de junho de 2019)
As páginas de publicação são sempre baseadas em um layout de página e uma página mestra. Essas duas páginas combinadas com campos que contêm dados compõem a página que um usuário vê no navegador. Ao transformar páginas de publicação, é necessário mapear os layouts de página usadas em um modelo de transformação de página de publicação. O componente de transformação de página de publicação terá um mapeamento de layout de página 'padrão' para todos os layouts de página fora da caixa, portanto, se o portal estiver usando esses layouts de página fora da caixa, você será abordado. A realidade é que a maioria dos portais usa layouts de página personalizados (e páginas mestras personalizadas) e, para isso, há a necessidade de mapeamentos de layout de página para esses layouts de página personalizados. Layouts de página personalizados podem ser tratados de duas maneiras:
- A opção preferida é que você forneça um arquivo de mapeamento de layout de página personalizado, isso fornece controle total sobre quais campos são traduzidos para web parts e onde eles residem na página moderna, quais campos se tornam metadados e muito mais.
- Se não houver nenhum mapeamento de layout de página encontrado para a página que você está transformando, geraremos um mapeamento na hora e usaremos isso. A desvantagem dessa abordagem é que todo o conteúdo acabará na mesma seção e coluna da página moderna.
Gerando um arquivo de mapeamento de layout de página
Se você estiver usando layouts de página personalizados, é recomendável usar um arquivo de mapeamento de layout de página personalizado para que você possa obter páginas modernas mais precisas. Felizmente você não precisa criar esses arquivos de layout personalizados, há um suporte à API do .Net e ao PowerShell PnP para gerar um.
Usando o PowerShell
Usando o Export-PnPPageMapping
cmdlet que você pode:
- Exporte o arquivo de mapeamento interno (
-BuiltInPageLayoutMapping
parâmetro): esse arquivo será usado para os layouts de página fora da caixa. Se você especificar um mapeamento personalizado para um layout de página fora da caixa em seu próprio arquivo de mapeamento, esse mapeamento terá preferência sobre o mapeamento OOB - Analise os layouts de página no portal conectado e exporte-os como um arquivo de mapeamento (
-CustomPageLayoutMapping
parâmetro): todos os layouts de página personalizados encontrados são analisados e exportados. Se você também quiser analisar os layouts da página OOB, use o-AnalyzeOOBPageLayouts
parâmetro.
# Connect to your "classic" portal
Connect-PnPOnline -Url https://contoso.sharepoint.com/sites/classicportal -Interactive
# Analyze and export the page layout mapping files
Export-PnPPageMapping -BuiltInPageLayoutMapping -CustomPageLayoutMapping -Folder c:\temp
Usando o .Net
No .Net, você precisa usar a PageLayoutAnalyser
classe para analisar layouts de página. Abaixo, dois snippets mostram como analisar todos os layouts de página ou os layouts de página usados por determinadas páginas de publicação.
string siteUrl = "https://contoso.sharepoint.com/sites/classicportal";
AuthenticationManager am = new AuthenticationManager("<Azure AD client id>", "joe@contoso.onmicrosoft.com", "Pwd as SecureString");
using (var cc = am.GetSharePointOnlineAuthenticatedContextTenant(siteUrl))
{
var analyzer = new PageLayoutAnalyser(cc);
// Analyze all found page layouts
analyzer.AnalyseAll();
analyzer.GenerateMappingFile("c:\\temp", "custompagelayoutmapping.xml");
}
string siteUrl = "https://contoso.sharepoint.com/sites/classicportal";
AuthenticationManager am = new AuthenticationManager("<Azure AD client id>", "joe@contoso.onmicrosoft.com", "Pwd as SecureString");
using (var cc = am.GetSharePointOnlineAuthenticatedContextTenant(siteUrl))
{
var analyzer = new PageLayoutAnalyser(cc);
// Analyze all the unique page layouts for publishing pages starting with an "a"
var pages = cc.Web.GetPagesFromList("Pages", "a");
foreach (var page in pages)
{
analyzer.AnalysePageLayoutFromPublishingPage(page);
}
analyzer.GenerateMappingFile("c:\\temp", "custompagelayoutmapping.xml");
}
O modelo de mapeamento de layout de página explicado
Quando você abre um arquivo de mapeamento de layout de página, os seguintes elementos de nível superior estão presentes:
AddOns: como usuário da transformação de página, você pode ter a necessária para aplicar a lógica personalizada para perceber suas necessidades, por exemplo, você precisa transformar uma determinada propriedade de uma maneira que ela possa funcionar com sua Web Part SPFX personalizada. A estrutura dá suporte a isso permitindo que você adicione seus assemblies com funções... simplesmente defini-los na seção AddOn e, em seguida, referenciar suas funções personalizadas posteriormente prefixando-as com o nome determinado fará com que a transformação da página de publicação use seu código personalizado.
PageLayouts: esse elemento contém informações para cada layout de página que você planeja usar. Para cada layout de página, você encontrará uma definição do cabeçalho, web part, metadados, zonas da Web Part e web parts fixas.
Os próximos capítulos oferecerão mais detalhes.
Definição de PageLayout no modelo de layout de página
Vamos analisar como um mapeamento de layout de página é configurado no modelo de mapeamento de layout de página, que é melhor feito com base em uma definição de exemplo:
<PageLayout Name="MyPageLayout" AlsoAppliesTo="MyOtherPageLayout;MyOtherPageLayout2" AssociatedContentType="CustomPage1" PageLayoutTemplate="AutoDetect" IncludeVerticalColumn="true" PageHeader="Custom">
<SectionEmphasis VerticalColumnEmphasis="Soft">
<Section Row="3" Emphasis="Neutral" />
</SectionEmphasis>
<Header Type="FullWidthImage" Alignment="Left" ShowPublishedDate="true">
<Field Name="PublishingRollupImage;PublishingPageImage" HeaderProperty="ImageServerRelativeUrl" Functions="ToImageUrl({@name})" />
<Field Name="ArticleByLine" HeaderProperty="TopicHeader" Functions=""/>
<Field Name="PublishingContact" HeaderProperty="Authors" Functions="ToAuthors({PublishingContact})"/>
</Header>
<MetaData ShowPageProperties="true" PagePropertiesRow="1" PagePropertiesColumn="4" PagePropertiesOrder="1">
<Field Name="PublishingContactName;PublishingContactEmail" TargetFieldName="MyPageContact" Functions="" />
<Field Name="MyCategory" TargetFieldName="Category" Functions="" ShowInPageProperties="true" />
</MetaData>
<WebParts>
<Field Name="PublishingPageImage" TargetWebPart="SharePointPnP.Modernization.WikiImagePart" Row="1" Column="1" Order="1">
<Property Name="ImageUrl" Type="string" Functions="ToImageUrl({PublishingPageImage})"/>
<Property Name="AlternativeText" Type="string" Functions="ToImageAltText({PublishingPageImage})" />
</Field>
<Field Name="PublishingPageContent" TargetWebPart="SharePointPnP.Modernization.WikiTextPart" Row="1" Column="2" Order="1">
<Property Name="Text" Type="string" Functions="" />
</Field>
</WebParts>
<WebPartZones>
<WebPartZone Row="2" Column="1" Order="1" ZoneId="g_0C7F16935FAC4709915E2D77092A90DE" ZoneIndex="0">
<!-- Optional element, only needed if you want to use custom position of the web parts coming from a web part zone -->
<WebPartZoneLayout>
<WebPartOccurrence Type="Microsoft.SharePoint.WebPartPages.ContentEditorWebPart, Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Row="3" Column="2"/>
<WebPartOccurrence Type="Microsoft.SharePoint.WebPartPages.ContentEditorWebPart, Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Row="3" Column="1" Order="2"/>
<WebPartOccurrence Type="Microsoft.SharePoint.WebPartPages.XsltListViewWebPart, Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Row="3" Column="1" Order="1"/>
</WebPartZoneLayout>
</WebPartZone>
</WebPartZones>
<FixedWebParts>
<WebPart Row="1" Column="2" Order="1" Type="Microsoft.SharePoint.WebPartPages.ContentEditorWebPart, Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">
<Property Name="TITLE" Type="string" Value="Example Embedded Web Content Editor"/>
<Property Name="CONTENT" Type="string" Value="PnP Rocks!"/>
</WebPart>
</FixedWebParts>
</PageLayout>
Observação
É recomendável que você use o esquema pagelayoutmapping.xsd durante a edição desses arquivos. Os arquivos fornecidos à transformação de página serão validados em relação a esse esquema e a transformação falhará quando o arquivo de mapeamento de layout de página fornecido for inválido.
Elemento PageLayout
As seguintes propriedades são usadas no elemento PageLayout:
- Nome: contém o nome do layout da página.
- AlsoAppliesTo: quando esse mapeamento será usado para vários layouts de página, você pode especificar os nomes desses layouts de página adicionais como uma lista delimitada por ponto semi-cólon neste atributo. A propriedade Name será o nome do layout da primeira página, o AlsoAppliesTo contém apenas os adicionais.
- AssociatedContentType: o nome do tipo de conteúdo de página de site moderno que você deseja usar. Deixe isso em branco se quiser usar o tipo de conteúdo da página do site padrão.
- PageLayoutTemplate: o sistema de layout a ser usado... padrões para os
AutoDetect
quais deve funcionar bem em todos os casos, mas opcionalmente você também pode escolher um layout de wiki específico. - IncludeVerticalColumn: elemento opcional para especificar a página de destino criada deve ter uma coluna vertical. Ao usar uma coluna vertical, você direciona a coluna vertical como uma coluna extra, portanto, se você antes de adicionar uma coluna vertical tiver três colunas, agora você terá 4 e, como tal, poderá definir o valor da coluna do conteúdo da página como 4 para colocá-la na coluna vertical.
- PageHeader: controla o tipo de cabeçalho de página que será usado. Padrão para
Custom
como isso permite um cabeçalho agradável, mas você pode alterná-lo paraNone
sem cabeçalho ouDefault
para o cabeçalho de página moderno padrão.
Elemento SectionEmphasis
As seguintes propriedades são usadas no elemento SectionEmphasis opcional:
- VerticalColumnEmphasis: use essa propriedade para definir a ênfase da coluna vertical como None, Neutral, Soft ou Strong
Para cada seção, opcionalmente, você pode especificar uma ênfase de seção por meio do elemento Seção:
- Linha: indica o número da linha desta seção, a primeira seção terá o número 1
- Ênfase: define a ênfase da seção como Nenhum, Neutro, Macio ou Forte
Elemento Header
As seguintes propriedades são usadas no elemento Cabeçalho:
- Tipo: é padrão
FullWidthImage
permitir que o cabeçalho mostre a imagem do cabeçalho em largura total. As opções alternativas sãoColorBlock
,CutInShape
eNoImage
. Observe que esse atributo só é relevante quando o atributo PageHeader foi definido comoCustom
. - Alinhamento: controla como o conteúdo do cabeçalho da página está alinhado. O padrão é
Left
, a opção alternativa éCenter
. - ShowPublishedDate: define se a data da publicação da página é mostrada. O padrão é
true
Para cada campo que você deseja usar no cabeçalho moderno, você precisará adicionar um elemento Field especificando:
- Nome: o nome dos campos na página de publicação clássica. Por exemplo, adicionar
PublishingRollupImage;PublishingPageImage
como valor significará que oPublishingRollupImage
será tomado se ele for preenchido, se não for preenchido, oPublishingPageImage
será julgado. Você pode adicionar quantas substituições precisar - HeaderProperty: o nome da propriedade de cabeçalho a ser definida
- Funções: se definido como vazio, o valor de campo da página de publicação clássica será tomado como está, no entanto, se você especificar uma função aqui, a saída dessa função será usada. Se você especificou vários campos (portanto, usando a opção de substituição de campo), precisará especificar o campo a ser usado na função como
{@name}
Ao construir um cabeçalho de página moderno, há 4 propriedades de cabeçalho de página que você pode preencher com dados provenientes da página de publicação:
- ImageServerRelativeUrl: se o cabeçalho precisar mostrar uma imagem, este campo precisará definir um caminho de imagem relativa do servidor para uma imagem que vive na mesma coleção de sites da página. Por padrão, o campo de página
PublishingRollupImage
de publicação clássica é usado, mas como isso contém uma marca Img, o conteúdo do campo é limpo por meio daToImageUrl
função. - TopicHeader: por padrão, o campo de página
ArticleByLine
de publicação clássico é usado como cabeçalho de tópico para o cabeçalho de página moderno - Autores: a configuração dos autores permite que você mostre o contato principal para esta página no cabeçalho da página. Por padrão, o campo de página
PublishingContact
de publicação clássico é usado, mas como esse é um campo de usuário, o conteúdo do campo é transformado por meio daToAuthors
função. - AlternativeText: não mapeado por padrão, mas você pode adicionar um mapeamento personalizado para preencher a propriedade de texto alternativa de cabeçalho moderno, se desejar
Se você, por exemplo, não quiser definir um cabeçalho de tópico, poderá simplesmente remover ou comentar o respectivo elemento Field.
Opções de imagem cabeçalho de página
O mapeamento padrão usa a imagem definida no PublishingRollupImage
campo como cabeçalho de página, mas opcionalmente você pode escolher outro campo de imagem de publicação ou especificar um valor codificado rígido de uma imagem que vive no site de origem ou no site de destino. O exemplo abaixo mostra um cabeçalho com uma imagem estática:
<Header Type="FullWidthImage" Alignment="Left" ShowPublishedDate="true">
<!-- Note that static values do require specifying them between '' -->
<Field Name="PublishingRollupImage" HeaderProperty="ImageServerRelativeUrl" Functions="StaticString('/sites/classicportal/images/myimage.jpg')" />
<Field Name="ArticleByLine" HeaderProperty="TopicHeader" Functions=""/>
<Field Name="PublishingContact" HeaderProperty="Authors" Functions="ToAuthors({PublishingContact})"/>
</Header>
Elemento MetaData
O elemento metadados define qual dos campos clássicos da página de publicação precisa ser tomado como metadados para a página moderna. Como às vezes, você deseja que os metadados também sejam representados usando a Web Part propriedades da página OOB que você indica isso por meio desses atributos opcionais:
- ShowPageProperties: as propriedades da página da Web part serão adicionadas na página moderna resultante
- PagePropertiesRow: linha que manterá as propriedades da página Web Part
- PagePropertiesColumn: coluna que manterá as propriedades da página Web Part
- PagePropertiesOrder: a ordem da web part de propriedades da página na linha/coluna definida
Para cada campo que você deseja assumir, você precisará adicionar um elemento Field especificando:
- Nome: o nome dos campos na página de publicação clássica. Por exemplo, adicionar
PublishingContactName;PublishingContactEmail
como valor significará que oPublishingContactName
será tomado se ele for preenchido, se não for preenchido, oPublishingContactEmail
será julgado. Você pode adicionar quantas substituições precisar - TargetFieldName: o nome do campo na página moderna de destino
- Funções: se definido como vazio, o valor de campo da página de publicação clássica será tomado como está, no entanto, se você especificar uma função aqui, a saída dessa função será usada. Se você especificou vários campos (portanto, usando a opção de substituição de campo), precisará especificar o campo a ser usado na função como
{@name}
- ShowInPageProperties: se definido como true e se mostrar as propriedades da página, a Web Part foi ativada do que esse campo será mostrado na Web Part de propriedades da página
Observação
- O suporte a funções não está disponível para campos de taxonomia
Elemento WebParts
Cada campo na página de publicação clássica que precisa se tornar um elemento visual na página de destino (como uma Web Part ou texto) deve ser definido na seção Web Parts:
- Nome: o nome do campo na página de publicação clássica.
- TargetWebPart: o tipo da Web Part de destino que visualizará esse campo na página moderna. As web parts de destino com suporte são
SharePointPnP.Modernization.WikiTextPart
,SharePointPnP.Modernization.WikiImagePart
eMicrosoft.SharePoint.Publishing.WebControls.SummaryLinkWebPart, Microsoft.SharePoint.Publishing, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c
. - Linha: a linha em que você deseja colocar a Web Part de destino. Precisa ser 1 ou maior.
- Coluna: a coluna na qual você deseja colocar a Web Part de destino. Precisa ser 1, 2 ou 3.
- Ordem: a ordem da web part de destino na linha/coluna definida.
Dependendo do TargetWebPart escolhido, você precisará fornecer as propriedades da Web Part que contêm os dados necessários durante a transformação. Cada propriedade tem as seguintes propriedades:
- Nome: nome da propriedade. Esses nomes de propriedade precisam corresponder às propriedades usadas no modelo de transformação de página.
- Tipo: tipo da propriedade. Esses tipos de propriedade precisam corresponder às propriedades usadas no modelo de transformação de página.
- Funções: se definido como vazio, o valor da propriedade será o valor do campo na página de publicação clássica de origem. Você pode usar uma função para primeiro transformar o conteúdo do campo ou usar dados de outro campo da página de publicação clássica
Elemento WebPartZones
Se o layout da página contiver zonas de Web Part, elas deverão ser definidas aqui. Isso é necessário para posicionar corretamente as Web Parts transformadas na página moderna. As seguintes propriedades são usadas:
- ZoneId: o nome da zona
- ZoneIndex: o índice da zona (inteiro)
- Linha: a linha em que você deseja colocar as Web Parts hospedadas nessa zona. Precisa ser 1 ou maior.
- Coluna: a coluna em que você deseja colocar as web parts hospedadas nessa zona. Precisa ser 1, 2 ou 3.
- Ordem: ordem na linha/coluna definida para as web parts hospedadas nesta zona
Às vezes, as páginas de publicação têm várias web parts em uma zona da Web Part e você deseja posicionar cada web part de forma diferente na página de destino. Você pode fazer isso usando o elemento Opcional WebPartZoneLayout:
<WebPartZoneLayout>
<WebPartOccurrence Type="Microsoft.SharePoint.WebPartPages.ContentEditorWebPart, Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Row="3" Column="2"/>
<WebPartOccurrence Type="Microsoft.SharePoint.WebPartPages.ContentEditorWebPart, Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Row="3" Column="1" Order="2"/>
<WebPartOccurrence Type="Microsoft.SharePoint.WebPartPages.XsltListViewWebPart, Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Row="3" Column="1" Order="1"/>
</WebPartZoneLayout>
A definição acima terá como resultado que o primeiro ContentEditorWebPart irá para a linha 3, coluna 2. O segundo ContentEditorWebPart será colocado na linha 3, coluna 1 com o pedido 2 e a primeira Web Part XSLTListView terminará na linha 3, coluna 1 com a ordem 1. Você pode definir quantos elementos WebPartOccurrence forem necessários, se não houver uma Web Part correspondente na zona da Web Part, o elemento WebPartOccurrence será ignorado. Se houver uma Web Part na zona da Web Part que não esteja listada como um elemento WebPartOccurrence, essa Web Part obterá suas informações de linha, coluna e pedido do elemento WebPartZone.
Elemento FixedWebParts
Às vezes, os layouts de página contêm web parts "fixas", são web parts que são codificadas em código dentro do layout da página e, portanto, elas estão presentes em todas as páginas que usam o layout da página. Como não há API para detectar essas web parts "fixas", elas precisam ser definidas como parte do modelo de mapeamento de layout de página.
As propriedades a seguir podem ser definidas em uma Web Part "fixa":
- Tipo: tipo da web part fixa. Confira aqui uma lista de tipos possíveis.
- Linha: a linha em que você deseja colocar a Web Part "fixa". Precisa ser 1 ou maior.
- Coluna: a coluna na qual você deseja colocar a web part "fixa". Precisa ser 1, 2 ou 3.
- Ordem: a ordem, relevante se houver várias web parts que você colocou na mesma linha e coluna.
Para cada web part "fixa" você precisa definir as propriedades relevantes. Normalmente, você assumiria essas propriedades conforme elas são definidas no layout da página clássica. Para cada propriedade, os seguintes atributos podem ser definidos:
- Propriedade: Nome da propriedade. Esses nomes de propriedade precisam corresponder às propriedades usadas no modelo de transformação de página.
- Tipo: tipo da propriedade. Esses tipos de propriedade precisam corresponder às propriedades usadas no modelo de transformação de página.
- Valor: o valor que essa propriedade tem. Não se esqueça de codificar o valor XML.
Definição de AddOns no modelo de layout de página
Os complementos permitem inserir sua lógica personalizada no modelo de mapeamento de layout de página seguindo estas duas etapas:
- Criar um assembly personalizado hospedando suas funções personalizadas
- Declare este assembly personalizado nos elementos AddOns
Criar seu assembly de funções/seletores personalizado
Para criar suas próprias funções, você precisará fazer referência ao assembly SharePoint.Modernization.Framework no projeto e criar uma classe que herde a classe SharePointPnP.Modernization.Framework.Functions.FunctionsBase
:
using Microsoft.SharePoint.Client;
using SharePointPnP.Modernization.Framework.Functions;
using System;
namespace Contoso.Modernization
{
public class MyCustomFunctions: FunctionsBase
{
public MyCustomFunctions(ClientContext clientContext) : base(clientContext)
{
}
public string MyListAddServerRelativeUrl(Guid listId)
{
if (listId == Guid.Empty)
{
return "";
}
else
{
var list = this.clientContext.Web.GetListById(listId);
list.EnsureProperties(p => p.RootFolder.ServerRelativeUrl);
return list.RootFolder.ServerRelativeUrl;
}
}
}
}
Declarar seu assembly personalizado
Antes de as funções personalizadas poderem ser usadas, elas precisam ser declaradas no modelo, incluindo uma referência por biblioteca/classe no elemento AddOns:
<AddOn Name="Custom" Type="Contoso.Modernization.MyCustomFunctions" Assembly="Contoso.Modernization.dll" />
ou (observe o caminho qualificado completo)
<AddOn Name="Custom" Type="Contoso.Modernization.MyCustomFunctions" Assembly="c:\transform\Contoso.Modernization.dll" />
Observe que cada declaração tem um nome "Custom" (personalizado) no exemplo acima.
Usar seus seletores/funções personalizados
Agora que o assembly foi definido, você poderá usar as funções e seletores fazendo referência a eles pelo nome, como você pode ver o prefixo "Custom" no exemplo abaixo:
<Property Name="ListId" Type="guid" Functions="{ListServerRelativeUrl} = Custom.MyListAddServerRelativeUrl({ListId})"/>
Perguntas frequentes sobre mapeamento de layout de página
Quero manter as informações de criação da página de origem
Ao usar a abordagem do PowerShell PnP , use o -KeepPageCreationModificationInformation
cmdlet no ConvertTo-PnPPage
cmdlet. Quando você estiver usando a abordagem .Net , defina o KeepPageCreationModificationInformation
parâmetro como true. Usar essa opção fornecerá à página de destino os valores de campo Created, Modified, Author e Editor da página de origem.
Observação
Quando você, como parte da transformação de página, promover a página como notícia ou publicar a página, o campo Editor será definido como a transformação de página em execução da conta
Quero promover as páginas criadas como notícias
A promoção de páginas criadas a partir de um layout de página como páginas de notícias pode ser feita usando o -PostAsNews
parâmetro no -KeepPageCreationModificationInformation
cmdlet (quando você estiver usando a abordagem do PowerShell PnP) ou, alternativamente, definindo o PostAsNews
parâmetro como true (ao usar a abordagem .Net).
Quando você usar a opção PostAsNews
em conjunto com a opção, o KeepPageCreationModificationInformation
FirstPublishedDateField
campo será definido como a data de modificação da página de origem. O FirstPublishedDateField
campo é o valor de data mostrado durante a distribuição de notícias.
Quero inserir texto codificado na página criada
Às vezes, um layout de página contém snippets de texto, que, como eles não estão satisfeitos na página real, não estão sendo transformados. Se esse for o caso, você poderá definir um campo "falso" para mapear, como mostrado abaixo:
<WebParts>
...
<Field Name="ID" TargetWebPart="SharePointPnP.Modernization.WikiTextPart" Row="1" Column="3">
<Property Name="Text" Type="string" Functions="StaticString('<H1>This is some extra text</H1>')" />
</Field>
...
</WebParts>
Observação
O HTML fornecido na função StaticString deve ser codificado XML e deve ser formatado como o HTML da página de origem, pois este HTML ainda será convertido em HTML, que está em conformidade com o editor de texto moderno
Quero prefixar ou sufixo do conteúdo do campo
A abordagem usada no capítulo anterior permite adicionar texto extra em uma página, mas tem como desvantagem que o texto extra será adicionado em sua própria parte de texto. Se você quiser que o texto extra seja integrado ao texto real que está sendo transformado, a abordagem abaixo permitirá que você faça isso. Você pode prefixar e/ou sufixo de conteúdo de campo existente e, opcionalmente, só pode fazer a prefixação/sufixo quando o campo contiver conteúdo. O parâmetro bool no Prefix
, Suffix
e PrefixAndSuffix
as funções define se o prefixamento/sufixo precisa acontecer quando o conteúdo do campo está vazio: 'true' significa aplicar a ação mesmo quando o campo está vazio.
Consulte Funções de Transformação de Página e Seletores para obter mais detalhes sobre as funções abaixo.
<WebParts>
...
<Field Name="PublishingPageContent" TargetWebPart="SharePointPnP.Modernization.WikiTextPart" Row="1" Column="2">
<Property Name="Text" Type="string" Functions="PrefixAndSuffix('<H1>Prefix some extra text</H1>','<H1>Suffix some extra text</H1>',{PublishingPageContent},'false')" />
</Field>
...
<Field Name="PublishingPageContent" TargetWebPart="SharePointPnP.Modernization.WikiTextPart" Row="1" Column="2">
<Property Name="Text" Type="string" Functions="Prefix('<H1>Prefix some extra text</H1>',{PublishingPageContent},'true')" />
</Field>
...
<Field Name="PublishingPageContent" TargetWebPart="SharePointPnP.Modernization.WikiTextPart" Row="1" Column="2">
<Property Name="Text" Type="string" Functions="Suffix('<H1>Suffix some extra text</H1>',{PublishingPageContent},'false')" />
</Field>
...
</WebParts>
Quero preencher um campo de metadados gerenciados com um ou mais termos
Quando você tem um campo de metadados gerenciados nos metadados da página de origem, talvez você queira ter um campo de metadados gerenciados semelhante para a página de destino. Uma transformação de página atualmente tem um recurso de mapeamento de metadados gerenciados que representa um problema. Uma possível solução alternativa é preencher o campo de metadados gerenciados de destino com um termo escolhido ou um conjunto de termos no caso de um campo de metadados gerenciados de vários valores. Isso pode ser feito usando a DefaultTaxonomyFieldValue
função, conforme mostrado no exemplo abaixo:
<MetaData ShowPageProperties="true" PagePropertiesRow="1" PagePropertiesColumn="4" PagePropertiesOrder="1">
...
<Field Name="TaxField2" TargetFieldName="Metadata2" Functions="DefaultTaxonomyFieldValue({TaxField2},'a65537e8-aa27-4b3a-bad6-f0f61f84b9f7|69524923-a5a0-44d1-b5ec-7f7c6d0ec160','true')" ShowInPageProperties="true"/>
...
</MetaData>
Consulte Funções de Transformação de Página e Seletores para obter mais detalhes sobre a DefaultTaxonomyFieldValue
função.
Quero adicionar uma Web Part extra na página criada
Quando você transforma sua página de publicação clássica em uma página moderna, às vezes deseja adicionar uma Web Part moderna adicional na página criada, sem isso há uma versão clássica dessa Web Part na página de publicação clássica. Isso pode ser feito ajustando seus arquivos de mapeamento de layout de webpartmapping.xml e página, conforme mostrado abaixo.
Primeiro defina sua Web Part personalizada em seu arquivo webpartmapping.xmladicionando-o ao WebParts
elemento no arquivo, como mostrado nesta web part do SPFX Olá, Mundo padrão:
<WebParts>
...
<!-- Custom Hello world web part-->
<WebPart Type="SharePointPnP.Demo.HelloWorld" CrossSiteTransformationSupported="true">
<Properties>
<Property Name="HelloWorld" Type="string" />
</Properties>
<Mappings>
<Mapping Default="true" Name="default">
<ClientSideWebPart Type="Custom" ControlId="157b22d0-8006-4ec7-bf4b-ed62383fea76" Order="10" JsonControlData="{"serverProcessedContent":{"htmlStrings":{},"searchablePlainTexts":{},"imageSources":{},"links":{}},"dataVersion":"1.0","properties":{"description":"{HelloWorld}","test":"Multi-line text field","test1":true,"test2":"2","test3":true}}"/>
</Mapping>
</Mappings>
</WebPart>
...
</WebParts>
Se você não estiver como definir corretamente sua Web Part personalizada no elemento ClientSideWebPart acima, siga estas etapas:
- Navegue até o Estrutura do SharePoint Workbench em seu site (por exemplo, https://contoso.sharepoint.com/sites/myportalsite/_layouts/workbench.aspx)
- Adicione sua Web Part personalizada ao workbench e configure-a quando necessário
- Clique no botão "Dados da Web Part" na barra de ferramentas e, em seguida, no botão "Páginas Modernas"
- Copie a estrutura json Do WebPartData e use-a para concluir as próximas etapas:
- O valor da guia ControlId é o valor da propriedade json id
- Exclua as seguintes propriedades json do snippet copiado: id, instanceIf, título e descrição. Neste ponto, você tem o seguinte à esquerda:
{"serverProcessedContent":{"htmlStrings":{},"searchablePlainTexts":{},"imageSources":{},"links":{}},"dataVersion":"1.0","properties":{"description":"HelloWorld from Bert","test":"Multi-line text field","test1":true,"test2":"2","test3":true}}
- Codificar essa cadeia de caracteres XML, isso lhe dará o seguinte:
{"serverProcessedContent":{"htmlStrings":{},"searchablePlainTexts":{},"imageSources":{},"links":{}},"dataVersion":"1.0","properties":{"description":"HelloWorld from Bert","test":"Multi-line text field","test1":true,"test2":"2","test3":true}}
- Se necessário, insira parâmetros de Web Part nesta cadeia de caracteres (por exemplo, {HelloWorld} no exemplo acima):
{"serverProcessedContent":{"htmlStrings":{},"searchablePlainTexts":{},"imageSources":{},"links":{}},"dataVersion":"1.0","properties":{"description":"{HelloWorld}","test":"Multi-line text field","test1":true,"test2":"2","test3":true}}
- Cole a cadeia de caracteres resultante na propriedade JsonControlData
Depois que isso estiver em vigor, você precisará atualizar o mapeamento do layout da página adicionando um campo na seção WebParts que será transformado nesta Web Part personalizada:
<WebParts>
...
<!-- Add an extra web part on the page -->
<Field Name="ID" TargetWebPart="SharePointPnP.Demo.HelloWorld" Row="4" Column="1" Order="1">
<Property Name="HelloWorld" Type="string" Functions="StaticString('PnP Rocks!')"/>
</Field>
...
</WebParts>
Certifique-se de especificar o arquivo dewebpartmapping.xml personalizado como parte da transformação (-WebPartMappingFile
parâmetro de cmdlet do PowerShell, PublishingPageTransformator
construtor ao usar o .Net).
Estou usando muitas partes Add-In e quero transformá-las em web parts SPFX personalizadas
O comportamento padrão da transformação de página é simplesmente assumir a parte de suplemento na página moderna à medida que os suplementos funcionam em páginas modernas. No entanto, se você quiser transformar seletivamente algumas partes de suplemento em web parts personalizadas baseadas em SPFX, solte algumas das partes de suplemento e mantenha as partes de suplemento restantes, então o mapeamento padrão não será suficiente. No exemplo abaixo, você vê que a StaticString
função é usada para alimentar o título de suplemento como valor de seletor de mapeamento. Portanto, com base no título da Web Part, um mapeamento será selecionado. O primeiro suplemento será assumido como suplemento na página moderna, o segundo será transformado em uma alternativa baseada em SPFX personalizada e o último será simplesmente descartado.
Ao mapear para uma Web Part baseada em SPFX personalizada, você pode usar qualquer uma de suas propriedades de parte de suplemento para configurar a alternativa baseada em SPFX (por exemplo, {HelloWorld} no exemplo abaixo), mesmo que essas propriedades não estejam listadas no nó Propriedades no arquivo de mapeamento. Consulte também o capítulo anterior se você quiser saber mais sobre como criar um arquivo de mapeamento personalizado.
<WebPart Type="Microsoft.SharePoint.WebPartPages.ClientWebPart, Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" CrossSiteTransformationSupported="true">
<!-- Note: the add-in can depend on assets that live in the source site, which is not something we can detect -->
<Properties>
<Property Name="FeatureId" Type="guid"/>
<Property Name="ProductWebId" Type="guid"/>
<Property Name="ProductId" Type="guid"/>
</Properties>
<Mappings Selector="StaticString({Title})">
<Mapping Name="My Custom Report" Default="true">
<!-- We keep this web part -->
<ClientSideWebPart Type="ClientWebPart" Order="10" JsonControlData="{}"/>
</Mapping>
<Mapping Name="News Ticker" Default="false">
<!--This web part will be transformed to a custom SPFX based web part -->
<ClientSideWebPart Type="Custom" ControlId="157b22d0-8006-4ec7-bf4b-ed62383fea76" Order="10" JsonControlData="{"serverProcessedContent":{"htmlStrings":{},"searchablePlainTexts":{},"imageSources":{},"links":{}},"dataVersion":"1.0","properties":{"description":"{HelloWorld}","test":"Multi-line text field","test1":true,"test2":"2","test3":true}}"/>
</Mapping>
<Mapping Name="Some other add-in" Default="false">
<!-- This add-in will not be taken over -->
</Mapping>
</Mappings>
</WebPart>
Você pode até mesmo tornar o mapeamento mais preciso tomando as propriedades da parte de suplemento da conta combinando as propriedades da parte de suplemento para gerar uma cadeia de caracteres seletora.
<WebPart Type="Microsoft.SharePoint.WebPartPages.ClientWebPart, Microsoft.SharePoint, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" CrossSiteTransformationSupported="true">
<!-- Note: the add-in can depend on assets that live in the source site, which is not something we can detect -->
<Properties>
<Property Name="FeatureId" Type="guid"/>
<Property Name="ProductWebId" Type="guid"/>
<Property Name="ProductId" Type="guid"/>
</Properties>
<Mappings Selector="ConcatenateWithPipeDelimiter({Title},{effect})">
<Mapping Name="News Ticker|Slide" Default="true">
<ClientSideText Text="***TEST.{Title} web part - Slide mapping chosen! Slider theme = {theme}***" Order="10" />
</Mapping>
<Mapping Name="News Ticker|Scroll" Default="false">
<ClientSideText Text="***TEST.{Title} web part - Scroll mapping chosen! Slider theme = {theme}***" Order="10" />
</Mapping>
</Mappings>
</WebPart>
Posso controlar a imagem de visualização de página
Quando uma página tiver uma imagem de cabeçalho de página, essa imagem também será usada como uma imagem de visualização de página. No entanto, se você quiser controlar a imagem de visualização da página, poderá preencher o BannerImageUrl
campo usando a ToPreviewImageUrl
função ou especificando um valor codificado rígido, conforme mostrado em exemplos abaixo.
<!-- When you do have a publishing image field that will need to be set as preview image -->
<Field Name="PreviewImage" TargetFieldName="BannerImageUrl" Functions="ToPreviewImageUrl({PreviewImage})" />
<!-- When you do have a hard coded preview image already available on the target site. Note that the source field name (PublishingContactEmail in below sample) must exist, although it's not used here -->
<Field Name="PublishingContactEmail" TargetFieldName="BannerImageUrl" Functions="StaticString('https://contoso.sharepoint.com/_layouts/15/getpreview.ashx?guidSite=88eebac1710b464cb6816639340fac55&guidWeb=277fe40db9d24da5bbc6827714184958&guidFile=91bf17fd54e849149a3ad6b4f006304e&ext=jpg')" />
<!-- When you want to refer a static image living in the source site -->
<Field Name="PreviewImage" TargetFieldName="BannerImageUrl" Functions="ToPreviewImageUrl('/sites/classicportal/images/myimage.jpg')" />
Quero usar padrões diferentes para a Web Part do QuickLinks
Quando a transformação resulta em uma web part do QuickLinks moderna (por exemplo, para transformação do SummaryLinkWebPart), a estrutura de transformação de página usará uma configuração base padrão para a Web Part do QuickLinks. Se você, no entanto, quiser uma configuração diferente, poderá fazer isso especificando a propriedade QuickLinksJsonProperties. Embrulhe as propriedades JSON codificadas em uma função StaticString, conforme mostrado neste exemplo:
<WebParts>
...
<Field Name="SummaryLinks" TargetWebPart="Microsoft.SharePoint.Publishing.WebControls.SummaryLinkWebPart, Microsoft.SharePoint.Publishing, Version=16.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" Row="1" Column="2">
<!-- No function specified, means the content of the PublishingPageContent field will be assigned to the value of the first listed web part property -->
<Property Name="SummaryLinkStore" Type="string" />
<Property Name="Title" Type="string" Functions="EmptyString()"/>
<Property Name="QuickLinksJsonProperties" Type="string" Functions="StaticString('{"isMigrated": false, "layoutId": "Button", "shouldShowThumbnail": true, "buttonLayoutOptions": { "showDescription": false, "buttonTreatment": 1, "iconPositionType": 2, "textAlignmentVertical": 1, "textAlignmentHorizontal": 2, "linesOfText": 2}, "listLayoutOptions": { "showDescription": false, "showIcon": true}, "waffleLayoutOptions": { "iconSize": 1, "onlyShowThumbnail": false}, "hideWebPartWhenEmpty": true}')" />
</Field>
...
</WebParts>
O JSON no exemplo mostra todas as opções de configuração possíveis que você pode definir, mas no entanto, você também pode apenas definir as necessárias. Desde que o JSON seja válido e a estrutura seja mantida, sua configuração personalizada de QuickLinks será recolhida.