Monday, October 17, 2011

SharePoint 2010 : How to add rating to a list using PowerShell


Rating an item of a list is one of the new features of SharePoint 2010. Lately I was asked how  to  add this feature programmatically to the Page list of a publishing site. First, I was expecting to find a sort of SPList.EnableRating property or something like that. There is no such a thing. 

Via the UI, on the list settings page, you just have to click the Ratings settings link and then select YES.  When you enable Ratings on a list, SharePoint adds two columns to the content type(s) you choose : AverageRatings and RatingCount

Finally, after some readings and few searches, here is how I made it using PowerShell :

First, we have to activate a site scoped  feature called Ratings with ID 915c240e-a6cc-49b8-8b2c-0bff8b553ed3 :

Enable-SPFeature -Identity Ratings -Url http://SiteCollectionUrl 

Then, we add the two columns to the content type(s) of the list :


 [void][System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint")  
 $site = New-Object Microsoft.SharePoint.SPSite("http://SiteCollectionUrl")  
 $web=$site.OpenWeb()  
 if ($web -ne $Null)  
 {  
       $AverageRating=$web.Fields[[System.Guid]"5a14d1ab-1513-48c7-97b3-657a5ba6c742"]  
       $RatingCount=$web.Fields[[System.Guid]"b1996002-9167-45e5-a4df-b2c41c6723c7"]  
       $PagesList=$web.lists["Pages"]  
       if ($PagesList -ne $Null)  
       {  
             Write-Host " Processing List : " $PagesList.Title  
             $ct=$PagesList.ContentTypes["Page"]  
             If ($ct -ne $null)  
             {  
                   Write-Host " Adding Rating columns to content type : " $ct.name  
                   $AverageRatinglink = new-object Microsoft.SharePoint.SPFieldLink $AverageRating  
                   $RatingCountLink = new-object Microsoft.SharePoint.SPFieldLink $RatingCount  
                   $ct.FieldLinks.Add($AverageRatinglink)  
                   $ct.FieldLinks.Add($RatingCountLink)  
                   $ct.update()                
             }  
       }  
 }  
 $web.Dispose()  

Hope this helps