Problem
In one of my recent project I had a challenge of filtering the data with localization.
The project contained 2 languages, English and Spanish. I was trying to find out the out of the box way to get this done, but no help was available.
Solution
- Create a new empty project in Visual Studio 2010.
- Add a webpart to the project. "Webpart" not "Visual Web Part".
- Replace the Webpart class inherited and make it "Microsoft.SharePoint.Publishing.WebControls.ContentByQueryWebPart".
- Please have a look at the code below. It will have on the fly list settings and field settings applied to the webpart.
- Build your code and deploy it. It should work.
Source Code
#region System
using System;
using System.ComponentModel;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
#endregion
// Create the Toolbar
namespace ToolBar.ToolBar
{
[ToolboxItemAttribute(false)]
public class ToolBar : Microsoft.SharePoint.Publishing.WebControls.ContentByQueryWebPart
{
#region Properties
/// <summary>
/// Root Site Name
/// </summary>
private string SiteUrl { get { return SPContext.Current.Site.RootWeb.Url; } }
/// <summary>
/// List Name
/// </summary>
private string ListName { get { return "ToolBar"; } }
/// <summary>
/// List of Url
/// </summary>
private string ListUrl
{
get
{
return string.Format("{0}/Lists/{1}/AllItems.aspx", SiteUrl, ListName);
}
}
#endregion
#region Methods
/// <summary>
/// On Page Load
/// </summary>
/// <param name="e"></param>
protected override void OnInit(EventArgs e)
{
//On Load
base.OnLoad(e);
//General Settings
this.AllowConnect = true;
this.ShowUntargetedItems = false;
this.AllowEdit = true;
//this.FrameType = "NONE"; // TODO
this.ChromeType = PartChromeType.None;
this.ExportMode = WebPartExportMode.All;
this.GroupByDirection = SortDirection.Desc;
this.SortByDirection = SortDirection.Desc;
this.ConnectionID = System.Guid.Empty;
this.ListId = System.Guid.Empty;
this.ViewFlag = "0";
this.GroupingText = "GP Web Parts";
this.Title = " Tool Bar";
this.ContentTypeName = "Item";
this.ItemStyle = "ToolBar";
this.ServerTemplate = "100";
this.GroupStyle = "DefaultHeader";
this.WebUrl = "~sitecollection";
this.Description = "Displays a dynamic view of content from your site.";
this.Xsl = "<xsl:stylesheet xmlns:x=\"http://www.w3.org/2001/XMLSchema\" version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" xmlns:cmswrt=\"http://schemas.microsoft.com/WebPart/v3/Publishing/runtime\" exclude-result-prefixes=\"xsl cmswrt x\" > <xsl:import href=\"/Style Library/XSL Style Sheets/Header.xsl\" /> <xsl:import href=\"/Style Library/XSL Style Sheets/ItemStyle.xsl\" /> <xsl:import href=\"/Style Library/XSL Style Sheets/ContentQueryMain.xsl\" /> </xsl:stylesheet>";
this.SampleData = "<dsQueryResponse><Rows><Row Title=\"Item 1\" LinkUrl=\"http://Item1\" Group=\"Group Header\" __begincolumn=\"True\" __begingroup=\"True\" /><Row Title=\"Item 2\" LinkUrl=\"http://Item2\" __begincolumn=\"False\" __begingroup=\"False\" /><Row Title=\"Item 3\" LinkUrl=\"http://Item3\" __begincolumn=\"False\" __begingroup=\"False\" /></Rows></dsQueryResponse>";
this.ParameterBindings = string.Empty;
//Root Web
using (SPWeb _web = SPContext.Current.Site.RootWeb)
{
//Assign the list to the CQWP
SPList _listYCLToolBar = _web.GetListFromUrl(ListUrl);
//Data mapping
this.DataMappings = string.Format("Description:|LinkUrl:{2},TargetUrl,URL;|Title:{4},Title,Text;|NumComments:|PublishedDate:|PostCategory:|ImageUrlAltText:{0},Title,Text;|Author:|Language:{3},Language,Lookup;|ImageUrl:{1},Icon,URL;|Body:|"
, _listYCLToolBar.Fields["Title"].Id.ToString()
, "{" + _listYCLToolBar.Fields["Icon"].Id.ToString() + "}"
, "{" + _listYCLToolBar.Fields["TargetUrl"].Id.ToString() + "}"
, "{" + _listYCLToolBar.Fields["Language"].Id.ToString() + "}"
, "{" + _listYCLToolBar.Fields["Title"].Id.ToString() + "}"
);
this.ListGuid = _listYCLToolBar.ID.ToString();
this.DataMappingViewFields = string.Format("{0},URL;{1},URL;{2},Text;{3},Lookup;"
, "{" + _listYCLToolBar.Fields["TargetUrl"].Id.ToString() + "}"
, "{" + _listYCLToolBar.Fields["Icon"].Id.ToString() + "}"
, "{" + _listYCLToolBar.Fields["Title"].Id.ToString() + "}"
, "{" + _listYCLToolBar.Fields["Language"].Id.ToString() + "}"
);
//Filter One
this.FilterField1 = "Language";//Custom Field to get the variation work.
this.FilterOperator1 = FilterFieldQueryOperator.Eq;
this.FilterValue1 = System.Globalization.CultureInfo.CurrentCulture.IetfLanguageTag;
this.FilterType1 = "Lookup";
this.Filter1ChainingOperator = FilterChainingOperator.Or;
this.Filter2ChainingOperator = FilterChainingOperator.Or;
//Sorting
this.SortByFieldType = "DateTime";
this.SortBy = "Created";
}
}
/// <summary>
/// Create Child Controls
/// </summary>
protected override void CreateChildControls()
{
base.CreateChildControls();
}
#endregion
}
}
Please let me know if there is any issue with this code or you can also correct me if I am wrong.