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>