Custom Sitemap
I am developing a custom sitemap which integrates products from my custom product module in to the site map. I am seeing some strange behavior in the Custom sitemap where products only appear some of the time. I think it may be something to do with caching of the sitemap nodes but I am just not sure.
I developed the custom sitemap by inheriting from PageSiteNode as follows.
using
System;
using
Dannon.Sitefinity.ProductModule.Model;
using
Telerik.Sitefinity.Data;
using
Telerik.Sitefinity.Pages.Model;
using
Telerik.Sitefinity.Web;
namespace
Dannon.Sitefinity.Web.UI
public
class
ProductSiteNode : PageSiteNode, ISitefinitySiteMapNode
public
string
ProductProviderName
get
;
private
set
;
public
ProductItem Product
get
;
private
set
;
public
override
string
Url
get
return
"~/products/details/"
+
this
.Product.UrlName;
set
throw
new
NotSupportedException();
public
override
string
Title
get
return
Product.NavigationTitle;
set
throw
new
NotSupportedException();
public
ProductSiteNode(SiteMapBase provider, PageNode pageNode,
string
pageProviderName, ProductItem product,
string
productProviderName)
:
base
(provider, pageNode, pageProviderName)
this
.CacheDependency =
new
CompoundCacheDependency();
this
.CacheDependency.CacheDependencies.Add(
new
DataItemCacheDependency(product.GetType(), product.Id));
if
(provider ==
null
)
throw
new
ArgumentNullException(
"provider"
);
this
.ProductProviderName = productProviderName;
Product = product;
public
override
SiteMapNodeCollection GetChildNodes(SiteMapNode parent,
bool
ifAccessible)
var taxMan = GetTaxonomyManager();
var departments = taxMan.GetTaxonomy(ProductsModule.DepartmentTaxonomyId).Taxa;
SiteMapNodeCollection childNodes =
base
.GetChildNodes(parent, ifAccessible);
var department = departments.FirstOrDefault(d => parent.Url.EndsWith(d.UrlName));
if
(department !=
null
)
foreach
(var product
in
GetProductsByTaxon(department.Title,
"Departments"
))
var parentPage = parent
as
PageSiteNode;
var parentPageNode = GetPageManager().GetPageNode(parentPage.Id);
childNodes.Add(GetSiteMapNodeForProduct(parentPageNode, product));
return
childNodes;
Hi Jason Chester,
We apologize for the late answer. We don't have a sample for custom site map. But what you did seams OK. Could you tell us when you stop to see the products in the navigation? We created a test project based on your code and it looks it works.
Best wishes,
Ivan Pelovski
the Telerik team
Jason, I am working on a Sitemap implementation myself, and will blog my solution soon...
however I'm curious about your approach. Why do you use the sitemap and sitenodes? It might be easier to simply use the API to retrieve items (pages, news, products, etc) then build the xml manually, avoiding the sitemapnodes altogether. this is the approach I am taking.
I don't know if this is related to your problem, but I think retrieving products through the API might automate internally the caching stuff so you can just grab the data you need (correct me if I'm wrong sf guys!)
hope this is helpful, I'll try to publish my work asap!
I decided to base my code on the existing sitemap implementation so I could take advantage of all the caching and performance built in to it. SitefinitySiteMap is a pretty complicated class and I wanted to maintain all it's functionality without duplicating the code.
Inheriting from SitefinitySiteMap also means that I should be able to take advantage of any of the changes to the base implementation on version upgrades without having to change my code.
I think the issues I have seen were more about my navigation control, based on CleanNav, than my sitemap provider. After some debugging of the CleanNav code it is working well so I am happy with my approach.
Jason