Recently i was working on a sitefinity project. The problem i was facing was, there are 5 blogs in my website and i want to show all the blogs separately on different pages.
When i use the Tags List control on the page, it is showing all the tags from all the blogs.
But my requirement is, i want only Tags related to specific blog.
I managed to come up with a simple solution that requires creating a custom control that inherits from TagsList, implementing a simple property and overriding one method - InitializeControls.
Save this class file into App_Code folder.
Make a entry into web.config file.(in <toolboxcontrols> tag)
<add name="FilteredTags Cloud" section="Tags & Categories" type="Ramp.TagsListFiltered, App_Code" description="Displays Blog related tags" />
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Telerik.Cms.Engine.WebControls.Categories;
using Telerik.Cms.Engine.WebControls.Tags;
using Telerik.Cms.Web.UI;
using System.ComponentModel;
using System.Collections;
using Telerik.Cms.Engine;
using Telerik.Blogs;
using Telerik.Cms;
using System.Web.UI;
using Telerik.Cms.Engine.Data;
using System.Web.UI.WebControls;
using Telerik.Web;
namespace Ramp
{
///
/// Summary description for TagsListFiltered
///
public class TagsListFiltered : TagsList
{
public TagsListFiltered()
{
}
#region Private contstraints
private Guid[] selectedBlogs = new Guid[] { };
private BlogManager blogManager;
#endregion
public override string LayoutTemplatePath
{
get
{
return "~/Sitefinity/ControlTemplates/Generic_Content/TagsList.ascx";
}
}
[TypeConverter("Telerik.Blogs.WebControls.SelectedBlogsConverter, Telerik.Blogs")]
[WebEditor("Telerik.Blogs.WebControls.BlogsSelector, Telerik.Blogs")]
public Guid[] SelectedBlogs
{
get
{
return this.selectedBlogs;
}
set
{
this.selectedBlogs = value;
}
}
#region Methods
protected override void InitializeControls(Control controlContainer)
{
IList<ITag> blogTags = new List<ITag>();
blogManager = new BlogManager("Blogs");
if (this.selectedBlogs.Length == 0)
{
// call the base class we will not change anything.
//base.BindCategories();
}
else
{
IList allBlogs = blogManager.GetBlogs(selectedBlogs);
foreach (IBlog blog in allBlogs)
{
IList blogPosts = blog.Posts;
foreach (IContent post in blogPosts)
{
IList postTags = blogManager.Content.GetTags(post.ID);
foreach (ITag tag in postTags)
{
if (!blogTags.Contains(tag))
{
blogTags.Add(tag);
}
}
}
}
if (this.DefaultDisplayMode == DisplayMode.List)
{
this.TagsRepeaterList.DataSource = blogTags;
this.TagsRepeaterList.ItemDataBound += new RepeaterItemEventHandler(this.TagsRepeaterList_ItemDataBound);
this.TagsRepeaterList.DataBind();
}
else
{
this.TagsRepeaterCloud.DataSource = blogTags;
this.TagsRepeaterCloud.ItemDataBound += new RepeaterItemEventHandler(this.TagsRepeaterCloud_ItemDataBound);
this.TagsRepeaterCloud.DataBind();
}
if (this.ControlTitleControl != null)
{
this.ControlTitleControl.Text = this.ControlTitle;
}
this.TagsRepeaterCloud.Visible = this.DefaultDisplayMode == DisplayMode.Cloud;
this.TagsRepeaterList.Visible = this.DefaultDisplayMode == DisplayMode.List;
if (this.DisplayCloudLink != null)
{
this.DisplayCloudLink.Enabled = this.DefaultDisplayMode == DisplayMode.List;
this.DisplayCloudLink.CommandName = "DisplayCloud";
this.DisplayCloudLink.Command += new CommandEventHandler(this.Button_CommandNew);
}
if (this.DisplayListLink != null)
{
this.DisplayListLink.Enabled = this.DefaultDisplayMode == DisplayMode.Cloud;
this.DisplayListLink.CommandName = "DisplayList";
this.DisplayListLink.Command += new CommandEventHandler(this.Button_CommandNew);
}
}
}
private void Button_CommandNew(object sender, CommandEventArgs e)
{
string commandName = e.CommandName;
if (commandName != null)
{
if (!(commandName == "DisplayCloud"))
{
if (!(commandName == "DisplayList"))
{
return;
}
}
else
{
this.DefaultDisplayMode = DisplayMode.Cloud;
base.ChildControlsCreated = false;
return;
}
this.DefaultDisplayMode = DisplayMode.List;
base.ChildControlsCreated = false;
}
}
private void TagsRepeaterCloud_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
{
int num3;
ITag dataItem = (ITag)e.Item.DataItem;
HyperLink link = (HyperLink)e.Item.FindControl("tagLink");
link.Text = dataItem.TagName;
link.NavigateUrl = (this.TagKeyType == TagKeyTypes.ID) ? base.ResolveUrl(this.TaggedContentUrl + "?" + this.TagItemKey + "=" + dataItem.ID.ToString()) : base.ResolveUrl(this.TaggedContentUrl + "?" + this.TagItemKey + "=" + dataItem.TagName);
IUrlService languageService = UrlServices.GetLanguageService();
if (languageService != null)
{
link.NavigateUrl = languageService.ResolveLanguageUrl(link.NavigateUrl);
}
float num = Convert.ToSingle(this.Manager.ContentCount(SelectedBlogs));
float num4 = Convert.ToSingle(dataItem.ContentsTagged) / num;
if (num4 > 0.83)
{
num3 = 1;
}
else if (num4 > 0.66)
{
num3 = 2;
}
else if (num4 > 0.5)
{
num3 = 3;
}
else if (num4 > 0.33)
{
num3 = 4;
}
else
{
num3 = (num4 > 0.16) ? 5 : 6;
}
string str = link.CssClass + num3.ToString();
link.CssClass = str;
}
}
private void TagsRepeaterList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
if ((e.Item.ItemType == ListItemType.Item) || (e.Item.ItemType == ListItemType.AlternatingItem))
{
ITag dataItem = (ITag)e.Item.DataItem;
HyperLink link = (HyperLink)e.Item.FindControl("tagLink");
link.Text = dataItem.TagName;
link.NavigateUrl = (this.TagKeyType == TagKeyTypes.ID) ? base.ResolveUrl(this.TaggedContentUrl + "?" + this.TagItemKey + "=" + dataItem.ID.ToString()) : base.ResolveUrl(this.TaggedContentUrl + "?" + this.TagItemKey + "=" + dataItem.TagName);
IUrlService languageService = UrlServices.GetLanguageService();
if (languageService != null)
{
link.NavigateUrl = languageService.ResolveLanguageUrl(link.NavigateUrl);
}
ITextControl control = (ITextControl)e.Item.FindControl("taggedContentCount");
control.Text = dataItem.ContentsTagged.ToString();
}
}
#endregion
}
}