Showing posts with label WCM. Show all posts
Showing posts with label WCM. Show all posts

Thursday, March 15, 2012

Updated Independent Analysis on Microsoft Productivity Solutions for Prem and Cloud

There have been a lot of updates with Gartner analysis for the Microsoft Productivity stack and other related stacks that I work with. Specifically SharePoint, Office 365, Lync and BI have all been getting great independent reviews. The important take away that I discuss with my customers is that all these top quartile rated technology is delivered on a single, integrated solution stack. They are NOT hodgepodge solutions brought custom integration.
Many of the reports and newest reports can always be accessed from here - http://www.microsoft.com/presspass/itanalyst/default.mspx
SharePoint and Office 365
As you can see we have been great assessments for enterprise content management, enterprise search with FAST for SharePoint 2010, great recognition as portal provider, social computing and business process analysis with Visio Services and SharePoint workflow. Much of this capability is delivered through the Office 365 cloud as well.
SQL Server and BI
As you can see these are very recent reports giving us good reviews in the areas of BI and Data Warehouses. I think the big take away is again total cost of ownership (TCO). We give strong BI solutions and customers do not need to make significant investments to deliver BI through the same SharePoint investments discussed above.
Exchange and Office 365
For email with Exchange either delivered on-premise or through the Office 365 cloud we continue to be evaluated as a leader. This really speaks to our versatility in allowing customers to select the most appropriate place and get the same level of end user experience for business users.
Lync and Office 365
Microsoft is again recognized as a leader in all these types of solutions with Lync which can additionally be delivered through the Office 365 cloud. Our Unified Communications solutions are completely integrated in Office, Outlook and SharePoint allowing users to quickly transition between tasks they are working on making them highly productive. These capabilities are extremely useful for telework or communications between people spread across large geographies.

Saturday, June 25, 2011

SharePoint 2010 Content Deployments

I recently had to spin up very quickly on how to do content deployments. Luckily it was very easy skimming through these articles.


I am glad I read them too. In the “Content deployment overview (SharePoint Server 2010)” there are six considerations and the first gives you specific instruction on how to set up your destination site collection.

Saturday, May 21, 2011

Customizing Content Query Web Parts

Content Query Web Parts

I have to say the game has changed with content query web parts. When trying to work with them in SharePoint 2007 you ended up having to do a ton of work just so a custom field from a content type. Now it really very simple to go in and start working with content query web parts all inside of SharePoint Designer. In this example I am going to:

  • Create a content query web part that is going to show me the most popular articles that are related to an article that I created.
  • I will do some “conditional formatting” to display a confidentiality warning to the user based on the metadata associated to the article.

Approach

As I alluded creating your own xsl for content query web parts is much easier with SharePoint Designer 2010. To access and modify the style sheets select All Files in the Navigation. Then drill down to Style Library >> XSL Style Sheets. There are three style sheets that come out of the box ContentQuery.xsl, Header.xsl and ItemStyle.xsl. The one you will need to work with the most of the time is ItemStyle.xsl.

clip_image002

Next question you may have is how to create new xsl entries for the content query web part? Well I have found the simplest approach is pretty simple.

  • I open up ItemStyle.xsl.
  • I copy ones of the existing xsl templates. Specifically, I copy a full <xsl:template> and add it to the very bottom.
  • Then you need to modify the template tag and replace XXX values <xsl:template name="XXX" match="Row[@Style='XXX']" mode="itemstyle">. It is important that both values are identical. As well, they need to be unique to the xsl file.

That’s it. I am not going to give a full lesson here on all the cool things you can do once you are in there. I leave that up to you as a creative solution developer.

When doing this write up I refined my thoughts a little bit on how to do content query web parts. Specifically I think it is not best to the ItemStyle.xsl directly. Why? Well when you make a change to the ItemStyle.xsl (as I outlined above) you will get a warning saying “Saving your changes will customize this page so that is no longer based on the site definition. Do you want to continue?”

clip_image003

