MOSS MVP

I've moved my blog to http://blog.falchionconsulting.com!. Please update your links. This blog is no longer in use--you can find all posts and comments at my new blog; I will no longer be posting to this site and comments have been disabled.

Wednesday, August 29, 2007

Enumerate Available Page Layouts

I created this only because I needed to debug some issues I've been having with Page Layouts - try to convert a sub-site to a site collection and you'll see what I mean :). I doubt this command will be very useful to anyone but seeing as I've got it coded and working there was no sense in pulling the code. The command itself, gl-enumavailablepagelayouts, is very simple - it just outputs the available page layouts by calling GetAvailablePageLayouts() from a PublishingWeb object.

I'm outputting this code in XML as I wanted to display more things than what made sense in a flat file list (I suppose someone could use the output of this command for something else). The core code is shown below:

   1: string url = keyValues["url"];
   2: XmlDocument xmlDoc = new XmlDocument();
   3: xmlDoc.AppendChild(xmlDoc.CreateElement("PageLayouts"));
   4: // I added formatting just to make the xml easier to read when looking at it via the console.
   5: xmlDoc.DocumentElement.AppendChild(xmlDoc.CreateWhitespace("\r\n"));
   6:  
   7: using (SPSite site = new SPSite(url))
   8: using (SPWeb web = site.OpenWeb())
   9: {
  10:     PublishingWeb pubweb = PublishingWeb.GetPublishingWeb(web);
  11:  
  12:     foreach (PageLayout layout in pubweb.GetAvailablePageLayouts())
  13:     {
  14:         xmlDoc.DocumentElement.AppendChild(xmlDoc.CreateWhitespace("\t"));
  15:         XmlElement layoutNode = xmlDoc.CreateElement("PageLayout");
  16:         layoutNode.AppendChild(xmlDoc.CreateWhitespace("\r\n\t\t"));
  17:  
  18:         XmlElement node = xmlDoc.CreateElement("Name");
  19:         node.InnerText = layout.Name;
  20:         layoutNode.AppendChild(node);
  21:         layoutNode.AppendChild(xmlDoc.CreateWhitespace("\r\n\t\t"));
  22:  
  23:         node = xmlDoc.CreateElement("Title");
  24:         node.InnerText = layout.Title;
  25:         layoutNode.AppendChild(node);
  26:         layoutNode.AppendChild(xmlDoc.CreateWhitespace("\r\n\t\t"));
  27:  
  28:         node = xmlDoc.CreateElement("Id");
  29:         node.InnerText = layout.ListItem.ID.ToString();
  30:         layoutNode.AppendChild(node);
  31:         layoutNode.AppendChild(xmlDoc.CreateWhitespace("\r\n\t\t"));
  32:  
  33:         node = xmlDoc.CreateElement("AssociatedContentType");
  34:         if (layout.AssociatedContentType != null)
  35:             node.InnerText = layout.AssociatedContentType.Name;
  36:         layoutNode.AppendChild(node);
  37:         layoutNode.AppendChild(xmlDoc.CreateWhitespace("\r\n\t\t"));
  38:  
  39:         node = xmlDoc.CreateElement("ContentType");
  40:         if (layout.ListItem[FieldId.ContentType] != null)
  41:             node.InnerText = layout.ListItem[FieldId.ContentType].ToString();
  42:         layoutNode.AppendChild(node);
  43:         layoutNode.AppendChild(xmlDoc.CreateWhitespace("\r\n\t\t"));
  44:  
  45:         node = xmlDoc.CreateElement("Hidden");
  46:         if (layout.ListItem[FieldId.Hidden] != null)
  47:             node.InnerText = layout.ListItem[FieldId.Hidden].ToString();
  48:         else
  49:             node.InnerText = "false";
  50:         layoutNode.AppendChild(node);
  51:         layoutNode.AppendChild(xmlDoc.CreateWhitespace("\r\n\t\t"));
  52:  
  53:         node = xmlDoc.CreateElement("FileUrl");
  54:         if (layout.ListItem.File != null)
  55:             node.InnerText = layout.ListItem.File.Url;
  56:         layoutNode.AppendChild(node);
  57:         layoutNode.AppendChild(xmlDoc.CreateWhitespace("\r\n\t"));
  58:  
  59:         xmlDoc.DocumentElement.AppendChild(layoutNode);
  60:         xmlDoc.DocumentElement.AppendChild(xmlDoc.CreateWhitespace("\r\n"));
  61:     }
  62: }
  63: output += xmlDoc.OuterXml;

