Jun 21, 2011

Branding the Pages That Don't Use Custom Masters

One of my customers had a need. I'd made them a SharePoint 2010 branding solution and all of the sites using either the custom made Master Pages for publishing and team sites or search master looked as it should. They decided to use Office Web Apps in their SharePoint environment and this is where their problem occured. The branding did not reach the office viewer pages.

Since these viewer pages (like quite many other system pages) don't use the master page settings of the sites, I couldn't apply any styles to them via the normal route, adding rules to the branding css file referenced on the master pages. Instead I created a new css stylesheet with only the style rules needed for these viewer pages and set it as alternate stylesheet and that worked.

But I wanted to include this file in my solution and make it as easy for the customer as possible to deploy the solution, I needed to do a couple things.

First, I added a new module in my solution, naming it StyleLibrary. In the solution explorer I created a folder for my custom stylesheet and added the stylesheet in the solution, inside the foder. Checking that the elements.xml file had the correct url's and paths:

Module Name="StyleLibrary" Url="style library"
File Path="StyleLibrary\Customer.AdditionalStyles\customer_additionalstyles.css" Url="Customer.AdditionalStyles/customer_additionalstyles.css" /

I set the solution up to deploy the stylesheet to the style library for use.

Then I fixed the feature receiver to set up the alternate stylesheet when the feature is activated so it doesn't have to be set manually. The code for feature activation with the alternate stylesheet setup only looks like this:

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPSite siteCollection = properties.Feature.Parent as SPSite;
if (siteCollection != null)
{
SPWeb topLevelSite = siteCollection.RootWeb;

// Calculate relative path to site from Web Application root.
string WebAppRelativePath = topLevelSite.ServerRelativeUrl;
if (!WebAppRelativePath.EndsWith("/"))
{
WebAppRelativePath += "/";
}

// Enumerate through each site and apply branding.
foreach (SPWeb site in siteCollection.AllWebs)
{
site.AlternateCssUrl = WebAppRelativePath +
"Style%20Library/Customer.AdditionalStyles/customer_additionalstyles.css";
site.UIVersion = 4;
site.Update();
}
}
}

For the deactivation do the same, except replace the stylesheet path with "" only.

No comments: