Movable Type中的多个if条件

时间:2018-03-21 12:53:11

标签: if-statement conditional movabletype

我正在开发一个Movable Type的博客项目,我绝对不会试图在if语句中获得多个条件。

最终目标与此相当:

<mt:SetVar name="foo" value="bar">
<mt:SetVar name="foo1" value="bar1">
<mt:If name="foo" eq="bar">
    <mt:If name="foo1" eq="bar1">
        <div>Foobar Hooray</div>
    </mt:If>
</mt:If>

我已经尝试了许多我能想到的常用组合,但是有一个我想念的吗?或者这在MT中是不可能的?

即使文档也没有引用多个条件。 https://movabletype.org/documentation/appendices/tags/if.html

这些是尝试(不按尝试顺序)并且所有都将显示为true,即使第一个条件为false:

<mt:If name="foo" eq="barf" && name="foo1" eq="bar1">
<mt:If (name="foo" eq="barf") && (name="foo1" eq="bar1")>
<mt:If name="foo" eq="barf" & name="foo1" eq="bar1">
<mt:If (name="foo" eq="barf") & (name="foo1" eq="bar1")>
<mt:If name="foo" eq="barf" AND name="foo1" eq="bar1">
<mt:If (name="foo" eq="barf") AND (name="foo1" eq="bar1")>
<mt:If name="foo" eq="barf" And name="foo1" eq="bar1">
<mt:If (name="foo" eq="barf") And (name="foo1" eq="bar1")>
<mt:If name="foo" eq="barf" + name="foo1" eq="bar1">
<mt:If (name="foo" eq="barf") + (name="foo1" eq="bar1")>

1 个答案:

答案 0 :(得分:1)

我的第一个嵌套条件示例在我的经验中最常用,但有几种方法可以在单个条件块中实现多个测试。

首先,我们像你一样设置变量:

<mt:Var name="foo" value="bar">
<mt:Var name="foo1" value="bar1">

最简单的测试可能是在Perl中使用test属性:

<mt:If test="$foo eq 'bar' && $foo1 eq 'bar1'">true<mt:Else>false</mt:If>
<mt:If test="$foo eq 'bar1' && $foo1 eq 'bar'">true<mt:Else>false</mt:If>

在模板中使用Perl时要格外谨慎,这样做还需要服务器安装Perl模块Safe

那就是说,如果依靠插值来测试大量变量,你可能会更容易维护:

<mt:If test='"$foo$foo1" eq "barbar1"'>true<mt:Else>false</mt:If>
<mt:If test='"$foo$foo1" eq "bar1bar"'>true<mt:Else>false</mt:If>

或者你可以通过首先组合变量(或者首先不设置foofoo1,取决于它们的值来自哪里)来执行与普通模板标签类似的操作:

<mt:SetVarBlock name="meta1"><mt:Var name="foo"><mt:Var name="foo1"></mt:SetVarBlock>
<mt:If name="meta1" eq="barbar1">true<mt:Else>false</mt:If>
<mt:If name="meta1" eq="bar1bar">true<mt:Else>false</mt:If>

这些测试的输出应该是:

true
false
true
false
true
false

为了便于阅读,您甚至应该能够在每个组件变量的单独行上构建SetVarBlock,并明智地使用strip_linefeedstrim等修饰符。

我写了很多Movable Type代码已经有一段时间了,所以可能还有其他方法。 MT(和Per​​l)非常灵活,通常不止一种方法。希望能让你更接近!