别让DTcms栏目类别调用名称形同虚设(二)

Hailin 发表于 2016-05-21 08:46:38 来源于CMS插件网 评论 0 点击 1200
摘要:今天接着来看看这个问题怎么如果更进一步的完善呢,看下图,是小编新增加的可以提前做出判断是用调用名还是内容ID,做的比较简单,高手可以进一步完善一下。

上一节小编说到DTcms频道类别名称形同虚设问题,那今天接着来看看这个问题怎么如果更进一步的完善呢,看下图,是小编新增加的可以提前做出判断是用调用名还是内容ID,做的比较简单,高手可以进一步完善一下。

注意:本教程不适用于生成静态,如果您的网站是静态默认运行,请绕过本文章,否则会造成网站生成静态时出错;如果您是高手,可自行修复,修复方法也比较简单,由于小编时间关系,后期会慢慢通过教程来完善DT的生成静态方式;以及以静态缓存模式运行网站,这个是DT没有的,因为工程有点长,所以等后期小编有足够的时候在来说这个问题;

7.jpg

我们来看一下具体实现步骤:

1、为了让后台更加方便,所以我们先添加一个“调用名”选择顶

9.jpg

在DTcms.Web\admin\dialog\dialog_rewrite.aspx, 第107行

<option value="call_index">调用名</option>

2、修改模版继承类,article_show.cs,将变量page修改为call_index;(这一步可修改可不修改,小统只是为了方便统一使用,因为类别名使用的是call_index,这里使用page,有时候会造成混淆;),具体代码如下

文件:DTcms.Web.UI\Page\article_show.cs

protected int id;
protected string call_index = string.Empty;
protected Model.article model = new Model.article();
/// <summary>
/// 重写虚方法,此方法将在Init事件前执行
/// </summary>
protected override void ShowPage()
{
    id = DTRequest.GetQueryInt("id");
    call_index = DTRequest.GetQueryString("call_index");
    BLL.article bll = new BLL.article();
    if (id > 0) //如果ID获取到,将使用ID
    {
        if (!bll.Exists(id))
        {
            HttpContext.Current.Response.Redirect(linkurl("error", "?msg=" + Utils.UrlEncode("出错啦,您要浏览的页面不存在或已删除!")));
            return;
        }
        model = bll.GetModel(id);
    }
    else if (!string.IsNullOrEmpty(call_index)) //否则检查设置的别名
    {
        if (!bll.Exists(call_index))
        {
            HttpContext.Current.Response.Redirect(linkurl("error", "?msg=" + Utils.UrlEncode("出错啦,您要浏览的页面不存在或已删除!")));
            return;
        }
        model = bll.GetModel(call_index);
        //赋值文章ID
        id = model.id;
    }
    else
    {
        HttpContext.Current.Response.Redirect(linkurl("error", "?msg=" + Utils.UrlEncode("出错啦,您要浏览的页面不存在或已删除!")));
        return;
    }
    //跳转URL
    if (model.link_url != null)
    {
        model.link_url = model.link_url.Trim();
    }
    if (!string.IsNullOrEmpty(model.link_url))
    {
        HttpContext.Current.Response.Redirect(model.link_url);
    }
    //判断SEO标题
    if (string.IsNullOrEmpty(model.seo_title) || "" == model.seo_title)
    {
        model.seo_title = model.title;
    }
}

 3、新增地址解析方法queryurl(),这个方法的作用就是在前台模版中用于自动判断调用名称是否有值,有值就优先使用调用名做为解析地址,具体代码如下:

文件:DTcms.Web.UI\BasePage.cs

/// <summary>
/// 返回URL重写统一链接地址
/// </summary>
/// <param name="_key">URL调用名称</param>
/// <param name="_call_index">内容调用名称</param>
/// <param name="_id">文章ID</param>
/// <returns></returns>
public string queryurl(string _key, string _call_index, int _id)
{
    if (string.IsNullOrEmpty(_call_index))
    {
        return linkurl(_key, _id);
    }
    return linkurl(_key, _call_index);
}
/// <summary>
/// 返回URL重写统一链接地址
/// </summary>
/// <param name="_key">URL调用名称</param>
/// <param name="_call_index">内容调用名称</param>
/// <param name="_id">文章ID</param>
/// <returns></returns>
public string queryurl(string _key, string _call_index, string _id)
{
    if (string.IsNullOrEmpty(_call_index) || "" == _call_index)
    {
        return linkurl(_key, _id);
    }
    return linkurl(_key, _call_index);
}
/// <summary>
/// 返回URL重写统一链接地址
/// </summary>
/// <param name="_key">URL调用名称</param>
/// <param name="_url">链接地址</param>
/// <param name="_call_index">内容调用名称</param>
/// <param name="_id">文章ID</param>
/// <returns></returns>
public string queryurl(string _key, string _url, string _call_index, string _id)
{
    if (!string.IsNullOrEmpty(_url))
    {
        return _url;
    }
    else if (string.IsNullOrEmpty(_call_index) || "" == _call_index)
    {
        return linkurl(_key, _id);
    }
    return linkurl(_key, _call_index);
}

 4、为了让前台能支持queryurl()方法,我们还得去修改一下模版引擎;

首先将表达式数组由23改成24;

public static Regex[] r = new Regex[24];

赋值正则表达式

//URL链接标签
r[23] = new Regex(@"(<%queryurl\(([^\s]*?)\)%>)", options);

在ConvertTags()方法中添加解析方法

#region 解析url链接标签(2)============================================OK
foreach (Match m in r[23].Matches(strTemplate))
{
  IsCodeLine = true;
  strTemplate = strTemplate.Replace(m.Groups[0].ToString(),
                string.Format("\r\n\ttemplateBuilder.Append(queryurl({0}));", m.Groups[2]).Replace("\\\"", "\""));
}
#endregion

到这一步,我们的源码优化已经大功告成了,现在要做的就是在前台模板文件中使用queryurl()方法来解析地址;如下图

201605210915070568.jpg

在最后小编在给大家提点小建议,如果当ID和调用名同时使用时,需要将ID值放在前面,不然会出错,正确配置方法如下图:

11.jpg

热门资讯