SharePoint 2010 Branding: Master page invalida em sites non-publishing

Ao criar-se um novo site non-publishing vai aparecer um erro da master page ("The site master page setting currently applied to this site is invalid. Please select a new master page and apply it") e a master page usada passa a ser a v4.master. Isto apenas acontece se o site raiz for um site publishing. Tambem é graças ao site raiz ser um publishing site que podemos navegar até à pagina de configuração da master page através do url /_layouts/changesitemasterpage.aspx e ver o referido erro.

Esta poderá ser a razão pela qual, por omissão, não é possível criar sites non-publishing dentro de um site publishing... No entanto, as pessoas precisam e querem usar estes site templates, por isso é necessário encontrar uma solução para este problema.

Se estiver a usar as master page standard não vai notar nenhum problema, visto que apesar do erro o site usará a master page v4. O problema surge quando se pretende usar uma master page personalizada, por causa dos problemas de herança o CSS vai ser usado, as master pages não.

Quando a herança é manualmente activada na pagina de configuração da master page o erro desaparece e os estilos do site funcionam correctamente, mas não posso pedir a todos os clientes que reproduzam estes passos manualmente sempre que quiserem usar um site template non-publishing. Por isso criei uma feature que activa as opções e outra que faz o stapling da feature de herança aos site templates que necessito. Esta funcionalidade pode ser reutilizada em todos os meus projectos.

Feature para a herança

Esta feature é activada ao nível (scope) Web. O mais importante da feature está no seu event receiver. O código é claro, as três propriedades de herança que se encontram na página de configuração da master page são activadas.

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
    SPWeb web = (SPWeb)properties.Feature.Parent;
    
    if (!web.IsRootWeb) 
    {
        Hashtable hash = web.AllProperties;
        web.MasterUrl = web.ParentWeb.MasterUrl;
        hash["__InheritsMasterUrl"] = "True";
  
        web.CustomMasterUrl = web.ParentWeb.CustomMasterUrl;
        hash["__InheritsCustomMasterUrl"] = "True";
  
        web.AlternateCssUrl = web.ParentWeb.AlternateCssUrl;
        hash["__InheritsAlternateCssUrl"] = "True";
  
        web.Update();
    }
}

Feature de stapling

Nesta feature associa-se a feature de herança aos site templates desejados. Em baixo encontra-se um exemplo de como activar a feature para o site template Team Site.

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">  
    <FeatureSiteTemplateAssociation Id="00000000-0000-0000-0000-000000000000" TemplateName="STS#0" />
</Elements>
Dércia Silva
Publicado por Dércia Silva em 12 março, 2012

Artigos relacionados