第二次编辑...
唉,我想不出一个解决这个问题的好方法。理想情况下,您应该创建一个共享字段组,该组跨越具有您要使用的相同字段的所有渠道(例如 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!