Помощь в использовании тегов и условий шаблона ExpressionEngine

Я взялся за этот проект 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», но на самом деле вызывает как функцию set(), так и delete() плагина session_Variable.

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

http://www.putyourlightson.net/projects/session_variables

https://github.com/averyvery/Freebie


person KenSharp    schedule 07.06.2011    source источник


Ответы (2)


При использовании расширенных условных выражений в EE все теги внутри этих условий обрабатываются независимо, т.к. расширенные условия анализируются позже, чем большинство других тегов в порядке разбора. Вот почему тег 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}
person Derek Hogue    schedule 07.06.2011

Поскольку это появилось довольно рано в поиске Google, я решил упомянуть надстройку IfElse. Он вернет правильное условие, те, которые не срабатывают (возвращают false), удаляются. Следовательно, выполняется только желаемое условие.

Как сказал Дерек, знание порядка синтаксического анализа жизненно важно, в этом случае оба вызова {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 того же автора) для тех же или похожих контекстов, но это то, что я знаю и использую.

person notacouch    schedule 14.11.2012