【问题标题】:Why is this Smarty if statement always evaluating true?为什么这个 Smarty if 语句总是评估为真?
【发布时间】:2014-10-31 19:01:57
【问题描述】:

这个:

{1234|count_characters}

输出:

4

很好。但是这个:

{if 12345|count_characters == 4}
    it's 4
{/if}

输出it's 4。上面的 if 语句显然应该评估为 false。为什么它总是评估为真?

count_characters smarty 修饰符仅显示字符串或数字中的字符数:

http://www.smarty.net/docsv2/en/language.modifier.count.characters.tpl

【问题讨论】:

  • 因为{x|y} 语法是echo y(x) 的智能短代码...。其中echo 很重要...但是,{if y|x ==4 } 相当于按位执行or (|) 在x 和y 上(12345|count_characters 为真,因为12345 为真),将该操作的结果与4(真 == 4,松散类型)进行比较,然后如果为真,等等
  • @MarkBaker 好的,所以现在我这样做了:{if (12345|count_characters) == 4}it's 4{/if},它不再评估为真,很好,但现在也不是{if (1234|count_characters) == 4}it's 4{/if}。任何应该如何做的例子? -谢谢
  • 要使用 smarty 做你想做的事,请在模板中启用 PHP 或切换到不同的模板引擎

标签: php smarty smarty2


【解决方案1】:

因为{x|y} 语法是echo y(x).... 的智能短代码,其中echo 很重要

但是,{if y|x ==4 } 相当于在 x 和 y 上执行按位 or (|)(12345|count_characters 为真,因为 12345 为真,即使 count_characters 为真作为常量进行测试,如果常量不存在,则作为字符串文字,同时发出通知),将该操作的结果与4(真 == 4,松散类型)进行比较,然后如果为真,等等

【讨论】:

    【解决方案2】:

    Smarty 不是一种编程语言;它是一种模板标记语言。您采用了一个输出过滤器并尝试将其用作条件中的通用函数。那是行不通的。

    你应该在 PHP 脚本中保留这样的逻辑。

    【讨论】:

      【解决方案3】:

      这里的问题是你如何使用它。

      如果你在 PHP 中分配这个变量:

       $smarty->assign('var',12345);
      

      并使用此代码(如果要确保其正常工作,则需要额外的代码):

      {if $var|count_characters == 4}
          it's 4
      {elseif $var|count_characters == 5}
          it's 5
      {/if}
      

      您将得到 it's 5 的输出 - 应该是这样。

      如果你没有在 PHP 中分配任何东西,而是在 Smarty 中分配它,如下代码所示:

      {assign var="var" value="12345"}
      
      {if $var|count_characters == 4}
          it's 4
      {elseif $var|count_characters == 5}
          it's 5
      {/if}
      

      你会得到it's 5 - 应该是这样。

      正如@MarkBaker 在您使用12345|count_characters 时提到的那样,代码是按位运算符计算的,这里的函数count_characters 实际上不是一个函数-它从未启动过,您可以在此处编写任何您想要的内容,例如:

      {if 12345|count_charact87172368716832ers == 4}
          it's 4
      {/if}
      

      即使显然没有count_charact87172368716832ers 修饰符,您也会得到it's 4。

      要使其按您的意愿工作,您应该在 PHP 中分配变量(如我在第一个代码中所示)或在 Smarty 中分配变量(如我在第二个代码中所示)或在字符串上使用 count_characters 修饰符而不是诠释:

      {if '12345'|count_characters == 4}
          it's 4
      {elseif '12345'|count_characters == 5}
          it's 5
      {/if}
      

      此代码将按预期工作 - 您将获得 it's 5

      【讨论】:

        猜你喜欢
        • 2015-12-07
        • 2013-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-06
        相关资源
        最近更新 更多