So you make this change you are customizing (unghosting) the ItemStyle.xsl which may not always be the best thing if you are planning for an Upgrade. YES YOU SHOULD BE THINKING ABOUT THE NEXT VERSION OF SHAREPOINT! Look at the forest; not the tree in front of you. Customized pages had to be dealt with when upgrading from SharePoint 2003 to 2007 as well as SharePoint 2007 to 2010. My response officially is it always “depends” but I try to avoid customizing (unghosting) as much as I can.

Knowing this I believe a best practice will be to create your own content query web parts that point to a custom ItemStyle.xsl file. Then your customizations will be managed separately and will not interfere with upgrades to OOB features. The solution is so easy as well; it is a no brainer. Let me walk through it.

  • First I took the existing ItemStyle.xsl in SharePoint Designer and copy pasted it within the same directory. I named it ItemStyle_BrandingBlog.xsl.
  • Next I went into it and stripped out all of the existing <xsl:template> tags and all the content within them. If those need to be used, I will use the OOB content query web part. Then saved it.
  • Next I just added an out of the box content query web part onto a web part page.
  • I made zero changes to the content query web part and exported the web part configuration. I saved the file locally. I named it Content_Query_Branding_Blog.webpart.
  • Next I opened the Content_Query_Branding_Blog.webpart (which is nothing more than a XML configuration file for the content query web part).
  • I modified the ItemXslLink to point to my new ItemStyle_BrandingBlog.xsl. <property name="ItemXslLink" type="string">/Style Library/XSL Style Sheets/ItemStyle_BrandingBlog.xsl</property>
  • I modified the Title to <property name="Title" type="string">Branding Blog Content Query</property>
  • Next I went to Site Settings >> Web Parts Gallery >> and then upload the Content_Query_Branding_Blog.webpart.

Done.

Now you have created your own XSL style sheet and you have created a content query web part configuration that uses that style sheet. We will later automate this as part of a WSP deployment.

Now let’s jump into the configuration of the two web parts that I need to create for my technology article publishing page.

Related Articles Content Query Web Part

As you may recall I need to support the ability show related technology articles. So I want to query for all articles that are related to the one being viewed.

Step 1 – Create the XSL for Content Query Web Part

The first thing I need to do is create a view of data that will show the following:

  • The title of the article
  • The rating of the article
  • The last modified date
  • The first 300 characters from the article

To accomplish I wrote the following xsl in the ItemStyle_BrandingBlog.xsl that I created in the previous step. I did all of this in SharePoint Designer 2010.

