56a2ace7d2
This is very likely break the dev site
184 lines
7.8 KiB
C#
184 lines
7.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Xml;
|
|
using System.Web;
|
|
using umbraco.cms.businesslogic.web;
|
|
using umbraco;
|
|
using umbraco.cms.businesslogic.template;
|
|
using umbraco.interfaces;
|
|
using umbraco.NodeFactory;
|
|
|
|
namespace uForum {
|
|
public class iNotFoundHandler : umbraco.interfaces.INotFoundHandler {
|
|
#region INotFoundHandler Members
|
|
|
|
private int _redirectID = -1;
|
|
|
|
public bool CacheUrl {
|
|
get { return false; }
|
|
}
|
|
|
|
public bool Execute(string url) {
|
|
|
|
HttpContext.Current.Trace.Write("umbraco.faltTemplateHandler","init");
|
|
|
|
bool _succes = false;
|
|
url = url.Replace(".aspx", string.Empty);
|
|
string currentDomain = HttpContext.Current.Request.ServerVariables["SERVER_NAME"];
|
|
if (url.Length > 0) {
|
|
if (url.Substring(0, 1) == "/")
|
|
url = url.Substring(1, url.Length - 1);
|
|
|
|
XmlNode urlNode = null;
|
|
string topicId = "";
|
|
string topicTitle = "";
|
|
|
|
HttpContext.Current.Trace.Write("umbraco.faltTemplateHandler url", url);
|
|
|
|
|
|
// We're not at domain root
|
|
if (url.IndexOf("/") != -1) {
|
|
|
|
string theRealUrl = url.Substring(0, url.LastIndexOf("/"));
|
|
string realUrlXPath = CreateXPathQuery(theRealUrl, true);
|
|
|
|
urlNode = content.Instance.XmlContent.SelectSingleNode(realUrlXPath);
|
|
topicTitle = url.Substring(url.LastIndexOf("/") + 1, url.Length - url.LastIndexOf(("/")) - 1).ToLower();
|
|
topicId = topicTitle.Split('-')[0];
|
|
topicTitle = topicTitle.Substring(topicTitle.IndexOf('-') + 1);
|
|
|
|
if(urlNode != null)
|
|
HttpContext.Current.Trace.Write("umbraco.faltTemplateHandler", topicId + " " + urlNode.Name);
|
|
}
|
|
|
|
if (urlNode != null && topicId != "" && urlNode.Name == "Forum") {
|
|
_redirectID = int.Parse(urlNode.Attributes.GetNamedItem("id").Value);
|
|
|
|
var cookie = new HttpCookie("altTemplate", "displaytopic");
|
|
HttpContext.Current.Request.Cookies.Add(cookie);
|
|
|
|
HttpContext.Current.Items["altTemplate"] = "displaytopic";
|
|
HttpContext.Current.Items["topicID"] = topicId;
|
|
HttpContext.Current.Items["topicTitle"] = topicTitle.Replace('-',' ');
|
|
|
|
HttpContext.Current.Trace.Write("umbraco.faltTemplateHandler",
|
|
string.Format("Templated changed to: '{0}'",
|
|
HttpContext.Current.Items["altTemplate"]));
|
|
_succes = true;
|
|
}
|
|
}
|
|
return _succes;
|
|
}
|
|
|
|
public int redirectID {
|
|
get {
|
|
return _redirectID;
|
|
}
|
|
|
|
}
|
|
|
|
private const string PageXPathQueryStart = "/root";
|
|
private const string UrlName = "@urlName";
|
|
public static string CreateXPathQuery(string url, bool checkDomain)
|
|
{
|
|
|
|
string _tempQuery = "";
|
|
if (GlobalSettings.HideTopLevelNodeFromPath && checkDomain)
|
|
{
|
|
_tempQuery = "/root" + GetChildContainerName() + "/*";
|
|
}
|
|
else if (checkDomain)
|
|
_tempQuery = "/root" + GetChildContainerName();
|
|
|
|
|
|
string[] requestRawUrl = url.Split("/".ToCharArray());
|
|
|
|
// Check for Domain prefix
|
|
string domainUrl = "";
|
|
if (checkDomain && Domain.Exists(HttpContext.Current.Request.ServerVariables["SERVER_NAME"]))
|
|
{
|
|
// we need to get the node based on domain
|
|
INode n = new Node(Domain.GetRootFromDomain(HttpContext.Current.Request.ServerVariables["SERVER_NAME"]));
|
|
domainUrl = n.UrlName; // we don't use niceUrlFetch as we need more control
|
|
if (n.Parent != null)
|
|
{
|
|
while (n.Parent != null)
|
|
{
|
|
n = n.Parent;
|
|
domainUrl = n.UrlName + "/" + domainUrl;
|
|
}
|
|
}
|
|
domainUrl = "/" + domainUrl;
|
|
|
|
// If at domain root
|
|
if (url == "")
|
|
{
|
|
_tempQuery = "";
|
|
requestRawUrl = domainUrl.Split("/".ToCharArray());
|
|
HttpContext.Current.Trace.Write("requestHandler",
|
|
"Redirecting to domain: " +
|
|
HttpContext.Current.Request.ServerVariables["SERVER_NAME"] +
|
|
", nodeId: " +
|
|
Domain.GetRootFromDomain(
|
|
HttpContext.Current.Request.ServerVariables["SERVER_NAME"]).
|
|
ToString());
|
|
}
|
|
else
|
|
{
|
|
// if it matches a domain url, skip all other xpaths and use this!
|
|
string langXpath = CreateXPathQuery(domainUrl + "/" + url, false);
|
|
if (content.Instance.XmlContent.DocumentElement.SelectSingleNode(langXpath) != null)
|
|
return langXpath;
|
|
}
|
|
}
|
|
else if (url == "" && !GlobalSettings.HideTopLevelNodeFromPath)
|
|
_tempQuery += "/*";
|
|
|
|
bool rootAdded = false;
|
|
if (GlobalSettings.HideTopLevelNodeFromPath && requestRawUrl.Length == 1)
|
|
{
|
|
HttpContext.Current.Trace.Write("umbracoRequestHandler", "xpath: '" + _tempQuery + "'");
|
|
if (_tempQuery == "")
|
|
_tempQuery = "/root" + GetChildContainerName() + "/*";
|
|
_tempQuery = "/root" + GetChildContainerName() + "/* [" + UrlName +
|
|
" = \"" + requestRawUrl[0].Replace(".aspx", "").ToLower() + "\"] | " + _tempQuery;
|
|
HttpContext.Current.Trace.Write("umbracoRequestHandler", "xpath: '" + _tempQuery + "'");
|
|
rootAdded = true;
|
|
}
|
|
|
|
|
|
for (int i = 0; i <= requestRawUrl.GetUpperBound(0); i++)
|
|
{
|
|
if (requestRawUrl[i] != "")
|
|
_tempQuery += GetChildContainerName() + "/* [" + UrlName + " = \"" + requestRawUrl[i].Replace(".aspx", "").ToLower() +
|
|
"\"]";
|
|
}
|
|
|
|
if (GlobalSettings.HideTopLevelNodeFromPath && requestRawUrl.Length == 2)
|
|
{
|
|
_tempQuery += " | " + PageXPathQueryStart + GetChildContainerName() + "/* [" + UrlName + " = \"" +
|
|
requestRawUrl[1].Replace(".aspx", "").ToLower() + "\"]";
|
|
}
|
|
HttpContext.Current.Trace.Write("umbracoRequestHandler", "xpath: '" + _tempQuery + "'");
|
|
|
|
Debug.Write(_tempQuery + "(" + PageXPathQueryStart + ")");
|
|
|
|
if (checkDomain)
|
|
return _tempQuery;
|
|
else if (!rootAdded)
|
|
return PageXPathQueryStart + _tempQuery;
|
|
else
|
|
return _tempQuery;
|
|
}
|
|
|
|
private static string GetChildContainerName()
|
|
{
|
|
if (string.IsNullOrEmpty(UmbracoSettings.TEMP_FRIENDLY_XML_CHILD_CONTAINER_NODENAME) == false)
|
|
return "/" + UmbracoSettings.TEMP_FRIENDLY_XML_CHILD_CONTAINER_NODENAME;
|
|
return "";
|
|
}
|
|
#endregion
|
|
}
|
|
}
|