系统标签修改流程

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

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

  标签名:{$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.asp1386行左右定义了这个这个函数:Private Function GetCorrelative(ArticleNum, TitleLen, OrderType, OpenType, Cols)

  我们可以看到这个函数的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.ChannelID=" & ChannelID & " and A.Deleted=" & PE_False & " and A.Status=3 and A.ReceiveType=0"

  也就是他取值的范围已经限制在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))

  增加一个默认参数,改为

    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

            strCorrelativeArticle = GetCorrelative(arrTemp(0), arrTemp(1), 1, 0, 1, -1)

        Case 4

            strCorrelativeArticle = GetCorrelative(arrTemp(0), arrTemp(1), arrTemp(2), arrTemp(3), arrTemp(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,用|分隔,加入栏目的限制等,这里讲解的主要是标签修改的流程,进一步的处理用户可以自己尝试一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值