<xsl:stylesheet 
version="1.0"
exclude-result-prefixes="x d xsl msxsl cmswrt"
xmlns:x="http://www.w3.org/2001/XMLSchema"
xmlns:d="http://schemas.microsoft.com/sharepoint/dsp"
xmlns:cmswrt="http://schemas.microsoft.com/WebParts/v3/Publishing/runtime"
xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
<xsl:param name="ItemsHaveStreams">
<xsl:value-of select="'False'" />
</xsl:param>
<xsl:variable name="OnClickTargetAttribute" select="string('javascript:this.target=&quot;_blank&quot;')" />
<xsl:variable name="ImageWidth" />
<xsl:variable name="ImageHeight" />
<xsl:template name="TitleDateAndRatings" match="Row[@Style='TitleDateAndRatings']" mode="itemstyle">
<xsl:variable name="SafeLinkUrl">
<xsl:call-template name="OuterTemplate.GetSafeLink">
<xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="DisplayTitle">
<xsl:call-template name="OuterTemplate.GetTitle">
<xsl:with-param name="Title" select="@Title"/>
<xsl:with-param name="UrlColumnName" select="'LinkUrl'"/>
</xsl:call-template>
</xsl:variable>
<div>
<xsl:call-template name="OuterTemplate.CallPresenceStatusIconTemplate"/>
<table>
<tr>
<td width="500px" colspan="3">
<hr />
</td>
</tr>
<tr>
<td width="300px">
<a href="{$SafeLinkUrl}" title="" >
<xsl:if test="$ItemsHaveStreams = 'True'">
<xsl:attribute name="onclick">
<xsl:value-of select="@OnClickForWebRendering"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$ItemsHaveStreams != 'True' and @OpenInNewWindow = 'True'">
<xsl:attribute name="onclick">
<xsl:value-of disable-output-escaping="yes" select="$OnClickTargetAttribute"/>
</xsl:attribute>
</xsl:if>
<xsl:value-of select="$DisplayTitle"/>
</a>
</td>
<td nowrap="nowrap" width="100px">
<xsl:if test="@Ratings &gt;= 4.75">
<span>
<a class="ms-currentRating"><img src="/_layouts/Images/Ratings.png" class="ms-rating_5" alt="Current average rating is 5 stars." /></a>
</span>
</xsl:if>
<xsl:if test="@Ratings &gt;= 4.25 and @Ratings &lt; 4.75">
<span>
<a class="ms-currentRating"><img src="/_layouts/Images/Ratings.png" class="ms-rating_4_5" alt="Current average rating is 4.5 stars." /></a>
</span>
</xsl:if>
<xsl:if test="@Ratings &gt;= 3.75 and @Ratings &lt; 4.25">
<span>
<a class="ms-currentRating"><img src="/_layouts/Images/Ratings.png" class="ms-rating_4" alt="Current average rating is 4 stars." /></a>
</span>
</xsl:if>
<xsl:if test="@Ratings &gt;= 3.25 and @Ratings &lt; 3.75">
<span>
<a class="ms-currentRating"><img src="/_layouts/Images/Ratings.png" class="ms-rating_3_5" alt="Current average rating is 3.5 stars." /></a>
</span>
</xsl:if>
<xsl:if test="@Ratings &gt;= 2.75 and @Ratings &lt; 3.25">
<span>
<a class="ms-currentRating"><img src="/_layouts/Images/Ratings.png" class="ms-rating_3" alt="Current average rating is 3 stars." /></a>
</span>
</xsl:if>
<xsl:if test="@Ratings &gt;= 2.25 and @Ratings &lt; 2.75">
<span>
<a class="ms-currentRating"><img src="/_layouts/Images/Ratings.png" class="ms-rating_2_5" alt="Current average rating is 2.5 stars." /></a>
</span>
</xsl:if>
<xsl:if test="@Ratings &gt;= 1.75 and @Ratings &lt; 2.25">
<span>
<a class="ms-currentRating"><img src="/_layouts/Images/Ratings.png" class="ms-rating_2" alt="Current average rating is 2 stars." /></a>
</span>
</xsl:if>
<xsl:if test="@Ratings &gt;= 1.25 and @Ratings &lt; 1.75">
<span>
<a class="ms-currentRating"><img src="/_layouts/Images/Ratings.png" class="ms-rating_1_5" alt="Current average rating is 1.5 stars." /></a>
</span>
</xsl:if>
<xsl:if test="@Ratings &lt; 1.25">
<span>
<a class="ms-currentRating"><img src="/_layouts/Images/Ratings.png" class="ms-rating_1" alt="Current average rating is 1 star." /></a>
</span>
</xsl:if>
</td>
<td nowrap="nowrap" width="100px">
<xsl:value-of select="ddwrt:FormatDateTime(string(@Date), 1033, 'M/d/yyy h:mm tt')" />
</td>
</tr>
<tr>
<td colspan="3" width="500px">
<xsl:value-of select="substring(@Description, 1, 300)" disable-output-escaping="yes" />...
</td>
</tr>
</table>
</div>
</xsl:template>
</xsl:stylesheet>


Let me discuss several of things I did to accomplishing this:




  • First I created a little HTML table that will control the format of the data. Then I started to add in fields.


  • The link title is printed here - <xsl:value-of select="$DisplayTitle"/> I simply took an example from the out of the box ItemStyle.xsl.


  • Next I needed to print the star ratings. I would have never figured this out until I found this article by accident - blog. This smart person showed how to do it and I just had to make a few minor changes for myself. Basically it looks at the rating value tied to the page rating. Then using styles it will print the appropriate star image.


  • Next I needed to print the last modified date. Here is the code that accomplished that <xsl:value-of select="ddwrt:FormatDateTime(string(@Date), 1033, 'M/d/yyy h:mm tt')" />. One thing to note is I had to add this namespace to the main xsl tag xmlns:ddwrt=http://schemas.microsoft.com/WebParts/v2/DataView/runtime. If you forget to do this, you will get errors.


  • Finally print the description I used the following line of code - <xsl:value-of select="substring(@Description, 1, 300)" disable-output-escaping="yes" />. In it I only print the first 300 characters. Plus I using the disable-output-escaping attributed to remove the embedded HTML in the article.



