【问题标题】:expressionengine variable not parsed表达式引擎变量未解析
【发布时间】:2014-07-02 17:27:44
【问题描述】:

我有两个自定义字段: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>

【问题讨论】:

  • 听起来像模板解析顺序问题。 {language_code} 是什么变量?
  • 它是一个全局变量,可以是“en”或“it”。是的,它看起来像一个模板解析器顺序问题,关于如何解决这个问题的任何想法?

标签: parsing tags expressionengine


【解决方案1】:

第二次编辑...

唉,我想不出一个解决这个问题的好方法。理想情况下,您应该创建一个共享字段组,该组跨越具有您要使用的相同字段的所有渠道(例如 title_it、title_en 等)。然后,您可以使用 EE 中的发布布局显示/隐藏相关字段,因此每个频道只会显示相关字段。从而消除了字段名称中“channel_name”的问题。

我尝试使用不同的存储方法,使用 channel_name 或 ID 作为键,但仍然会因为您需要解析两次而绊倒。

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

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

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

名为“语言标题”的新嵌入模板

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

这行得通(如果你可以这样称呼它的话),因为嵌入变量在标记对变量之前被解析,并且详细地说,language_code 也在之前被解析 - 所以保留正确命名的变量标记以供 EE 正确解析。

第一次编辑:

{{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}

注意:channel_name 是有效的,尽管没有记录 ref

但是,问题是这会假设它解析模板中的标记变量两次:一次替换{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)是在配置或 index.php 中设置全局变量,而不知道更多关于如何设置 language_code 的构建很难提供任何进一步的解决方案。

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

也别忘了ExpressionEngine's dedicated StackOverflow site

【讨论】:

  • 彼得,感谢您的详细回复。该语言基于段,我为每种语言使用不同的 index.php。变量 {language_code} 在 index.php 中的每个语言文件夹中设置为全局变量。但是,在我的情况下,{channel_name}_title_{language_code} 它是未呈现的 {channel_name},因为如果我写 {blog_title_{language_code}} 或 {news_title_{language_code}} 这有效,但如果我写 {{channel_name} _title_en} 或 {{channel_name}_title_it} 这不起作用。我需要在搜索结果中动态获取频道名称并显示条目标题。
  • 哎呀。尽管您的评论可能会提供答案:您的示例代码声明“{channel_name}_title_en”,但您的评论声明“{{channel_name}_title_en} - 前者不起作用,但后者应该因为额外的卷曲。更新了我的回答。
  • 为什么字段名中有channel_name?该条目只能属于一个通道,因此永远不能在其他“命名”通道字段中使用值。如果您跨多个渠道共享一个字段组,它们都可以使用相同的字段(例如 body_it 或 body_en)。
  • 谢谢彼得。 {{channel_name}_title_{language_code}} 是我第一次尝试,没有运气。这只会显示“{news_title_it}”。为了回答您的问题,我在字段名称中使用了频道名称,因为我必须显示在多个频道中查找的搜索结果,因此我需要根据语言显示条目正确的标题(存储在自定义字段中:{channel_name }_title_{language_code}。如果我不使用自定义字段,搜索结果将始终显示仅以英文存储的“title”。{{channel_name}_title_en} 也失败,而 {news_title_{language_code}} 有效。
  • 使用自定义字段很好,为什么要在它前面加上 {channel_name} 呢?我假设这是因为每个通道都有单独的字段组,因此不同的字段需要根据通道来识别它们。我将使用 Stash 解决方案更新我的答案,虽然不优雅,但它应该可以工作。
猜你喜欢
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多