# <stl:if> 条件判断

<stl:if
  type="测试类型"
  op="测试操作"
  value="测试值"
  yes="判断成功输出值"
  no="判断失败输出值"
  context="所处上下文"
  onBeforeSend="动态判断发送前执行的JS代码"
  onSuccess="动态判断成功后执行的JS代码"
  onComplete="动态判断结束后执行的JS代码"
  onError="动态判断失败后执行的JS代码"
>
</stl:if>

# 说明

通过 stl:if 标签在模板中根据条件判断显示内容

stl:if 通常作为显示的判断条件,如果条件满足则显示,条件不满足则不显示。

stl:if 标签内可以嵌入任意代码,当条件满足时将显示嵌入的代码。如果需要根据测试是否成功显示不同的结果,需要使用子标签 <stl:yes> 和 <stl:no> ,测试条件成功时将显示 <stl:yes> 中的内容,测试条件失败时将显示 <stl:no> 中的内容。

type 属性指定测试类型,如测试栏目名称、模板名称、当前栏目是否属于指定栏目级别等。

如果需要判断自定义内容属性"XYZ",也可以将 type 设置为" XYZ",系统将根据上下文判断栏目或内容的字段"XYZ"的值。

op 属性为测试操作,如是否值等于、不等于、大于、小于、属于等。

value 属性指定测试值,如 op="Equals" value="123"(判断指定条件的值是否等于 123)。

如果 type 为"AddDate"或"LastEditDate",value 可以采用时间段格式"数字+日期符号",如"1y"、"3m"或"10d",分别代表一年、三个月及十天内添加或编辑的内容。

<stl:if> 标签对应的实体为{stl:if},使用实体写法时,需用同时使用属性 yes 或者 no,用以告诉系统当判断成功或失败时显示的值。

# 子标签

下表显示此标签所有的子标签。

子标签 说明
stl:yes 测试成功显示模板,可以省略,可使用属性 yes 替代
stl:no 测试失败显示模板,可使用属性 no 替代

# 属性

属性 说明
type 测试类型
op 测试操作
value 测试值
yes 判断成功输出值
no 判断失败输出值
context 所处上下文

# type - 测试类型

设置用于 if 测试的类型。

  • "IsUserLoggin" 用户是否已登录
  • "IsAdministratorLoggin" 管理员是否已登录
  • "IsUserOrAdministratorLoggin" 用户或管理员是否已登录
  • "UserGroup" 用户组
  • "ChannelName" 栏目名称
  • "ChannelIndex" 栏目索引
  • "TemplateName" 模板名称
  • "TemplateType" 模板类型,可能的 value 值:
    • "IndexPageTemplate" 首页模板
    • "ChannelTemplate" 栏目模板
    • "ContentTemplate" 内容模板
    • "FileTemplate" 单页模板
  • "TopLevel" 栏目级别
  • "UpChannel" 上级栏目
  • "Current" 当前栏目或上级栏目
  • "UpChannelOrSelf" 当前栏目或上级栏目
  • "Self" 当前栏目
  • "GroupChannel" 栏目组名称
  • "GroupContent" 内容组名称
  • "IsTop" 内容属性为置顶
  • "IsRecommend" 内容属性为推荐
  • "IsHot" 内容属性为热点
  • "IsColor" 内容属性为醒目
  • "Channels" 判断子栏目数量,也可用于判断是否存在子栏目
  • "Contents" 判断内容数量,也可用于判断是否存在内容
  • "ImageContents" 判断图片内容数量,也可用于判断是否存在图片内容
  • "Images" 判断图片数量,也可用于判断是否存在图片
  • "Videos" 判断视频数量,也可用于判断是否存在视频
  • "Files" 判断附件数量,也可用于判断是否存在附件
  • "AddDate" 添加时间
  • "LastEditDate" 最后编辑时间(仅用于判断内容)
  • "ItemIndex" 当前项序号
  • "OddItem" 是否为奇数项
  • "自定义字符串" 栏目或内容的字段名称

# op - 测试操作

设置用于 if 测试的比较操作。

  • "Empty" 值为空
  • "NotEmpty" 值不为空
  • "Equals" 值等于
  • "NotEquals" 值不等于
  • "GreatThan" 值大于
  • "LessThan" 值小于
  • "In" 值属于
  • "NotIn" 值不属于
  • "Contains" 值包含
  • "NotContains" 值不包含

# value - 测试值

设置用于 if 测试的比较值。

# yes - 判断成功输出值

设置用于 if 测试成功时需要显示的值。

# no - 判断失败输出值

设置用于 if 测试失败时需要显示的值。

# context - 所处上下文

  • "Content" 内容
  • "Channel" 栏目
  • "SqlContent" 获取数据库数据

# Js脚本事件