Step 2 – Test It



I saved my work and the next thing I did was test it to make sure the formatting looked good. To accomplish this I just went to a web part page. Here is a view of it with some test data in there. You can see I am getting the article title, start rating, a nicely formatted date and the article content. Now I just need to configure this into my Page Layout.



clip_image002[5]



Step 3 – Add and Configure the Content Query Web Part to the Page Layout



The last step is to configure this web part into the page layout. When I do this, now every page provisioned using this layout will have this web part pre-configured. What I did was:




  • Go back to my page layout.


  • Added a new row for Related Articles.


  • Open up the split view.


  • Then I will select Insert tab on the ribbon.


  • Then select the web part I deployed in the previous section.



clip_image004



Next I right click on the web part and select Web Part Properties which will open the same web part configuration panel I would use in the SharePoint UI.



clip_image006



I make the following configurations to the content query web part.



First I set up the query, pretty basics stuff. I set it to go against the pages library and only retrieve the Technology Article type.



clip_image007



Next I set up the Filters for the query. I only want to get articles that match on both technology and keywords. I also want to make sure to not get the same article.



For both the Technology and Enterprise Keywords I use [PageFieldValue:XXX] to retrieve metadata values from the article as part of the query. I will also note that if you have values in the URL querystring, you can use [PageQueryString:XXX] to access those values to use in the Filters.



To ensure I do not have the article itself appear in the query, I exclude it by the Title of the article which is a unique value for me.



clip_image008



Next I set it up to sort by star ratings.



Then in the Styles section I select TitleAndDateRatings style I created in ItemStyle_BrandingBlog.xsl.



clip_image009



The last part of the configuration is to set up the fields in the Technology Article to feed into the TitleAndDateRatings style.



clip_image010



I also set the Chrome to None to hide the web part header.



Now that is done I have the below results. I provisioned a Technology Article page, set the Technology and Keywords value. When I saved the article, the content query web part I pre-configured into the page layout will now be visible.



clip_image012



One important note it is not possible to change the configuration of the web part in the provisioned web page (like above). So if I went to edit the web page, I would not have the ability to edit the web part. If you want to support changing the web part configuration after page provisioning you will need to add a web part zone into the page layout and then put the web part into that zone. This can all be done in SharePoint Designer.



Just remember if you put a web part zone into the page layout, this will allow users to put in web parts in an ad-hoc fashion. So there is a real trade-off you have to consider. In my case, I actually used a web part zone at first, I trained users, and they still did not listen and started to add their own web parts. I ended up removing all the web part zones from the page layouts. This becomes pretty important in a real controlled publishing scenario.



Another note you should be aware of is if you make a change to the web part configuration in the page layout those configurations will not be pushed into provisioned pages either. This behavior is different that adding new fields or changing the presentation of the page layout which will change provisioned pages. This behavior makes sense and is expected; though all is not lost. If you really need to make a web part configuration change to all the provisioned pages, you can write some code to iterate through the pages and web parts to make changes. That is beyond the scope of my article but the SharePoint API supports it.



Confidentiality Web Part



The next thing I wanted to accomplish is create some sort of simple solution where I could visually indicate to the user that the data on the article is confidential. The environment I am deploying to does not have Sandbox Solutions enabled so writing a web part was not an option. To accomplish this, I was able to write a content query web part style.



Please note that this solution is not really secure. Page level security can be implemented but still users can accidently copy and paste content and email the information by accident. Web pages cannot be locked down with Information Rights management either. So a user can still copy and paste the information and email. The only real way to ensure this information is not sent out is to create a document library, configure information rights management in that library, load content into that library and then reference a link to the locked down content from the publishing page.



Step 1 – Create the XSL for Content Query Web Part



I followed the same steps and created a template in ItemStyle_BrandingBlog.xsl. The logic of this one is pretty simple. I basically have an If statement that checks to see what level of confidentiality the article has and then show visual indicator.




    <xsl:template name="Confidential" match="Row[@Style='Confidential']" mode="itemstyle">
