2014-07-02 3 views
1

У меня есть два настраиваемых поля: blog_title_it и blog_title_en, чтобы разделить контент на двух разных языках в одном канале. Тегexpressionengine variable не разобран

{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> 
+0

Звучит как проблема с порядком выбора шаблона. Какая переменная {language_code}? – AllInOne

+0

это глобальная переменная, может быть «en» или «it». Да, это похоже на проблему с порядком парсера шаблонов, любую идею о том, как я могу это исправить? – guido

ответ

1

второй Edit ...

Увы, я не могу понять, хороший способ приблизиться к этому. В идеале вы бы создали общую группу полей, которая проходила по всем каналам, которые имели те же поля, которые вы хотите использовать (например, title_it, title_en и т. Д.). Затем вы могли отображать/скрывать поля как соответствующие, используя макеты публикации в EE, поэтому для каждого канала появляются только соответствующие поля. Таким образом, удаление проблемы с именем «channel_name» в имени поля.

Я пробовал играть с разными подходами к закладу, используя имя канала или идентификатор в качестве ключа, но все же он спотыкается о том, что вам нужно разобрать его дважды.

Это лучшие 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.

Мусор Решение два: Вложить подход (вероятно, хуже, производительность, чем выше!):

Main (оригинал) шаблон

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

Это работает (если вы можете это назвать), потому что переменная встраивания анализируется перед парными переменными тега и, как подробно описано, язык_кода также анализируется слишком, поэтому оставляет cor прямоугольный именованный переменный тег, готовый для правильной обработки EE.

первый Edit:

{{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} - note tha t {language_code} был бы проанализирован намного раньше, чем переменная конфигурации.Не пытаясь подтвердить это, может быть достаточно умным, чтобы сначала разобрать внутреннюю переменную, но если вы не смогли попробовать stashing as a variable first или вывести имя канала из separate plugin?

Примечание к себе: обязательно прочитайте вопрос!

Игнорируйте нижеследующее как получилось неправильную переменную, не разобрав!


Вы можете прочитать на Разбор порядка here. Но в основном теги (модули и т.д.) получить разобран до пользовательских глобальных переменных, так что ваш {LANGUAGE_CODE} становится разобран после его нужно :(

Если код примера вы дали в качестве встроенного шаблона, а затем вы можете передать переменную из предыдущего шаблона в новую, например

Корневой шаблон:

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

Затем при использовании шаблона:

{embed:language} 

Это работает, потому что порядок разбора имеет отношение к каждому шаблону - не глобально, так что первый шаблон проходит через большую часть разборе перед вложенными один.

В качестве альтернативы и, вероятно, лучшим решением (помимо используя specific module for multi-language), это установить глобальную переменную в конфиге или index.php, не зная больше о вашей сборке, как код_языка создается его трудно предложить какой-либо дальнейшие решения.

Является ли язык основанным на предпочтениях пользователя? Он основан на сегменте? Используете ли вы различный index.php для каждого языка для перезаписи URL-адреса, поэтому он отображается, но не считается сегментом?

Также не забудьте указать ExpressionEngine's dedicated StackOverflow site!

+0

Питер, спасибо за подробный ответ. Язык основан на сегменте, и я использую разные 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} это не работает. Мне нужно динамически получить имя канала в результатах поиска и показать заголовок записи. – guido

+0

ooops. Хотя ваш комментарий может дать ответ: в вашем примере кода указано «{имя_канала} _title_en», но в вашем комментарии указано «{{channel_name} _title_en} - первое не будет работать, но последнее должно быть из-за дополнительных завитушек. Ответ: –

+0

Почему у вас есть имя канала в имени поля? Запись может принадлежать только одному каналу, поэтому никогда не может использоваться полезными значениями в других полях «named». Если вы делитесь группой полей по нескольким каналам, все они могут использовать (например, body_it или body_en). –

Смежные вопросы