Friday 23 July 2010

Uploading a Page Layout for SharePoint 2010 in Visual Studio 2010

Step 1

Open Visual Studio and create a new C# project, using the "Empty SharePoint Project" template, listed under the SharePoint 2010 project templates. For this example, we'll name our project "MyCustomPageLayout".

image

For this example, we'll be deploying our solution as a "Sandboxed solution".

image 

Click "Finish" to wire up your solution to your particular SharePoint site.

Step 2

As with SharePoint 2007, we'll need to provision our Page Layouts to our SharePoint Site Collection Master Page Gallery by using a "Module" element. To do this, right click on the Project and say you want to add a new item. Select "Module" from the list of SharePoint 2010 items.

 image 
We'll name the Module "masterpage". When you create the new module, you'll see something like this:

image

By default, the module contains a sample text file you, so you can see how the Module deploys a file to SharePoint. However, we don't need it, so we'll delete Sample.txt. Next, we need to wire up our module to point to the URL of the Master Page Gallery, so we'll add a "Url" attribute to the Module node. Our Elements.xml file should now contain this XML:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Module Name="masterpage" Url="_catalogs/masterpage">
  </Module>
</Elements>

Step 3

Next, we're going to drop our new Page Layout file into the Module. To do this, we'll right-click on the "masterpage" module in the Visual Studio explorer and select "Add existing item". Browse to your Page Layout and select it.

Step 4

Next, we'll need to update the Module's Elements.xml file to tell SharePoint what to do with the new Page Layout.

The first thing we'll need to do is to update the "Url" property of the File element, by removing the "masterpage/" prefix fromt the Url. (Since we already specified in the Module element that we're deploying the Page Layout to the "masterpages" library, if we left the "masterpages/" part of the Url on the file, SharePoint would try to provision our Page Layout into a library called "masterpages" inside the existing "masterpages" library! We don't want that!) Your new File element should look like this:

<File Path="masterpage\MyCustomPageLayout.aspx" Url="MyCustomPageLayout.aspx" />

Now we need to specify some properties for the Page Layout. These properties are identical to the kind of properties you would specify for a Page Layout in SharePoint 2007:

  • The Title of the file in SharePoint
    In our case, the file itself has a URL of MyCustomPageLayout.aspx, but we can also give the page a Title that will show up when the Page Layout is being selected by the content author, such as "My Custom Page Layout".
  • The Content Type: All Page Layouts must inherit from the "Page Layout" content type (which we add using a Resource file value.)
  • A Publishing Preview Image: The Publishing Preview Image is the image that shows up when a user picks that Page Layout from the Page Layout picker while they're creating a new page. In this example, we'll just point to the Article Page's preview image.
  • The Publishing Associated Content Type: This is the Content Type that the Page Layout is representing, such as an "Article Page", "Welcome Page", etc. The value is a string representing a Lookup value that's a combination of the name of the Content Type and its unique identifier.

Our new File node will look like this:

<File Path="masterpage\MyCustomPageLayout.aspx" Url="MyCustomPageLayout.aspx" Type="GhostableInLibrary">
      <Property Name="Title" Value="My Custom Page Layout" />
      <Property Name="ContentType" Value="$Resources:cmscore,contenttype_pagelayout_name;" />
      <Property Name="PublishingPreviewImage" Value="~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/CustomPageLayout.png, ~SiteCollection/_catalogs/masterpage/$Resources:core,Culture;/Preview Images/CustomPageLayout.png" />
      <Property Name="PublishingAssociatedContentType" Value=";#$Resources:cmscore,contenttype_articlepage_name;;
#0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF3900242457EFB8B24247815D688C526CD44D;#"
/>
</File>

Please note, there's no line break inside the PublishingAssociatedContentType value string; I needed to add a line break so you could see the whole value here

That's it! We've built our Module.

Step 5

Now, we're going to add a module for the Page Layout preview image. Right click on the project and add an additional Module element. Delete the "Sample.txt" file from it, and add your new preview image. (In our case, we'll call it CustomPageLayout.png".) Modify your module file so it looks like this:

