0
点赞
收藏
分享

微信扫一扫

系统标签修改流程


在系统的时候过程中,我们经常会遇到这种问题,系统标签的功能跟我们实际的需求大致符合,可是我们有些需求系统标签又无法完全实现,用自定义标签重新来构造所有功能也不大现实,这个时候,我们就可以考虑通过修改文件的方式来将系统标签的功能加以扩展。

  我们来看一下一个实际的例子

{$CorrelativeArticle(ArticleNum, TitleLen, OrderType, OpenType, Cols)}
  作 用:显示相关文章(可不带参数使用)
  参 数:ArticleNum  ----最多显示多少篇文章
            TitleLen   ----标题最多字符数,一个汉字=两个英文字符
            OrderType ---- 排序方式,1--按文章ID降序,2--按文章ID升序,3--按更新时间降序,4--按更新时间升序,5--按点击数降序,6--按点击数升序,7--按评论数降序,8--按评论数升序
            OpenType ---- 文章打开方式,0为在原窗口打开,1为在新窗口打开
            Cols ---- 每行的列数。超过此列数就换行

  

  如果我们现在有这样一个需求:我们不只要取出当前频道的相关文章,而是想取出所有文章频道的相关文章,那我们应该如何修改?

 

  首先我们来分析一下,我们有以下两个解决方案

1、 直接修改这个标签相关函数的内容,扩大这个标签SQL语句读取文章的范围,从原来的读取当前频道的相关文章改为读取所有文章频道的相关文章;

2、 我们给标签加多一个参数,比如ChannelID,用不同数值来控制不同的情况,比如0代表所有文章频道,-1代表当前频道,输入具体数字代表指定频道

  

  我们来对比一下两种解决方案的优缺点。

1是最快可以解决问题的方法,由于我们并没有改变参数的调用情况和参数个数,模板里面相应标签也不用做修改,不过他的缺点是少了控制性跟灵活性,修改之后,我们如果想改会原来读取当前频道的文章,那么我们又必须修改源代码,而且如果我们有多个频道,我们也没法控制哪个频道实现调用所有文章频道的相关文章,哪个频道还是读取当前频道的相关文章。

2 可以克服上面方案1的缺点,不过方案2需要考虑的问题也比较多,修改起来比较复杂,我们必须修改这个标签读取参数的代码,标签对应函数对新增参数的处理流程,而且这个时候会产生一个新的问题,我们模板中如果有很多地方调用了这个标签,那么需要一个个去修改标签,加入新的参数,要不然标签就不能正常解析。

2遇到的问题,其实就是一个兼容性的问题,我们新增加了一个参数,那么我们怎么兼容之前的标签,让他们都能够正常的解析?一般来说,我们有两种处理方法:

    1、不同参数的标签调用同一个函数,程序先判断参数的个数,如果参数个数不足,用默认值补上,比如我们{$CorrelativeArticle(参数列表)} 这个标签,默认是有五个参数,我们新加了一个参数,那么模板中如果再出现五个参数的情况,就给他一个默认值,我们可以默认让他相关当前频道的文章,也可以默认让他相关所有文章频道的文章。

    2、不同参数的标签调用不同的函数,比如我们原来有五个参数,调用的是默认的函数,我们现在新增了一个参数,那么我们再另外构造一个函数来处理六个参数这种情况。

   

    下面我们还是用实际例子来分析一下前面说到的问题。

  首先我们找到{$CorrelativeArticle(参数列表)}这个标签参数的处理代码,大概是在Include文件夹里面的PowerEasy.Article.asp文件3162行

Dim arrTemp
    Dim strCorrelativeArticle
    regEx.Pattern = "\{\$CorrelativeArticle\((.*?)\)\}"
    Set Matches = regEx.Execute(strHtml)
    For Each Match In Matches
        arrTemp = Split(Match.SubMatches(0), ",")
        Select Case UBound(arrTemp)
        Case 1
            strCorrelativeArticle = GetCorrelative(arrTemp(0), arrTemp(1), 1, 0, 1)
        Case 4
            strCorrelativeArticle = GetCorrelative(arrTemp(0), arrTemp(1), arrTemp(2), arrTemp(3), arrTemp(4))
        Case Else
            strCorrelativeArticle = "函数式标签:{$CorrelativeArticle(参数列表)}的参数个数不对。请检查模板中的此标签。"
        End Select
        strHtml = Replace(strHtml, Match.Value, strCorrelativeArticle)
    Next

