I've recently been working with the excellent
n2cms project. However, I've noticed a bug with the Forum Addon. The first page would be correctly themed but any subsequent pages were not when running against a build of the latest N2CMS.
On investigation, it seems that the Forum Pages
CurrentItem was resolving to
null which prevented the
ThemeConcern for assigning the correct theme:
public class ThemeConcern : TemplateConcern
public override void OnPreInit(ITemplatePage template)
var item = template.CurrentItem;
if (item == null)
Looking into the N2.Templates.dll that comes the Forum Addon, it looks like things were handled differently back in the day, with the
N2.Templates.Web.ThemeModifier just using the theme for that start page:
public void Modify<T>(TemplatePage<T> page) where T: AbstractPage
string theme = GenericFind<ContentItem, StartPage>.StartPage.Theme;
if ((!this.themeVerified && (theme != null)) &&
Directory.Exists(page.Server.MapPath("~/App_Themes/" + theme)))
this.themeVerified = true;
page.Theme = theme;
So, the fix is to make the forum page take the theme from the start page, without affecting other page types… tricky whilst maintaining separation of concerns… hmm.
The fix has to belong with the forum addon so that the change in behaviour doesn’t knacker the standard n2cms features. N2CMS populates the
CurrentItem property based on the current URL and as the Forum plug in is generating links directly to its core template (/Forum/UI/Views/Forum.aspx), this is causing a problem.
Fortunately, the YAF Framework provides an extension point we can use to fix the problem
yaf.IUrlBuilder. This is a simple
interface which takes the query
string parameters and returns the appropriate link.
public class N2UrlLinkBuilder : yaf.IUrlBuilder
#region IUrlBuilder Members
public string BuildUrl(string url)
Unfortunately, YAF doesn’t allow you to set the link builder via configuration – it has to be done programmatically. So you’ll need to amend ‘/Forum/UI/Views/Forum.aspx’ to ensure it is set:
public partial class Forum : N2.Templates.Web.UI.TemplatePage<Items.Forum>
protected override void OnPreInit(EventArgs e)
if (!(yaf.Config.IsRainbow || yaf.Config.IsDotNetNuke ||
yaf.Config.EnableURLRewriting == "true"))
Another possible workaround is to investigate the
UrlRewriting… but this looks too involved for the time available.