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.