2个,参数是5个时候的处理情况,通过代码我们可以看到处理这个标签的参数是传递给GetCorrelative()这个函数的,下面我们再看一下这个函数是如何定义的,我们找到还是在这个文件PowerEasy.Article.asp的1386行左右定义了这个这个函数:Private Function GetCorrelative(ArticleNum, TitleLen, OrderType, OpenType, Cols)

SQL语句是这样定义的

A.ChannelID=" & ChannelID & "

A.ChannelID=" & ChannelID & "这个范围,ChannelID这个标签就是当前栏目的ID,如果我们按照方案1的修改方法,那么很简单,我们去掉这个限制就可以了,我们可以把SQL语句修改成:

    sqlCorrelative = sqlCorrelative & " A.ArticleID,A.Title,A.Author,A.UpdateTime,A.Hits,A.InfoPurview,A.InfoPoint,C.ParentDir,C.ClassDir,C.ClassPurview from PE_Article A left join PE_Class C on A.ClassID=C.ClassID where A.Deleted=" & PE_False & " and A.Status=3 and A.ReceiveType=0"

  然后我们保存,再刷新一下页面,可以看到内容页相关文章的标签调用的已经是所有文章频道的相关文章了。

2的方法来修改,首先我们必须修改这个标签参数的处理代码

{$CorrelativeArticle}

3166行左右找到下面代码:

If InStr(strHtml, "{$CorrelativeArticle}") > 0 Then strHtml = Replace(strHtml, "{$CorrelativeArticle}", GetCorrelative(10, 26, 1, 0, 1))
  增加一个默认参数,改为
-1))
 
{$CorrelativeArticle(参数列表)}
    Dim arrTemp
    Dim strCorrelativeArticle
    regEx.Pattern = "\{\$CorrelativeArticle\((.*?)\)\}"
    Set Matches = regEx.Execute(strHtml)
    For Each Match In Matches
        arrTemp = Split(Match.SubMatches(0), ",")
        Select Case UBound(arrTemp)
        Case 1
 -1)
        Case 4
 -1)
Case 5
            strCorrelativeArticle = GetCorrelative(arrTemp(0), arrTemp(1), arrTemp(2), arrTemp(3), arrTemp(4), arrTemp(5))
        Case Else
            strCorrelativeArticle = "函数式标签:{$CorrelativeArticle(参数列表)}的参数个数不对。请检查模板中的此标签。"
        End Select
        strHtml = Replace(strHtml, Match.Value, strCorrelativeArticle)
    Next

1,这里我们可以预定义-1是取出当前频道的相关文章,也就是原来的标签,保留原有的功能。


  我们将原来函数改成

Private Function GetCorrelative(ArticleNum, TitleLen, OrderType, OpenType, Cols,theChannelID)
    Dim rsCorrelative, sqlCorrelative, strCorrelative, iCols, iTemp
    Dim strKey, arrKey, i, MaxNum
    ……省略部分代码
    sqlCorrelative = sqlCorrelative & " A.ArticleID,A.Title,A.Author,A.UpdateTime,A.Hits,A.InfoPurview,A.InfoPoint,C.ParentDir,C.ClassDir,C.ClassPurview from PE_Article A left join PE_Class C on A.ClassID=C.ClassID where "
    IF PE_Clng(theChannelID) = -1 then 
        sqlCorrelative = sqlCorrelative & " A.ChannelID=" & ChannelID
    Else
        sqlCorrelative = sqlCorrelative & " 1=1"         
    End IF
   sqlCorrelative = sqlCorrelative & " and A.Deleted=" & PE_False & " and A.Status=3 and A.ReceiveType=0"
    sqlCorrelative = sqlCorrelative & " and " & strKey & " and A.ArticleID<>" & ArticleID & " Order by "
    ……省略部分代码
End Function

  这样对这个标签的修改就基本上完成了。

ID,用|分隔,加入栏目的限制等,这里讲解的主要是标签修改的流程,进一步的处理用户可以自己尝试一下。

举报

相关推荐

0 条评论