自定义标签的嵌套可以分为两种形式
一、一个自定义标签作为参数传递给另外一个自定义标签。
二、在自定义的内容里面引用另外一个自定义标签。
下面我们分别就两种情况举两个例子。
1、一个自定义标签作为参数传递给另外一个自定义标签。
例子:在文章内容页取出该作者发表的其他文章。
我们增加两个自定义标签,第一个自定义标签取出当前文章的录入者,然后把录入者传递给第二个自定义标签,用第二个标签取出该录入者的其他文章。
说到这里,可能有些人会有这样的疑问,为什么要用自定义标签取出当前文章的录入者,当前文章录入者不是有了{$Inputer}这个系统标签了吗?直接把这个系统标签传递给第二个标签不就可以了?事实上并不是这样的,能作为参数传递给自定义标签的,只有几个特殊的系统标签,这个可以参考之前的章节,如果直接把{$Inputer}作为参数传递给自定义标签,那么会出现SQL查询错误的提示。这里,我们就可以看到自定义标签的一个优点,只要定义好优先级,自定义标签之间就可以相互嵌套
标签一:取出文章的录入者
添加标签如下:
标签设置如下:
SQL语句:select Inputer from PE_Article where ArticleID={input(0)}
参数:一个
优先级:1(注意标签的优先级)
点击进入下一步
在标签内容中插入inputer字段,也就是将标签内容设置成:
{Loop}{Infobegin}{$Field(0,Text,0,0,0)}{Infoend}{/Loop}
这样第一个标签就添加好了,下面我们来添加第二个标签。
标签二:取出录入这的其他文章:
标签设置如下:
SQL语句:select title from PE_Article where Inputer ='{input(0)}'
参数:一个
优先级:2(注意这里的优先级)
然后进入标签的下一步
我们这里也简单的取出文章的标题作为例子
标签内容设置如下:{Loop}{Infobegin}{$Field(0,Text,0,0,0)}{Infoend}{/Loop}
这样我们两个标签就都添加好了。
两个标签之间怎么嵌套呢?这个是在调用的时候体现的,比如以上例子的两个标签,我们可以这样嵌套调用:{$MY_取文章({$MY_取录入者({$ArticleID})})}
这里看起来可能比较复杂,下面我们来将这个标签分一下层次:
首先最先解析的是{$ArticleID},这个系统标签在自定义标签解析前解析,为了方便讲解,假设当前文章的文章ID是5,解析完这个标签之后,标签成了{$MY_取文章({$MY_取录入者(5)})}
接下来,这两个自定义标签哪个先解析呢?这个就跟标签的优先级有关了,优先级小的优先解析,也就是这里会先解析{$MY_取录入者(5)},这里是取出文章ID是5的录入者,我们这里假设这个录入者是路人甲。那么解析完这个标签之后,标签成了{$MY_取文章(路人甲)}
最后解析{$MY_取文章(路人甲)},取出路人甲的其他文章。这个应该就不需要再解释了。
2. 在自定义的内容里面引用另外一个自定义标签。
这种引用可能一般用户用的比较少,可是由于比较实用,我在这里也讲解一下。
这里还是以一个例子为切入点
例子:用自定义标签取出所有频道的一级栏目,按照下面的方式来显示
文章频道:栏目一|栏目2|栏目3|栏目4……
软件频道:栏目一|栏目2|栏目3|栏目4……
图片频道:栏目一|栏目2|栏目3|栏目4……
…………
这样的情况能不能用自定义标签来实现呢?答案是肯定的。
有些用户或者有这样的解决方法:文章频道的栏目添加成一个标签,软件频道的栏目添加成一个标签,图片频道的栏目添加成一个标签,每行调用一个标签。这种做法也是可行的,不过,有多少个频道就需要增加多少个自定义标签,不够灵活。下面我来讲解一下如何通过标签内容的嵌套来实现这样的显示方式。
思路是这样的:增加两个自定义标签,第一个自定义标签取出所有的频道,第二个自定义标签取出指定频道的所有一级栏目。然后第一个标签的标签内容里面引用第二个标签。
我们分别来增加这两个标签:
先增加标签:取出指定频道的所有一级栏目
标签设置如下:
SQL语句我们设置成select * from PE_Class where ChannelID={input(0)} where ParentID=0,也就是只要传入了参数ChannelID,这个标签就取出这个ChannelID对应的一级栏目
参数:一个
优先级:这里可以随便设置,我设置成5
然后进入下一步标签内容设置
这里我们内容设置成
{Loop}
{Infobegin}
{$Field(2,Text,0,0,0)}|
{Infoend}
{/Loop}
然后点击完成。
下面我们来添加另外一个标签
添加标签:循环所有频道
标签设置如下
这里我们是添加成动态标签,所以不用设置参数。
SQL语句如下:select * from PE_Channel
优先级也可以随便设置
然后我们进入标签的第二步:
这里我们看一下标签内容
{Loop}
{Infobegin}
{$Field(0,Text,0,0,0)}:{$MY_取一级栏目({$Field(1,Text,0,0,0)})}
{Infoend}
{/Loop}
可以看到标签的内容是:
{$Field(0,Text,0,0,0)}: {$MY_取一级栏目({$Field(1,Text,0,0,0)})}
这里我们看到冒号前面是:{$Field(0,Text,0,0,0)},这个对应频道的名称
冒号后面是:{$MY_取一级栏目({$Field(1,Text,0,0,0)})}
{$MY_取一级栏目(参数)}是我们刚才添加的标签,{$Field(1,Text,0,0,0)}这个是ChannelID对应的字段,代表频道ID,我们这里是将ChannelID这个字段插入到{$MY_取一级栏目(参数)}这个标签中做为参数了,我们可以这样理解:
{$MY_循环频道}这个标签的作用是循环取出所有的频道,他每取出一个频道,就把对应的频道ID传递给{$MY_取一级栏目(参数)}标签作为参数,取出这个频道的所有一级栏目
这样的话我们的目的就达到了。 |