# 解析上下文

系统生成页面时将根据上下文来解析 STL 标签,例如,内容模板中使用标签 <stl:content type="title"></stl:content> 获取内容的标题,系统在解析这段代码的时候会使用当前内容作为上下文,从而解析出正确的数据。

通常,根据默认的上下文能获取到正确的结果,但有些情况下,需要通过属性重新定义上下文。例如,我们希望在内容中获取栏目名称,可以使用标签 <stl:channel type="title"></stl:channel> 获得数据,但如果我们希望显示的不是内容所属的栏目名称,而是特定的栏目名称时,通过默认的上下文就无法实现了,这时我们需要通过属性 channelIndex 来指定栏目:<stl:channel channelIndex="栏目索引" type="title"></stl:channel>

我们可以通过属性来指定上下文,也可以通过容器标签来指定上下文,我们甚至能通过站点标签在切换网站;同时我们还可以通过条件判断标签来获取当前所处的上下文,下面分别进行说明。

# 通过属性切换上下文

# channelIndex 栏目索引

栏目索引是一个站点中栏目的标识,具有唯一性。

如果设置了 channelIndex 属性,系统将寻找对应索引的栏目并将上下文切换到此栏目。

<!-- 链接到首页 -->
<stl:a channelIndex="首页"></stl:a>

# channelName 栏目名称

栏目名称可以重复,所以应该尽量避免使用栏目名称来切换上下文,但是如果 channelName 与 channelIndex 属性配合使用,系统将首先定位到 channelIndex 索引所在的栏目,之后再寻找此栏目下栏目名称为 channelName 的栏目。

<!-- 链接到当前栏目下的名称为“栏目名称”的栏目 -->
<stl:a channelName="栏目名称"></stl:a>
<!-- 链接到“栏目索引”下的名称为“栏目名称”的栏目 -->
<stl:a channelIndex="栏目索引" channelName="栏目名称"></stl:a>

# parent 父栏目

将上下文切换到当前栏目的上一级栏目。

  • "true" 表示切换到当前栏目的上一级栏目,等价于 upLevel="1"。
  • "false" 表示不切换到当前栏目的上一级栏目。

如果同时设置了 parent 以及 channelIndex 属性,系统将首先定位到 channelIndex 栏目索引所在的栏目,之后再切换到对应栏目的上级栏目。

<!-- 链接到当前栏目的上一级栏目 -->
<stl:a parent="true"></stl:a>

# upLevel 上 N 级栏目

切换到上级栏目,1 为上一级栏目,2 为上两级栏目,以此类推。

如果同时设置了 upLevel 以及 channelIndex 属性,系统将首先定位到 channelIndex 栏目索引所在的栏目,之后再切换到对应栏目的上 N 级栏目。

<!-- 链接到当前栏目的上两级栏目 -->
<stl:a upLevel="2"></stl:a>

# topLevel 第 N 级栏目

切换到从首页向下第 N 个级别的栏目,0 代表切换到首页,1 代表一级栏目,2 代表二级栏目,以此类推。

<!-- 链接到一级栏目 -->
<stl:a topLevel="1"></stl:a>

# context 列表上下文

通常如果标签被嵌套在列表元素中时,系统会设置上下文为当前的列表类型,同时对标签进行解析时也将根据列表类型进行判断,如将 <stl:a></stl:a> 放到内容列表以及栏目列表中时,stl:a 标签的链接会分别显示内容的连接以及栏目的连接。

如果希望<stl:a></stl:a>标签无论在内容列表还是栏目列表都只显示栏目链接,可以设置 context 属性为 Channel:<stl:a context="channel"></stl:a>

  • "default" 默认,即当前所处上下文。
  • "content" 内容上下文。
  • "channel" 栏目上下文。
  • "sqlContent" Sql 内容上下文。
  • "site" 站点上下文。
<!-- 分别显示栏目与内容链接 -->
<stl:channels>
  <stl:contents>
    栏目:<stl:a context="channel"></stl:a>
    内容:<stl:a></stl:a>
  </stl:contents>
</stl:channels>

# 通过 <stl:container> 元素切换上下文

如果希望一段代码无论放到什么位置,都解析为同样的结果,可以使用 <stl:container>将这段代码嵌套进来并设置属性指定的上下文。请参考:<stl:container> 容器元素

<stl:container channelIndex="栏目索引">
  栏目:<stl:channel type="title"></stl:channel>
  此栏目下的内容:
  <stl:contents>
    <stl:a></stl:a>
  </stl:contents>
</stl:container>

# 通过 <stl:site> 元素切换网站

如果在本站点的模板中显示其他站点的数据,可以通过<stl:site> 元素切换站点,此元素中嵌套的标签都将解析为指定站点的数据。请参考:<stl:site> 站点元素

<stl:site siteDir="MySite">
  ...
</stl:site>

# 通过 <stl:if> 判断上下文

如果希望对上下文进行判断,从而使用不同的标签,可以通过<stl:if> 元素判断上下文,根据判断结果嵌套不同的标签。请参考:<stl:if> 判断元素

# 判断当前栏目名称是否为"栏目名称"

<stl:if type="ChannelName" op="Equals" value="栏目名称">
  <stl:yes> <p>true</p> </stl:yes>
  <stl:no> <p>false</p> </stl:no>
</stl:if>

# 根据模板类型显示不同内容

下面的例子判断当前模板是不是内容模板。

<stl:if type="TemplateType" op="Equals" value="ContentTemplate">
  <stl:yes>
      这是内容页面
  </stl:yes>
  <stl:no>
      这不是内容页面
  </stl:no>
</stl:if>

# 根据模板名称显示不同内容

下面的例子根据当前模板的模板名称显示不同的内容。

<stl:if type="TemplateName" op="Equals" value="系统首页模板">
  <stl:yes>
      <li><A href="/" class="current">首 页</A></li>
  </stl:yes>
  <stl:no>
      <li>我不是首页</li>
  </stl:no>
</stl:if>
上次更新: 2021/10/18 下午9:03:07