<div>
<table width="100%" height="50px">
<tr>
<xsl:if test="@Conf = 'Confidential'">
<td style="background-color:red; color:black; text-align:center; font-size:large"><xsl:value-of select="@Conf" /> </td>
</xsl:if>
<xsl:if test="@Conf = 'NDA'">
<td style="background-color:yellow; color:black; text-align:center; font-size:large"><xsl:value-of select="@Conf" /></td>
</xsl:if>
</tr>
</table>
</div>
</xsl:template>


Step 2 – Test It



Then I test it with the web page I already configured.



Step 3 – Add and Configure the Content Query Web Part to the Page Layout



Then just like the last time, I opened the page layout in SharePoint designer and inserted the web part into the top of the page. I right clicked the web part and selected web part properties.



I set it query for the Technology Article type.



clip_image001



For the parameters I set it to only find articles based on the unique title.



clip_image002



For the presentation I set it to use the new Confidential style.



clip_image003[5]



I then provisioned a page, set the confidentiality and I had the following result. As you can see a big red banner is displayed to the user indicating that the content on this page should be created as confidential.



clip_image005



Conclusions



This pretty much concludes my exploration into creating custom content query web parts with SharePoint Designer 2010. I do recognize that if the queries for data become more complex, I recommend creating custom web parts and use LINQ to SharePoint to get out the data and present it. However I really like this solution because I was able to accomplish this without having to write a ton of complex code.



Next



We are going to explore how to redeploy this entire solution using Visual Studio.

Creating a Page Layout

Page Layouts

The next thing you will need to do as part of any major web content management project is create Page Layouts. Again, I am not going to provide a robust definition on what a Page Layout is because it is pretty well defined in books and on MSDN. What I am going to do in this example is create a simple content type and then create a page layout for the content type.

In this example I am going to create a Technology Article Page which will inherit from the out of the box Article Page. I will am going to add a couple custom fields to this content type like Confidentiality and Technology. I will later use these to do some fun stuff with content query web parts.

1 – Create a Content Type

Like I said the first thing I am going to do is create a content type based on the Article Page content type and add some of my own fields. For both Confidentiality and Technology, I am going to use the managed metadata service and term storm.

So first I created some terms:

clip_image001[4]

Then I created my new Technology Article content type which inherits from Article Page. Below is a screenshot of the new content type.

clip_image003[4]

Then you I created Confidentiality and Technology columns using the managed metadata. I also added the Enterprise Keywords column which allows for folksonomy tagging to be applied to my article. As well I have added Rating (0-5). Here is a screenshot of all the columns.

clip_image005[4]

2 – Create Page Layout

To create a new Page Layout:

  • Open SharePoint Designer 2010 and go to Page Layouts.
  • In the ribbon select new Page Layout.
  • Select the Technology Article content type. I will subsequently be taken to a page where I will be editing the page in advanced mode.

Now all I need to do is start adding in controls and HTML to build up the page layout. As you can see below, I have turned on the split view and the branding from the master page is being applied. Towards the bottom of the split view you notice the PlaceHolderMain outlined in light purple. That is where all the modifications will be made. You may not recall but this corresponds back to the Master Page. So when a page is rendered in SharePoint, both the Master Page and Page Layout are merged together to create the web page that is ultimately rendered.

clip_image007[4]

Within this screen I was able to compose a web page using the fields I have available to me from my content type. Here is the resulting screen that I created. Looks pretty basic but I have pulled in some core data fields, I am displaying managed metadata, and I am displaying the rating for the article.

clip_image009[4]

Here is a view of that same article in edit mode.

clip_image011[4]

Now to achieve this I did have to do several things in SharePoint Designer 2010.

clip_image013[4]

The process for creating the page was simple. First I created a HTML layout with some CSS embedded page layout to control the presentation. I put in a HTML table and then started dragging and dropping fields into the table. Now there are a couple little things you should know.

Metadata fields will not work when you drop them in. You need to add the following to the top of the page which will then allow the managed metadata fields to render on the page layout.

<%@ Register Tagprefix="Taxonomy" Namespace="Microsoft.SharePoint.Taxonomy" Assembly="Microsoft.SharePoint.Taxonomy, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>


