Filtering TaxonomyControl
I was wanting to use the TaxonomyControl to display the categories for the news, but I was wanting to only show the categories at a certain node. Is there a way for me to set the TaxonomyControl to use a child node for the Category taxonomies as the starting point?
So you have this break down for categories:
Cat 1
Cat 2
Cat sub 1
Cat sub 2
Cat sub 3
Cat child sub 1
Cat child sub 2
In this scenario, I would like to use the TaxonomyControl to display only the taxonomies starting at the node "Cat Sub 3". I know how to get the Id (GUID) for the node, but not sure how I could go about filtering the control.
Edit::
I am not sure if this ever got built into the latest build, so I would like to know if this is/will be possible with the current or future release? Till then, I am hoping that the information from this post will help me achieve what I am looking for.
http://www.sitefinity.com/devnet/forums/sitefinity-4-x/general-discussions/how-to-use-classifications-gt-categories-widget.aspx
Hello Richard,
Here is a sample code that inherits from the base TaxonomyControl and shows how to filter by a certain tag which ID you should pass the the exposed public property
using System;using System.Collections.Generic;using System.Linq;using System.Text;using Telerik.Sitefinity.Web.UI.PublicControls;using Telerik.Sitefinity.Web.UI;using Telerik.Sitefinity.Taxonomies.Model;using Telerik.Sitefinity.Lists.Model;namespace Telerik.Sitefinity.Samples1 public class TaxonomyControlCustom : TaxonomyControl protected override string LayoutTemplateName get return null; public override string FieldName get return "Category"; public override Guid TaxonomyId get return new Guid("e5cd6d69-1543-427b-ad62-688a99f5e7d4"); public Guid RootTaxon get return this._rootTaxon; set this._rootTaxon = value; public override string LayoutTemplatePath get return TaxonomyControlCustom.layoutTemplatePath; protected override void InitializeTaxaList() Dictionary<ITaxon, uint> taxonCountMap = null; if (this.ContentId != Guid.Empty) taxonCountMap = this.GetTaxaFromContentItem(); else taxonCountMap = this.GetTaxaItemsCountForTaxonomy(); var taxonomyId = this.TaxonomyId; var stats = this.CurrentTaxonomyManager.GetStatistics().Where( t => t.TaxonomyId == taxonomyId && t.MarkedItemsCount > 0 && t.StatisticType == GenericContent.Model.ContentLifecycleStatus.Live); if (this.ContentType != null) var typeName = this.ContentType.FullName; stats = stats.Where(t => t.DataItemType == typeName); var count = stats.Count(); if (count > this.TaxaCount && this.TaxaCount > 0) this.SeeAllTaxaLink.Visible = true; this.SeeAllTaxaLink.Text = string.Format(this.SeeAllTextFormat, count, this.Taxonomy.Title.ToLower()); this.SeeAllTaxaLink.NavigateUrl = this.BaseUrl; var singleTaxon = taxonCountMap.Single(kvp => ((HierarchicalTaxon)kvp.Key).Id == RootTaxon); IList<HierarchicalTaxon> items = null; if (((Telerik.Sitefinity.Taxonomies.Model.HierarchicalTaxon)(singleTaxon.Key)).Subtaxa.Count > 0) items = ((Telerik.Sitefinity.Taxonomies.Model.HierarchicalTaxon)(singleTaxon.Key)).Subtaxa; items.Add((Telerik.Sitefinity.Taxonomies.Model.HierarchicalTaxon)(singleTaxon.Key)); else items.Add((Telerik.Sitefinity.Taxonomies.Model.HierarchicalTaxon)(singleTaxon.Key)); List<TaxonData> data = BinderTaxonDataResult(items); if (data != null) this.BindRepeater(data); this.IsEmpty = (data.Count == 0); protected override void BindRepeater(List<TaxonData> data) this.TaxaRepeater.DataSource = data; this.TaxaRepeater.ItemDataBound += base.TaxaRepeater_ItemDataBound; this.TaxaRepeater.DataBind(); protected virtual List<TaxonData> BinderTaxonDataResult(IList<HierarchicalTaxon> items) List<TaxonData> data = new List<TaxonData>(); foreach (HierarchicalTaxon t in items) TaxonData d = new TaxonData(); d.Title = t.Title; d.Url = t.UrlName; d.Size = 1; d.Count = 1; data.Add(d); if (data.Count > 0) return data; return null; public static readonly string layoutTemplatePath = ControlUtilities.ToVppPath("Telerik.Sitefinity.Resources.Templates.PublicControls.TaxonomyControl.ascx"); private Guid _rootTaxon; <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="RadTreeCategoryControl.ascx.cs" Inherits="SitefinityWebApp.Controls.RadTreeCategoryControl" %><telerik:RadTreeView runat="server" ID="RadTreeView1"></telerik:RadTreeView>using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;using Telerik.Sitefinity.Taxonomies.Model;using Telerik.Sitefinity.Taxonomies;namespace SitefinityWebApp.Controls public partial class RadTreeCategoryControl : System.Web.UI.UserControl public string FieldName get return "Category"; public Guid TaxonomyId get return new Guid("e5cd6d69-1543-427b-ad62-688a99f5e7d4"); public Guid RootTaxon get return this._rootTaxon; set this._rootTaxon = value; protected void Page_Load(object sender, EventArgs e) var tManager = TaxonomyManager.GetManager(); ITaxonomy taxonomy = tManager.GetTaxonomy(TaxonomyId); var singleTaxon = taxonomy.Taxa.Single(st => ((HierarchicalTaxon)st).Id == RootTaxon); IList<HierarchicalTaxon> items = null; if (((Telerik.Sitefinity.Taxonomies.Model.HierarchicalTaxon)(singleTaxon)).Subtaxa.Count > 0) items = ((Telerik.Sitefinity.Taxonomies.Model.HierarchicalTaxon)(singleTaxon)).Subtaxa; items.Add((Telerik.Sitefinity.Taxonomies.Model.HierarchicalTaxon)(singleTaxon)); else items.Add((Telerik.Sitefinity.Taxonomies.Model.HierarchicalTaxon)(singleTaxon)); this.BindTree(items); protected void BindTree(IList<HierarchicalTaxon> data) this.RadTreeView1.DataSource = data; this.RadTreeView1.NodeDataBound += new Telerik.Web.UI.RadTreeViewEventHandler(RadTreeView1_NodeDataBound); this.RadTreeView1.DataBind(); void RadTreeView1_NodeDataBound(object sender, Telerik.Web.UI.RadTreeNodeEventArgs e) var taxon = e.Node.DataItem as HierarchicalTaxon; e.Node.Text = taxon.Title; private Guid _rootTaxon; Thank you Ivan. Will this be implemented in a later release?
Hello Richard ,
I remember that there is a task about this, but it is currently not scheduled. Here you can find the PITS Issue: Public URL
Greetings,
Ivan Dimitrov
the Telerik team
Ivan,
I did notice that they count is always 1 if you set the ShowItemCount. I believe this is due to this line:
d.Count = 1;
How would I get this to output the actual item count for each taxon?
Hi Richard,
You can use PrepareData method of the TaxonomyControl to do this, but in this case you should override it to split the taxons. Another option is using GetItemsByTaxon method of ContentDataProviderBase and count the result.
Regards,
Ivan Dimitrov
the Telerik team