【问题标题】:Multiple if conditions in Movable TypeMovable Type 中的多个 if 条件
【发布时间】:2018-03-22 14:25:49
【问题描述】:

我正在开发一个 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

这些是所做的尝试(不按尝试的顺序),即使第一个条件为假,所有的都将显示为真:

<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")>

【问题讨论】:

  • 嗨,John,您的第一个“最终目标”在 MT 6.2 中对我来说效果很好。你用的是什么版本?您是否尝试过仅将该代码本身放在索引模板中以隔离问题?
  • 您好 Charlie,我们使用的是 6.3.3 版本。谢谢你的cmets。是的,我们可以很好地使用分层的最终目标,但是由于模板使用依赖于多个自定义字段(设置语言、主题、样式等),我试图将 If 语句简化为一行,而不是四个或五个(有四个或五个结束 if)。它只是想让它更简单而已。
  • 假设你很忙,但在这里评论以防我的回答没有触发通知!

标签: if-statement conditional movabletype


【解决方案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(和 Perl)非常灵活,通常有不止一种方法可以做到。希望这能让你更接近!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-20
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多