The Rating (0-5) control will not work either unless the following is registered at the very of the page layout.




<%@ Register Tagprefix="SharePointPortalControls" Namespace="Microsoft.SharePoint.Portal.WebControls" Assembly="Microsoft.SharePoint.Portal, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>


To display the created and modified date you will need to again add the following registration to the top of the page layout.




<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>


Lastly you may have noticed that the big wave logo is missing from this page layout. This is because I made a decision that the wave branding was taking up too much real-estate for an article. A little trick I did was adding some CSS to the page layout to hide it. I like this approach because I really want this logo to be part of the master page but just for this particular page layout I do not want to display it.




<asp:Content ContentPlaceholderID="PlaceHolderAdditionalPageHead" runat="server">
<style type="text/css">
#logo { display: none; }
</style>
</asp:Content>


Page Layout Code



The following is the resulting code I created for the page layout.




<%@ Page language="C#"   Inherits="Microsoft.SharePoint.Publishing.PublishingLayoutPage,Microsoft.SharePoint.Publishing,Version=14.0.0.0,Culture=neutral,PublicKeyToken=71e9bce111e9429c" meta:progid="SharePoint.WebPartPage.Document" meta:webpartpageexpansion="full" %>
<%@ Register Tagprefix="SharePointWebControls" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="WebPartPages" Namespace="Microsoft.SharePoint.WebPartPages" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="PublishingWebControls" Namespace="Microsoft.SharePoint.Publishing.WebControls" Assembly="Microsoft.SharePoint.Publishing, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %> <%@ Register Tagprefix="PublishingNavigation" Namespace="Microsoft.SharePoint.Publishing.Navigation" Assembly="Microsoft.SharePoint.Publishing, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="Taxonomy" Namespace="Microsoft.SharePoint.Taxonomy" Assembly="Microsoft.SharePoint.Taxonomy, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="SharePointPortalControls" Namespace="Microsoft.SharePoint.Portal.WebControls" Assembly="Microsoft.SharePoint.Portal, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

<asp:Content ContentPlaceholderID="PlaceHolderAdditionalPageHead" runat="server">
<style type="text/css">
#logo {
display: none;
}
.TechArticleTitle {
font-weight:bold;
vertical-align:top;
width: 10%;
padding-right: 10px;
padding-left: 10px;
}
.TechArticleValue {
vertical-align:top;
}
</style>
</asp:Content>

<asp:Content ContentPlaceholderID="PlaceHolderPageTitle" runat="server">
Technology Article -
<SharePointWebControls:FieldValue id="PageTitle" FieldName="Title" runat="server"/>
</asp:Content>
<asp:Content ContentPlaceholderID="PlaceHolderMain" runat="server">

<table>
<tr>
<td class="TechArticleTitle">Title:</td>
<td class="TechArticleValue">
<SharePointWebControls:TextField FieldName="fa564e0f-0c70-4ab9-b863-0177e6ddd247" runat="server"></SharePointWebControls:TextField>
</td>
<td class="TechArticleTitle">Modified:</td>
<td class="TechArticleValue" nowrap>
<SharePoint:FieldValue FieldName="Modified" runat="server" id="modified" ControlMode="display"/>
</td>
</tr>
<tr>
<td></td>
<td class="TechArticleValue" nowrap>
<SharePointPortalControls:AverageRatingFieldControl FieldName="5a14d1ab-1513-48c7-97b3-657a5ba6c742" runat="server"></SharePointPortalControls:AverageRatingFieldControl>
</td>
<td class="TechArticleTitle">Created:</td>
<td class="TechArticleValue" nowrap>
<SharePoint:FieldValue FieldName="Created" runat="server" id="created" ControlMode="display"/>
</td>
</tr>
<tr>
<td class="TechArticleTitle">Confidentiality:</td>
<td class="TechArticleValue" colspan="3">
<Taxonomy:TaxonomyFieldControl FieldName="a472e313-fd5f-4423-89b3-bdd721461eac" runat="server"></Taxonomy:TaxonomyFieldControl>
</td>
</tr>
<tr>
<td class="TechArticleTitle">Technology:</td>
<td class="TechArticleValue" colspan="3">
<Taxonomy:TaxonomyFieldControl FieldName="9129feba-3b4a-4dd7-82cc-0822730d16c8" runat="server"></Taxonomy:TaxonomyFieldControl>
</td>
</tr>
<tr>
<td class="TechArticleTitle">Keywords:</td>
<td class="TechArticleValue" colspan="3">
<Taxonomy:TaxonomyFieldControl FieldName="23f27201-bee3-471e-b2e7-b64fd8b7ca38" runat="server"></Taxonomy:TaxonomyFieldControl>
</td>
</tr>
<tr>
<td class="TechArticleTitle">Article:</td>
<td class="TechArticleValue" colspan="4">
<PublishingWebControls:RichHtmlField FieldName="f55c4d88-1f2e-4ad9-aaa8-819af4ee7ee8" runat="server"></PublishingWebControls:RichHtmlField>
</td>
</tr>
</table>
</asp:Content>


