Creating a custom Page Layout in SharePoint 2010 is not too
different than creating a custom Page Layout in SharePoint 2007. However, the
process of creating a SharePoint Solution Package has changed in Visual Studio
2010. This article will walk you through the steps.
First, 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".
For this example, we'll be deploying our solution as a "Farm
solution".
Click "Finish" to wire up your solution to your
particular SharePoint site.
Content Type
First thing to do is to
define a content type.
I will call my Content Type: PicturePageContentType
I will call my Content Type: PicturePageContentType
To
do this:
- Go to: Site Settings –> Site content types
- Next, click Create
- Go to: Site Settings –> Site content types
- Next, click Create
In
the following screen you insert information about the content type.
An import thing to do is let it inherit from the right parent content type.
This needs to be from the group: Publishing Content Types and the parent needs to be Page.
An import thing to do is let it inherit from the right parent content type.
This needs to be from the group: Publishing Content Types and the parent needs to be Page.
So
far nothing special, next I added some non existing columns.
On the following page click Add from new site column.
On the following page click Add from new site column.
Define
in the screen the follows up the columns that you would like to add to the your
content type (Page Layout in the end).
After
you added all the columns you needed you can overview it when you’re looking at
you content type. You’ll see that I added Page Content, this was one from the already existing site columns.
<Field ID="{7169882F-9B0C-4EA8-A096-9822C720D3BB}"
Name="PageContent" DisplayName="PageContent"
Type="HTML" RichText="TRUE"
RichTextMode="FullHtml" />
<Field ID="{ECD16AAB-CEA3-4D0A-9F48-16F59B29C73A}" Name="PageImage" DisplayName="PageImage" Type="Image" RichText="true" />
<Field ID="{ECD16AAB-CEA3-4D0A-9F48-16F59B29C73A}" Name="PageImage" DisplayName="PageImage" Type="Image" RichText="true" />
Note:
If you added a from column to your page you cannot delete it:) If you want to
get rid of it you need to delete the whole content type.
Create the Page Layout
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.
We'll name the Module "masterpage". When you create
the new module, you'll see something like this:
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>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
<Module Name="masterpage" Url="_catalogs/masterpage">
</Module>
</Elements>
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 new item". We're once
again presented with the "Add New Item" dialog. If we were to
select "Application Page" from the SharePoint 2010 menu, we'd get a
code-behind page in addition to our ASPX page, which we don't want. Since
all we want to provision is markup (and not code), we're going to use a
shortcut. Select the "General" node and select "Text File"
from the list of items. However, name the file
"MyCustomPageLayout.aspx".
Add your Page Layout markup into your MyCustomPageLayout.aspx
page. You can do it how I do it, which is to create a new Page Layout in SharePoint
designer,
Now, we need to add the code for
PageLayout1.aspx. It's easier to design for the page first in SharePoint
designer and then cop the code over.
So let's open SharePoint designer
to the site you are developing on. Select "Page Layouts" under
Site Objects.
In the ribbon click "New Page
Layout". In the dialog box select Custom Content Types and
ContentType1. Enter a URL Name and Title
In the Toolbox, under
SharePointControls, Server Controls, Content Fields you should see PageContent
and PageImage. Drag these two fields onto the page in the
"PlaceHolderMain" content area so it looks like this
Once again, the FieldName values
most likely won't match yours since that's a guid generated by the
system. We will make two changes before we copy the code over to our
project. Instead of leaving the guid for the field names we will change
the FieldName to the actual names of the fields -- PageContent and PageImage so
the code will be
<PublishingWebControls:RichImageField
FieldName="PageImage"
runat="server"></PublishingWebControls:RichImageField>
<PublishingWebControls:RichHtmlField
FieldName="PageContent"
runat="server"></PublishingWebControls:RichHtmlField>
This makes it easier when
deploying the solution to dev, staging, and production since the
FieldName guids rarely match when moving to a different SharePoint 2010
environment.
Also, in the Page directive at the
top of the page get rid of the following text: meta:webpartpageexpansion="full"
meta:progid="SharePoint.WebPartPage.Document"
Take the code from the
DesignPageLayout and copy it over to the PageLayout1.aspx page in your
project.
then copying the code to
Visual Studio. However, DO NOT FORGET to remove the attributes in the Page
Directive at the top of the page that SharePoint Designer adds, that look like
this:
meta:webpartpageexpansion="full"
meta:progid="SharePoint.WebPartPage.Document"
If you don't forget to remove those items from the Page
directive, SharePoint will think your pages have been customized, even though
they were deployed via a Feature.
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=";#ContentTypeName;
#0x010100C568DB52D9D0A14D9B2FDCC96666E9F2007948130EC3DB064584E219954237AF3900242457EFB8B24247815D688C526CD44D;#"
/>
</File>
<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=";#ContentTypeName;
#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.
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>
<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:
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.
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".
Important note: This value is in the Properties Window.
I was originally looking for it in the Properties page of the Project (say that
three times fast), and I couldn't find it there.
To deploy our new Solution Package to our Sandboxed Site,
we'll go to the "Build" menu in Visual Studio, and select
"Deploy MyCustomPageLayout".
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.
Refrences:
Links :
No comments:
Post a Comment