我接受了这个EE2项目,但我没有多少经验。
我已经安装了两个插件,SessionVariables和Freebies,用于获取url段并根据其值进行操作。
所以,基本上:
{if "{exp:freebie:any name="es"}" == "true"}
Hola Mundo!
{exp:session_variables:set name="current_language" value="_es"}
{if:else}
{exp:session_variables:delete name="current_language"}
Hello World!
{/if}
奇怪的是,我去site.com/es/hello打印“Hola Mundo”,但它实际上调用了session_Variable插件的函数set()和delete()。
我让我发疯,我很感激你能提供的任何帮助。
答案 0 :(得分:4)
使用advanced conditionals in EE时,无论如何都会解析这些conitionlas中的所有标记,因为高级条件的解析时间晚于parse order中的大多数其他标记。这就是为什么在您的示例中在两个条件中调用session_variables
标记的原因(即使模板解析器仅显示第一部分内容)。
修复方法是使用“简单条件”,它们更早解析:
{if "{exp:freebie:any name="es"}" == "true"}
Hola Mundo!
{exp:session_variables:set name="current_language" value="_es"}
{/if}
{if "{exp:freebie:any name="es"}" == "false"}
{exp:session_variables:delete name="current_language"}
Hello World!
{/if}
答案 1 :(得分:1)
由于这在谷歌搜索的早期出现,我想我会提到加载项IfElse。它将返回正确的条件,失败的那些(返回false)被剥离。 Ergo只运行所需的条件。
正如Derek所说,对解析顺序的了解至关重要,在这种情况下,无论条件的有效性如何,都会调用{exp:session_variables:...}
。但是,使用IfElse,您的代码将按照需要运行,同时避免使用高级条件,因此您不仅可以在解析顺序中更早地执行所需的操作,而且还可以执行。
E.g。
{exp:ifelse parse="inward"}
{if "{exp:freebie:any name="es"}" == "true"}
Hola Mundo!
{exp:session_variables:set name="current_language" value="_es"}
{if:else}
{exp:session_variables:delete name="current_language"}
Hello World!
{/if}
{/exp:ifelse}
当"{exp:freebie:any name="es"}" == "true"
然后{exp:session_variables:set name="current_language" value="_es"}
将运行且不 {exp:session_variables:delete...}
时。好像你的代码是:
Hola Mundo!
{exp:session_variables:set name="current_language" value="_es"}
另外,这将在{exp:ifelse...}
的解析顺序发生,而不是在高级条件之后发生。
需要注意的一点是,您无法嵌套{exp:ifelse...}
。
对于相同或类似的上下文,可能还有其他附加组件,如IfElse(由同一作者查看Switchee),但这是我所知道和使用的。