Conclusions



With that I hope that I have demonstrated how quick and easy it is to create some page layouts with data coming off my content types. I really think this is just such an awesome way and easy way to do web content management.



In the next part of this series I am going to further extend this page layout with content query web parts.



Next



We are going to explore content query web parts and how to integrate them with the page layout we just created.

Introduction to SharePoint 2010 Branding and WCM

Introduction

Before I came to Microsoft I was a consultant and when working with branding in SharePoint 2007 it could be hard to do high-end branding. If you go to http://www.wssdemo.com/livepivot/ you can find a ton of cool SharePoint 2007 sites however the level of effort could be high.

I have to say now with SharePoint 2010 it is so much easier. It really is. I am now able to do some high end branding in a day or two. Now albeit I take an existing; somewhat simple html/css template and apply it to SharePoint 2010. But at the end of the day, it is not rocket science.

Here are two quick examples of ones I was able to set up in a day. I will openly admit that I learned all my knowledge from the SharePoint 2010 Branding book by Wrox (book). This book is awesome and all of the code samples 100% work.

Here are two samples of HTML templates I was able to download and put directly into SharePoint.

clip_image001

This is the example we will be building.

clip_image003

I was able to download the HTML and CCS from sites like - http://www.freelayouts.com/websites/html-templates. Then using the instructions in the book I was able to create the following all with SharePoint Designer 2010. Impressive isn’t it given I am not a graphic artist and SharePoint now looks awesome.

In this blog I am going to describe the process of:

  1. Obtaining an HTML template.
  2. How to create a master page with the HTML template.
  3. Some little tricks that I learned along the way.
  4. How to create page layouts to be used with the master page.
  5. How to create content query web parts.
  6. Package the solution up in WSP solution in Visual Studio.

Hopefully at the end of the day you will be able to take this and get your SharePoint 2010 branding initiated for your projects.

Disclaimer - I will also say that my approach is not 100% perfect implementation. This was because I have not put this through a production testing. I already know you will find other SharePoint site templates or situations where you will have to do more work to the CSS, Master Pages, etc. So understand that this blog will help you get started on how to do branding and it is not a production ready example nor will it be supported. I wrote this strictly to help the community learn how to do branding.

Thursday, January 6, 2011

SharePoint 2010 WCM Highlight Changes Between Page Versions

I was recently asked is version comparison feature in SharePoint 2010 that will show you the actual differences highlighted. My initial answer was no; but I was thinking about documents. For instance, if you have version control set up for a document library and you have Word, PDFs, etc. in there you will not get that capability. But you can access the major and minor versions and compare as you need (or use track versions like in the MS Word document).

However the question posed to me was around Web Content Management (WCM). A new feature of SharePoint 2010 is versioning of the web parts. So if you are doing publishing, the publishing pages will support showing differences between versions. Check this out.

Here is a simple publishing page from a demo environment that I have.

clip_image002

Now here is a view of the publishing page versions. Here you see the differences between version two and three and that I put in “This is a test”.

clip_image004

Even more interesting, here are two screenshots that captures the differences between versions 1 and 2. Notice, that the changes that are captured are not just the content in text field I had on the publishing page, is shows all of the differences of all the metadata fields. In here I made comments, I added an image, added a bunch of new text, and I changed some of the metadata fields.

clip_image006

clip_image008