<Module Name="Previews Images" Url="_catalogs/masterpage/$Resources:core,Culture;/Preview Images">
  <File Path="Preview Images\CustomPageLayout.png" Url="CustomPageLayout.png" Type="GhostableInLibrary">
      <Property Name="Title" Value="Custom Page Layout Preview Image" />
  </File>
</Module>

You might have noticed that a new Feature got created for you when you created a new Module. Let's rename the Feature itself MyCustomPageLayout in the project tree, like this:

 image

Step 6

We'll open up our MyCustomPageLayout feature, and give it a helpful name and description. Notice that you can graphically see that your Module is a part of this Feature, and you can even see which Module files will be provisioned when the Feature is activated.

image

Step 7>

The last thing we need to do is to make sure our Solution Package is getting configured correctly, to include our new Feature.

By default, the "Empty SharePoint Project" will create a DLL for you. If we just went ahead and deployed our Solution Package with the settings as-is, we would be deploying a DLL to the GAC. However, since our solution doesn't have any code in it, it would be a blank DLL. That's a bit messy, so let's avoid that. Click on the Project in your Solution Explorer, and look in the Properties Window. Change the "Include Assembly in Package" property to "False".

image

Step 8

To deploy our new Solution Package to our Sandboxed Site, we'll go to the "Build" menu in Visual Studio, and select "Deploy MyCustomPageLayout".

 image

This will assemble the Solution Package, deploy the Solution Package to the Sandbox, then activate the Sandboxed feature.

If we browse to our Master Page Library, we'll now see our new Page Layout. Note that, unlike SharePoint 2007, our Page Layout will appear checked out by default, if we haven't modified any of the approval or check-out settings of the out of the Master Page Gallery. We'll need to check it in and approve it for it to be available to us.

How to create a custom Page Layout using SharePoint Designer

Scenario:

You're working with the Enterprise Wiki Site Template and you don't really like where the "Last modified…" information is located (above the content). You want to move that information to the bottom of the page.

Option 1: Modify the "EnterpriseWiki.aspx" Page Layout directly.

Option 2: Create a new Page Layout based on the original one and then modify that one.
image

We'll go ahead and go with Option 2 since we don't want to modify the out of the box template just in case we need it later on.

How To:

Step 1

Navigate to the top level site of the Site Collection > Site Actions > Site Settings > Master pages (Under the Galleries section). Then switch over to the Documents tab in the Ribbon and then click New > Page Layout.

image 

Step 2

Select the Enterprise Wiki Page Content Type to associate with, give it a URL and Title. Note that there's also a link on this page to create a new Content Type. You might be interested in doing this if you wanted to say, add more editing fields or metadata properties to the layout. For example if you wanted to add another Managed Metadata column to capture folksonomy aside from the already included "Wiki Categories" Managed Metadata column.

image

Step 3

SharePoint Designer time! Hover over your newly created Page Layout and "Edit in Microsoft SharePoint Designer."

image

Step 4

Now you can choose to build your page manually by dragging your SharePoint Controls onto the page and laying them out as you'd like…
image


… Or you can copy and paste the OOB Enterprise Wiki Page Layout. I think I'll do that.

Step 5

Alright, so you've copied the contents of the EnterpriseWiki.aspx Page Layout and now it's time for some customizing. I found the control I want to move, so I'll simply do a copy or cut/paste to the new spot.
image


Step 6

Check-in, publish, and approve the new Page Layout.

Step 7

Almost there! Navigate to your publishing site, in this case the Enterprise Wiki Site, then go to Site Actions > Site Settings > Page layouts and site templates (Under Look and Feel). Here you'll be able to make the new Page Layout available for use within the site.

image

Step 8

Go back to your site and edit the page that you'd like to change the layout for. On the Page tab of the Ribbon, click on Page Layout and select your custom Page Layout.

image 
Et voila! You just created a custom Page Layout using SharePoint Designer 2010, re-arranged a SharePoint control and managed to plan for the future by not modifying the out of the box template. That was a really simple example but I hope it helped to give you some ideas on how else you can customize Page Layouts within SharePoint 2010!

image