ExpressionEngine отображает код JS с помощью {} скобок - PullRequest
6 голосов
/ 29 июня 2011

Есть ли способ заставить механизм выражения НЕ отображать элементы в фигурных скобках как код EE? Инструменты Google для диаграмм используют код JavaScript, содержащий фигурные скобки {}, и, естественно, EE считает, что это переменная, и пытается ее отобразить. Есть ли способ обойти это?

Ответы [ 4 ]

19 голосов
/ 29 июня 2011

ExpressionEngine Шаблонный класс анализирует фигурные скобки {} как переменные шаблона , ища три вида переменных: одиночные, парные и условные переменные:

// Single Variable
{summary}

// Pair Variable
{category} ... {/category}

// Conditional Variable
{if segment_2 != ""} ... {/if}

Фигурные скобки в CSS считаются особым условием.

Например, следующий CSS * приемлем для размещения в любом месте шаблона и получает интеллектуальный анализ :

<style>
    /* All On One Line = Okay */
    p { margin-bottom: 1em; }

    /* Indented and On Separate Lines = Also Okay */
    p em {
        font-style: italic;
    }

    /* EE Variables are Parsed and Replaced */
    p.{site_name} {
        text-decoration: none;
        }

    /* EE Code is Allowed and Parsed Appropriately */
    {exp:channel:entries channel="channel_name" limit="1"}
        li.{url_title} a {
            color: #c00;
        }
    {/exp:channel:entries}
</style>

К сожалению, JavaScript обрабатывается по-другому и не позволяет парсеру Advanced Conditionals обрабатывать что-либо в тегах.Например, следующий JavaScript с фигурными скобками в одной строке :

<script>var addthis_config = { 'ui_click': true };</script>

будет проанализирован ExpressionEngine как переменная шаблона и будет отображаться как:

<script>var addthis_config = ;</script>

Вы заметите все, начиная с открытия { и заканчивая закрывающей фигурной скобкой }, анализируется и заменяется!В качестве обходного пути вы можете поместить фигурные скобки в отдельные строки и избежать этой проблемы:

<script>
    var addthis_config = {
        'ui_click': true,
        'data_track_clickback': true
    };
</script>

Если вы написали функцию JavaScript, которая ожидает значения от ExpressionEngine, просто поместите фигурные скобки в отдельные строки - что хорошее соглашение о кодировании и оптимально для удобочитаемости :

<script>
    $(document).ready(function() {
        ...
            {exp:channel:entries channel="channel_name" limit="1"}
                var business_name = '{business_website}';
                var business_website = '{business_website}';
            {/exp:channel:entries}
        ...
    });
</script>

Как предложил Бен, вы можете изменить это поведение, установив Скрытую переменную конфигурации: $conf['protect_javascript'] = 'n';

8 голосов
/ 30 сентября 2011

Что на самом деле делает скрытый $config['protect_javascript'] ExpressionEngine?Это, вероятно, лучше всего объяснить на примере - позвольте мне проиллюстрировать.

Учитывая следующий пример кода, с $config['protect_javascript'] = 'y'; расширенные условия будут полностью проигнорированы:

<script>
    {if username == "admin"}
        Welcome, {username}!
    {if:elseif member_id == "2"}
        Welcome, {screen_name}!
    {if:else}
        Welcome, Guest!
    {/if}
</script>

, что даст следующееВывод:

<script>
    Welcome, admin!

    Welcome, Administrator!

    Welcome, Guest!
</script>

Принимая во внимание, что когда $config['protect_javascript'] = 'n'; тот же фрагмент кода сверху позволит оценивать расширенные условия и будет производить:

<script>
    Welcome, admin!
</script>

AsВы можете видеть, разница в том, оцениваются ли расширенные условия в блоках кода JavaScript .

Простые условия и шаблонтеги всегда оцениваются в тегах <script>, независимо от значения $config['protect_javascript'] - просто убедитесь, что фигурные скобки {} размещены на отдельных строках!

<script>
    // Simple Conditionals Are Unaffected and Always Work
    {if segment_2 != ""}
        {redirect="404"}
    {/if}
</script>
0 голосов
/ 11 февраля 2017

Создайте глобальную переменную, которая будет содержать ваш код JS. Затем просто используйте глобальную переменную в вашем шаблоне:

https://docs.expressionengine.com/v2/templates/globals/index.html

0 голосов
/ 23 сентября 2015

Простое размещение фигурных скобок на отдельных строках у меня почему-то не сработало (я использую EE v2.1.1).Но размещение закомментированной строки до и после скобок сработало.Например, для моего кода Google Analytics:

<script>
(function(i,s,o,g,r,a,m)
//
{
//
i['GoogleAnalyticsObject']=r;i[r]=i[r]||function()
//
{
//
(i[r].q=i[r].q||[]).push(arguments)
//
}
//
,i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
//
}
//
)(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-3636230-46', 'auto');
ga('send', 'pageview');
</script>
...