在 AnQiCMS 模板开发中,为了更好地控制内容的显示逻辑,我们经常需要判断某个变量的“真假”状态。这时,yesno 过滤器便是一个非常实用的工具。它能帮助我们以简洁的方式根据变量的状态输出不同的文本,甚至可以处理数字和字符串类型的变量。

yesno 过滤器旨在提供一种直观的方式来处理三元状态:是、否、以及不确定(或无值)。它的基本工作原理是将输入变量解析为一个布尔值(真或假),或者识别出变量没有明确的布尔状态(例如变量为空或不存在)。

yesno 过滤器的基本工作原理

默认情况下,yesno 过滤器会根据变量的布尔解释输出三种状态:

  • true (真):变量被评估为真时,输出 "yes"
  • false (假):变量被评估为假时,输出 "no"
  • nil 或空值:变量为 nil (空指针) 或其他被视为“空”的状态时,输出 "maybe"

值得注意的是,AnQiCMS 模板引擎在处理非布尔类型的变量时,会遵循一套“真值”和“假值”的规则。这对于数字和字符串变量的判断尤为关键:

  • 数字变量的真假判断

    • 0 (零):任何数值为 0 的变量,无论整数还是浮点数,都会被视为 false
    • 0 数字:任何非 0 的数字(包括正数、负数、小数),都会被视为 true
  • 字符串变量的真假判断

    • 空字符串 "":内容为空的字符串会被视为 false
    • 非空字符串:任何包含内容的字符串,即使是包含 "false""0""nil" 等文本的字符串,只要它不为空,都会被视为 true

灵活运用 yesno 过滤器

这个过滤器最常见的用途是在需要根据某个状态显示不同提示文本的场景。例如,一个商品是否有库存,一个用户是否在线,或一篇文章是否已发布等。

基本用法示例:

{# 假设 simple.bool_true 是一个布尔值 true #}
状态:{{ simple.bool_true|yesno }} {# 输出:yes #}

{# 假设 simple.bool_false 是一个布尔值 false #}
状态:{{ simple.bool_false|yesno }} {# 输出:no #}

{# 假设 simple.nothing 是一个空值或不存在的变量 #}
状态:{{ simple.nothing|yesno }} {# 输出:maybe #}

对数字和字符串变量的判断:

{# 数字判断 #}
库存数量:{{ 0|yesno }} {# 输出:no #}
销量:{{ 100|yesno }} {# 输出:yes #}
温度:{{ -5|yesno }} {# 输出:yes #}

{# 字符串判断 #}
用户昵称:{{ ""|yesno }} {# 输出:no #}
文章标题:{{ "AnQiCMS发布文章"|yesno }} {# 输出:yes #}
状态标记 (字符串 "false"):{{ "false"|yesno }} {# 输出:yes,因为它是一个非空字符串 #}
状态标记 (字符串 "0"):{{ "0"|yesno }} {# 输出:yes,因为它是一个非空字符串 #}

自定义输出文本

yesno 过滤器还支持自定义输出的文本。您可以通过在过滤器后面添加逗号分隔的字符串来指定三个状态对应的输出文本,顺序依次是:真值对应的文本、假值对应的文本、空值对应的文本。

自定义输出示例:

{# 自定义布尔值输出 #}
文章状态:{{ article.is_published|yesno:"已发布,草稿,待审核" }}

{# 自定义数字输出 #}
商品库存:{{ product.stock_count|yesno:"有库存,已售罄,数量未知" }}

{# 自定义字符串输出 #}
用户反馈:{{ user.feedback_content|yesno:"已提交,未提交,无内容" }}

{# 如果只提供两个自定义值,第三个(maybe)状态将使用第二个值 #}
是否启用:{{ config.is_enabled|yesno:"启用,禁用" }} {# 如果 config.is_enabled 为空,也会输出 "禁用" #}

通过这些示例,我们可以看到 yesno 过滤器不仅能处理布尔值,还能根据数字和字符串的“真假”规则进行判断并输出相应文本。这为模板的动态内容展示提供了极大的便利,让代码更加简洁和富有表现力。在设计和开发 AnQiCMS 模板时,灵活运用 yesno 过滤器将有效提升您的工作效率。

常见问题 (FAQ)

1. 为什么字符串 "false""0"yesno 过滤器中会输出 "yes" 这是因为 yesno 过滤器在判断字符串时,只关注字符串是否为空。任何非空字符串,即使其内容是表示“假”的文本如 "false" 或数字 "0",都会被视为“真”,因此会输出与 true 对应的文本(默认是 "yes")。只有当字符串完全为空 ("") 时,才会被视为“假”或“空”。

2. yesno 过滤器如何处理数字变量,例如 0100 对于数字变量,yesno 过滤器会将其转换为布尔逻辑:0 (无论是整数 0 还是浮点数 0.0) 会被视为 false,从而输出与 false 对应的文本(默认是 "no")。而任何非零的数字,无论是正数、负数还是带小数点的数字,都会被视为 true,输出与 true 对应的文本(默认是 "yes")。

3. yesno 过滤器是否可以与 if 标签一起使用来构建更复杂的逻辑? yesno 过滤器主要用于根据变量的真假状态输出不同的文本,它本身不直接控制模板的逻辑流。如果您需要进行条件判断来渲染不同的 HTML 结构或代码块,仍然应该使用 {% if ... %} 标签。例如,您可以先用 yesno 过滤器获取一个文本结果,然后在一个 if 标签中使用布尔变量来控制显示。如果变量本身就是布尔类型,直接在 if 标签中使用会更简洁。例如,{% if article.is_published %}{% if article.is_published|yesno == "yes" %} 更直接。yesno 更侧重于文本层面的输出差异。