Change AssociatedContentType for a pagelayout

by Håvard Hebnes 18. July 2009 11:37

If you want to change the associated contenttype for a pagelayout, you can do it like this:

// first you need a reference to a PublihingSite or PublishingWeb
var pubSite = new PublishingSite(site); 

// then we need to get all available pagelayouts
var pageLayouts = pubSite.GetPageLayouts(false); 

// try to find the pagelayout you want to update
var pageLayout = GetPageLayout(pageLayouts, "pagelayout.aspx"); 

// if pagelayout exists, update it (here you need to have a ref to the contenttype)
if (pageLayout != null)
    UpdateAssiciationContentType(contentType, pageLayout); 

/// <summary>
/// Helper method to update associated contenttype for a pagelayout
/// </summary>
/// <param name="newsContentType"></param>
/// <param name="pageLayout"></param>
private static void UpdateAssiciationContentType(SPContentType contentType, PageLayout pageLayout)
{
    // Check out the pagelayout
    pageLayout.ListItem.File.CheckOut(); 

    // set AssociatedContentType
    pageLayout.AssociatedContentType = contentType; 

    pageLayout.Update(); 

    // CheckIn, Publish and approve changes
    pageLayout.ListItem.File.CheckIn("Changed associated contenttype");
    pageLayout.ListItem.File.Publish("");
    pageLayout.ListItem.File.Approve("Change approved");
} 

/// <summary>
/// Get pagelayout by name
/// </summary>
/// <param name="pageLayouts"></param>
/// <param name="name"></param>
/// <returns></returns>
private static PageLayout GetPageLayout(IEnumerable<PageLayout> pageLayouts, string name)
{
    var layouts = from PageLayout layout in pageLayouts
                  where layout.Name == name
                  select layout; 

    return layouts.Count() == 1 ? layouts.ElementAt(0) : null;
}

Create ContentType programatically

by Håvard Hebnes 14. July 2009 21:49

Out of the box SharePoint has a few content types that you can use. If you would like to create your own that inherits from one of these you could do it like this:

// first we reference the content type we want to inherit from
SPContentType pageContentType = web.AvailableContentTypes[ContentTypeId.Page];

// create our new content type
var customContentType = new SPContentType(pageContentType, web.ContentTypes, "Name of content type");
newsContentType.Group = "Custom content type group";

// add content type to the site
web.ContentTypes.Add(customContentType);
web.Update();

To add a custom sitecolumn to our new content type:

// first we need to find our site column
SPField siteColumn = web.AvailableFields.GetFieldByInternalName("InternalSiteColumnName");

// Add column to our new content type
customContentType.FieldLinks.Add(new SPFieldLink(siteColumn));

// Update content type
customContentType.Update();

Trouble running stsadm –o migrateuser

by Håvard Hebnes 8. July 2009 10:26

Yesterday I tried to migrate a user from one domain to another domain running:
stsadm -o migrateuser -oldlogin domain1\user -newlogin domain2\user –ignoresidhistory

This resulted in the following error:
The site with the id c725736f-d942-4475-b3c1-bf1f8c8a1339 could not be found.

To find out which sitecollection this id belongs to I ran the following sql query:
SELECT [Id], [SiteId], [FullUrl]
FROM [WSS_Content_DB].[dbo].[Webs] where SiteId = 'c725736f-d942-4475-b3c1-bf1f8c8a1339'

Result:
Id    SiteId    FullUrl
99642E4D-6C53-49D0-996C-7650C494971C    c725736f-d942-4475-b3c1-bf1f8c8a1339    personal/mysiteuser

After this I ran another test which requires that SP2 is installed on your server:
stsadm -o preupgradecheck

The result from this command can be found here:
C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\LOGS\PreUpgradeCheck-TIMESTAMP.htm

Look for the following section:
Failed : Orphaned site collections

An orphaned site collection is a site collection exists in the content database, but it is not in the configruation site map. Such site collections is not accessible and will not be upgraded properly.The follow orphaned site collections where found:

  • /personal/mysiteuser(Data Source=sqlserver\instance;Initial Catalog=WSS_Content_DB;Integrated Security=True;Enlist=False;Connect Timeout=15)

I then confirmed that this sitecollection was the same as the one that I had problems with.

Solution
To fix this I deleted the sitecollection with this command (Requires SP2 if you use –force or -siteid):
stsadm -o deletesite -siteid c725736f-d942-4475-b3c1-bf1f8c8a1339 -databaseserver SQLSERVER\instance
-databasename wss_content_db -force

After this I migrated the user successfully.

Links:
Deletesite- Stsadm operation

Powered by BlogEngine.NET 1.6.0.0
Theme by Mads Kristensen