<stl:if> 标签动态判断是由Ajax来实现的,页面通过Js发起动态请求,服务器返回请求结果并显示在页面中。

动态内容由于通过Ajax加载,会有一定的延迟,我们可以通过定义Ajax事件来进行精确控制。

这是Ajax事件的完整列表,以及它们被触发的顺序。每个动态请求都会触发事件。

TIP

Js脚本事件可以是一段可运行的Js代码,也可以是一个Js函数,如果是函数,请在函数名后加()以确保函数能够运行。

# onBeforeSend

这个事件是在Ajax请求启动之前触发的,它允许你再动态访问之前进行预处理操作。

在此事件中可以直接调用以下参数:

  • containerId:动态加载完毕后将更新的HTML 元素的Id

# onSuccess

此事件仅在请求成功时调用(服务器没有错误,数据没有错误)。

在此事件执行完毕后,页面才会更新数据,可以通过 onSuccess 事件对返回的数据进行调整。

在此事件中可以直接调用以下参数:

  • containerId:动态加载完毕后将更新的HTML 元素的Id
  • data:返回的结果数据
  • status:返回的 HTTP 状态码

# onError

此事件仅在请求发生错误时调用(对于请求,永远不能同时有错误和成功回调)。

在此事件中可以直接调用以下参数:

  • containerId:动态加载完毕后将更新的HTML 元素的Id
  • err:错误信息
  • status:返回的 HTTP 状态码

# onComplete

不管请求是否成功,都会调用此事件。这个事件是最后触发的,可以通过 onComplete 事件对已更新的页面元素进行调整。

  • containerId:动态加载完毕后将更新的HTML 元素的Id
  • err:错误信息
  • data:返回的结果数据
  • status:返回的 HTTP 状态码

# 示例

# 判断循环栏目是否为当前栏目

下面的例子判断栏目是否为当前栏目或者当前栏目的上级栏目,如果是则增加 class 类。

<stl:channels topLevel="1">
  <stl:if type="Current">
    <stl:yes>
      <li class="active"><stl:a></stl:a></li>
    </stl:yes>
    <stl:no>
      <li><stl:a></stl:a></li>
    </stl:no>
  </stl:if>
</stl:channels>

我们可以使用实体的写法简化,以下写法与上面的写法效果是一样的:

<stl:channels topLevel="1">
  <li class="{stl:if type=current yes=active}"><stl:a></stl:a></li>
</stl:channels>

# 判断值是否为空

下面的例子判断内容副标题是否为空,如果不为空将显示带有副标题的行。

<stl:if type="SubTitle" op="NotEmpty">
  <strong>副标题:</strong><stl:content type="SubTitle"></stl:content>
</stl:if>

# 判断当前栏目名称

<stl:if type="ChannelName" op="In" value="栏目1,栏目2">
  <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>

# 突出显示 10 天内更新的内容

下面的例子显示整个站点中最新更新的 20 篇内容,并突出显示 10 天内更新的内容。

<stl:contents topLevel="0" totalNum="20" order="LastEditDate" scope="All">
  <stl:if type="LastEditDate" op="LessThan" value="10d">
    <stl:yes>
      <li><stl:a target="_blank" style="color:#F00;"></stl:a></li>
    </stl:yes>
    <stl:no>
      <li><stl:a target="_blank"></stl:a></li>
    </stl:no>
  </stl:if>
</stl:contents>

# 判断用户是否登录

下面的例子根据用户是否登录显示不同的内容

<stl:if type="IsUserLoggin">
  <stl:yes>
    欢迎"{user.displayName}"
    <stl:a href="{stl.HomeUrl}">用户中心</stl:a>
    <stl:a href="{stl.LogoutUrl}">退出</stl:a>
  </stl:yes>
  <stl:no>
    <stl:a href="{stl.LoginUrl}">登陆</stl:a>
    <stl:a href="{stl.RegisterUrl}">注册</stl:a>
  </stl:no>
</stl:if>

# 判断是否存在子栏目

下面的例子显示导航栏列表,如果栏目不存在子栏目,则显示本栏目链接,否则显示子栏目链接列表

<stl:channels topLevel="0" group="主导航">
  <div class="footer-nav-item">
    <stl:a>{Channel.Title}</stl:a>
    <stl:if type="channels">
      <stl:yes>
        <ul>
          <stl:channels>
            <li>
              <stl:a><span>{Channel.Title}</span></stl:a>
            </li>
          </stl:channels>
        </ul>
      </stl:yes>
      <stl:no>
        <ul>
          <li>
            <stl:a><span>{Channel.Title}</span></stl:a>
          </li>
        </ul>
      </stl:no>
    </stl:if>
  </div>
</stl:channels>
上次更新: 2023/3/27 下午3:17:32