The syntax of the command can be seen below:

C:\>stsadm -help gl-enumavailablepagelayouts

stsadm -o gl-enumavailablepagelayouts

Returns the list of page layouts available for the given site collection.

Parameters:
        -url <site collection url>

Here’s an example of how to return the avilable page layouts for a publishing site site collection:

stsadm –o gl-enumavailablepagelayouts –url "http://intranet/"

The results of running the above command can be seen below:

   1: <PageLayouts>
   2:         <PageLayout>
   3:                 <Name>PageFromDocLayout.aspx</Name>
   4:                 <Title>Article page with body only</Title>
   5:                 <Id>24</Id>
   6:                 <AssociatedContentType>Article Page</AssociatedContentType>
   7:                 <ContentType>Page Layout</ContentType>
   8:                 <Hidden>false</Hidden>
   9:                 <FileUrl>_catalogs/masterpage/PageFromDocLayout.aspx</FileUrl>
  10:         </PageLayout>
  11:         <PageLayout>
  12:                 <Name>ArticleLeft.aspx</Name>
  13:                 <Title>Article page with image on left</Title>
  14:                 <Id>21</Id>
  15:                 <AssociatedContentType>Article Page</AssociatedContentType>
  16:                 <ContentType>Page Layout</ContentType>
  17:                 <Hidden>false</Hidden>
  18:                 <FileUrl>_catalogs/masterpage/ArticleLeft.aspx</FileUrl>
  19:         </PageLayout>
  20:         <PageLayout>
  21:                 <Name>ArticleRight.aspx</Name>
  22:                 <Title>Article page with image on right</Title>
  23:                 <Id>23</Id>
  24:                 <AssociatedContentType>Article Page</AssociatedContentType>
  25:                 <ContentType>Page Layout</ContentType>
  26:                 <Hidden>false</Hidden>
  27:                 <FileUrl>_catalogs/masterpage/ArticleRight.aspx</FileUrl>
  28:         </PageLayout>
  29:         <PageLayout>
  30:                 <Name>ArticleLinks.aspx</Name>
  31:                 <Title>Article page with summary links</Title>
  32:                 <Id>22</Id>
  33:                 <AssociatedContentType>Article Page</AssociatedContentType>
  34:                 <ContentType>Page Layout</ContentType>
  35:                 <Hidden>false</Hidden>
  36:                 <FileUrl>_catalogs/masterpage/ArticleLinks.aspx</FileUrl>
  37:         </PageLayout>
  38:         <PageLayout>
  39:                 <Name>RedirectPageLayout.aspx</Name>
  40:                 <Title>Redirect Page</Title>
  41:                 <Id>27</Id>
  42:                 <AssociatedContentType>Redirect Page</AssociatedContentType>
  43:                 <ContentType>Page Layout</ContentType>
  44:                 <Hidden>false</Hidden>
  45:                 <FileUrl>_catalogs/masterpage/RedirectPageLayout.aspx</FileUrl>
  46:         </PageLayout>
  47:         <PageLayout>
  48:                 <Name>AdvancedSearchLayout.aspx</Name>
  49:                 <Title>Advanced Search</Title>
  50:                 <Id>87</Id>
  51:                 <AssociatedContentType>Welcome Page</AssociatedContentType>
  52:                 <ContentType>Page Layout</ContentType>
  53:                 <Hidden>false</Hidden>
  54:                 <FileUrl>_catalogs/masterpage/AdvancedSearchLayout.aspx</FileUrl>
  55:         </PageLayout>
  56:         <PageLayout>
  57:                 <Name>BlankWebPartPage.aspx</Name>
  58:                 <Title>Blank Web Part Page</Title>
  59:                 <Id>28</Id>
  60:                 <AssociatedContentType>Welcome Page</AssociatedContentType>
  61:                 <ContentType>Page Layout</ContentType>
  62:                 <Hidden>false</Hidden>
  63:                 <FileUrl>_catalogs/masterpage/BlankWebPartPage.aspx</FileUrl>
  64:         </PageLayout>
  65:         <PageLayout>
  66:                 <Name>PeopleSearchResults.aspx</Name>
  67:                 <Title>People Search Results Page</Title>
  68:                 <Id>90</Id>
  69:                 <AssociatedContentType>Welcome Page</AssociatedContentType>
  70:                 <ContentType>Page Layout</ContentType>
  71:                 <Hidden>false</Hidden>
  72:                 <FileUrl>_catalogs/masterpage/PeopleSearchResults.aspx</FileUrl>
  73:  
  74:         </PageLayout>
  75:         <PageLayout>
  76:                 <Name>SearchMain.aspx</Name>
  77:                 <Title>Search Page</Title>
  78:                 <Id>88</Id>
  79:                 <AssociatedContentType>Welcome Page</AssociatedContentType>
  80:                 <ContentType>Page Layout</ContentType>
  81:                 <Hidden>false</Hidden>
  82:                 <FileUrl>_catalogs/masterpage/SearchMain.aspx</FileUrl>
  83:         </PageLayout>
  84:         <PageLayout>
  85:                 <Name>SearchResults.aspx</Name>
  86:                 <Title>Search Results Page</Title>
  87:                 <Id>89</Id>
  88:                 <AssociatedContentType>Welcome Page</AssociatedContentType>
  89:                 <ContentType>Page Layout</ContentType>
  90:                 <Hidden>false</Hidden>
  91:                 <FileUrl>_catalogs/masterpage/SearchResults.aspx</FileUrl>
  92:         </PageLayout>
  93:         <PageLayout>
  94:                 <Name>TabViewPageLayout.aspx</Name>
  95:                 <Title>Site Directory Home</Title>
  96:                 <Id>85</Id>
  97:                 <AssociatedContentType>Welcome Page</AssociatedContentType>
  98:                 <ContentType>Page Layout</ContentType>
  99:                 <Hidden>false</Hidden>
 100:                 <FileUrl>_catalogs/masterpage/TabViewPageLayout.aspx</FileUrl>
 101:         </PageLayout>
 102:         <PageLayout>
 103:                 <Name>WelcomeLinks.aspx</Name>
 104:                 <Title>Welcome page with summary links</Title>
 105:                 <Id>3</Id>
 106:                 <AssociatedContentType>Welcome Page</AssociatedContentType>
 107:                 <ContentType>Page Layout</ContentType>
 108:                 <Hidden>false</Hidden>
 109:                 <FileUrl>_catalogs/masterpage/WelcomeLinks.aspx</FileUrl>
 110:         </PageLayout>
 111:         <PageLayout>
 112:                 <Name>WelcomeTOC.aspx</Name>
 113:                 <Title>Welcome page with table of contents</Title>
 114:                 <Id>26</Id>
 115:                 <AssociatedContentType>Welcome Page</AssociatedContentType>
 116:                 <ContentType>Page Layout</ContentType>
 117:                 <Hidden>false</Hidden>
 118:                 <FileUrl>_catalogs/masterpage/WelcomeTOC.aspx</FileUrl>
 119:         </PageLayout>
 120:         <PageLayout>
 121:                 <Name>DefaultLayout.aspx</Name>
 122:                 <Title>Welcome page with Web Part zones</Title>
 123:                 <Id>83</Id>
 124:                 <AssociatedContentType>Welcome Page</AssociatedContentType>
 125:                 <ContentType>Page Layout</ContentType>
 126:                 <Hidden>false</Hidden>
 127:                 <FileUrl>_catalogs/masterpage/DefaultLayout.aspx</FileUrl>
 128:         </PageLayout>
 129:         <PageLayout>
 130:                 <Name>WelcomeSplash.aspx</Name>
 131:                 <Title>Welcome splash page</Title>
 132:                 <Id>25</Id>
 133:                 <AssociatedContentType>Welcome Page</AssociatedContentType>
 134:                 <ContentType>Page Layout</ContentType>
 135:                 <Hidden>false</Hidden>
 136:                 <FileUrl>_catalogs/masterpage/WelcomeSplash.aspx</FileUrl>
 137:         </PageLayout>
 138: </PageLayouts>

3 comments:

Cato Antonsen said...

I love your tools because they are real time savers!

Feature request:

I'm trying to automate creation of sites and need to be able to change available page layouts after site is created. Any change of adding this functionality?

Thanks in advance!

Gary Lapointe said...

Available page layouts can be controlled by deleting any page layouts you don't want users to use (you can use gl-deletelistitem for that). To set the page layout you can use gl-fixpublishingpagespagelayouturl.

dunxd said...

Excellent - I was struggling to find a reference that matched up the aspx filenames with the descriptions on the Create Page window. Thanks!