2

我有一个聪明的功能:

function smarty_function_false_() {
    return false;
}

那么如果我这样做:

{if false_} false YES?? {else} false no {/if} <br>
{if not false_} not false yes {else} not false NO??? {/if}

它评估为:

false YES??
not false NO???

我是smarty的新手,为什么会这样?

4

1 回答 1

2

Smarty 表达式{if false_}不计算任何函数。它等价于{if 'false_'},它又与 PHP 表达式相同if ( 'false_' )。(顺便说一句,if ( false_ )在 PHP 中也意味着同样的事情,除非你已经运行过define('false_', ...)。)

根据 PHP 的“类型杂耍”规则,解释为布尔值的字符串true只要不是空字符串 ( '')。所以{if false_}等价于{if true}

Smarty的“模板函数”被设计为只能被自己调用,并返回一些内容以输出到模板,例如{false_}.

在条件中检查回调的最简单方法{if}是定义“修饰符”而不是“函数”。尽管总是给修饰符至少一个参数,但可以简单地忽略它,因此您可以具有以下内容:

function smarty_modifier_false_($whatever) {
    return false;
}

然后在 Smarty 中,只需将任何旧字符串作为修饰符的左侧传递:

{if ''|false_} false_ is true!? {else} false_ is false. How reassuring. {/if}

替代方法:

  • 在模板中设置安全设置,以便您可以编写{if false_()},因为false_模板中允许直接使用 PHP 函数。(请参阅文档,了解它在{if}哪里链接到Security 的详细信息。)
  • 注册一个块函数。这些写起来有点棘手,但如果替换,您可以拥有自己的自定义,例如{if_false_} This text never appears {/if_false_}.
于 2013-09-08T22:22:28.380 回答