expressionengine变量未解析

时间:2014-07-02 17:27:44

标签: parsing tags expressionengine

我有两个自定义字段:blog_title_it和blog_title_en,用于在同一频道中分隔两种不同语言的内容。 标签

{blog_title_{language_code}}

按预期工作,而

{channel_name}_title_{language_code}

渲染

blog_title_en

我该如何解决这个问题?这是我的代码:

    <ul>
    {exp:search:search_results search_in="everywhere"}
    {if language_code =="it"}
        <li><a href="{exp:replace_plus find='.com/' replace='.com/it/'}{auto_path}{/exp:replace_plus}">{channel_name}_title_{language_code}</a> (trovato in {channel}) {channel_name}_body_{language_code}</li>
    {if:else}
        <li"><strong><h3><a href="{auto_path}">{channel_name}_title_{language_code}</a></h3></strong> (from {channel}){channel_name}_body_{language_code}</li>
    {/if}
    {/exp:search:search_results}
    </ul>

1 个答案:

答案 0 :(得分:1)

第二次编辑...

唉,我无法找到解决这个问题的好方法。理想情况下,您可以创建一个共享字段组,该组遍历所有具有您想要使用的相同字段的频道(例如title_it,title_en等)。然后,您可以使用EE中的发布布局显示/隐藏相关字段,因此仅显示每个通道的相关字段。因此,在字段名称中删除了“channel_name”的问题。

我尝试使用不同的存储方法,使用channel_name或ID作为键,但是它仍然偶然发现你需要解析它两次。

这些是我能想到的最好的2个想法......

垃圾解决方案一:基本方法:

<ul>
  {exp:search:search_results search_in="everywhere"}
    {if language_code =="it"}
      <li>
        <a href="{exp:replace_plus find='.com/' replace='.com/it/'}{auto_path}{/exp:replace_plus}">
          {if {channel_name} == "A"}
            {A_title_{language_code}}
        </a> (trovato in {channel}) {A_body_{language_code}}
          {if:elseif {channel_name} == "B"}
            {B_title_{language_code}}
        </a> (trovato in {channel}) {B_body_{language_code}}
          {if:elseif {channel_name} == "C"}
            {C_title_{language_code}}
        </a> (trovato in {channel}) {C_body_{language_code}}
          {/if}
      </li>
    {if:else}
      <li>
        {if {channel_name} == "A"}
          <strong><h3><a href="{auto_path}">{A_title_{language_code}}</a></h3></strong> (from {channel}){A_body_{language_code}}
        {if:elseif {channel_name} == "B"}
          <strong><h3><a href="{auto_path}">{B_title_{language_code}}</a></h3></strong> (from {channel}){B_body_{language_code}}
        {if:elseif {channel_name} == "C"}
          <strong><h3><a href="{auto_path}">{C_title_{language_code}}</a></h3></strong> (from {channel}){C_body_{language_code}}
        {/if}
      </li>
    {/if}
  {/exp:search:search_results}
</ul>

如果您使用Stashee,这可能会更好。

垃圾解决方案二:嵌入式方法(可能性能比上面差!):

主要(原始)模板

<ul>
  {exp:search:search_results search_in="everywhere"}
    {if language_code =="it"}
      <li><a href="{exp:replace_plus find='.com/' replace='.com/it/'}{auto_path}{/exp:replace_plus}">{embed=crap/language-title entry_id="{entry_id}" channel_name="{channel_name}"}</a> (trovato in {channel}) {embed=crap/language-title entry_id="{entry_id}" channel_name="{channel_name}"}</li>
    {if:else}
      <li"><strong><h3><a href="{auto_path}">{embed=crap/language-title entry_id="{entry_id}" channel_name="{channel_name}"}</a></h3></strong> (from {channel}){embed=crap/language-title entry_id="{entry_id}" channel_name="{channel_name}"}</li>
    {/if}
  {/exp:search:search_results}
</ul>

名为“language-title”的新嵌入模板

{exp:channel:entries entry_id="{embed:entry_id}" cache="yes" refresh="60"}
    {{embed:channel_name}_title_{language_code}}
{/exp:channel:entries}

这是有效的(如果你可以调用它),因为embed变量在标记对变量之前进行了解析,并且详细说明,之前也会解析language_code - 所以保留正确命名的变量标记,以便EE正确解析。 / p>

第一次编辑:

{{channel_name}_title_{language_code}}不是{channel_name}_title_{language_code}

{if language_code =="it"}
    <li><a href="{exp:replace_plus find='.com/' replace='.com/it/'}{auto_path}{/exp:replace_plus}">{{channel_name}_title_{language_code}}</a> (trovato in {channel}) {{channel_name}_body_{language_code}}</li>
{if:else}
    <li"><strong><h3><a href="{auto_path}">{{channel_name}_title_{language_code}}</a></h3></strong> (from {channel}){{channel_name}_body_{language_code}}</li>
{/if}

注意:虽然未记录ref

,但channel_name有效

但是,问题是这会假设它在模板中解析标签变量两次:一次替换{channel_name},然后再次解析结果{{channel_name}_title_it} - 请注意{language_code}会已被解析为更早的配置变量。没有尝试确认它可能足够聪明,可以先解析内部变量,但如果没有,您可以尝试stashing as a variable first或从separate plugin输出频道名称?

自我注意:必须阅读问题!

忽略以下内容,因为错误的变量没有解析!


您可以阅读有关Parse order here的更多信息。但基本上标签(模块等)在自定义全局变量之前被解析,所以你的{language_code}在需要之后就被解析了:(

如果您给出的示例代码位于嵌入式模板中,那么您可以将前一个模板中的变量传递给新模板,例如

根模板:

{embed=template-group/template-name language="{language_code}"}

然后在模板中使用:

{embed:language}

这是有效的,因为解析顺序与每个模板相关 - 不是全局的,因此第一个模板在嵌入的模板之前经过大部分解析。

或者也许最好的解决方案(除了使用specific module for multi-language之外)是在config或index.php中设置全局变量,而不了解更多关于如何设置language_code的构建它是很难提供任何进一步的解决方案。

语言是否基于用户偏好?它是基于细分市场吗?你是否使用不同的index.php为每种语言重写网址,所以它出现但不被视为一个细分?

另请不要忘记ExpressionEngine's dedicated StackOverflow site