ExpressionEngine отображение JS-кода в скобках {}

есть ли способ заставить механизм выражений не отображать элементы в фигурных скобках как код EE? The инструменты Google chart использует код javascript, содержащий фигурные скобки { }, и, естественно, EE думает, что это переменная и пытается ее отобразить. Как это обойти?

4 ответов


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

// 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 обрабатывается по-разному и не позволяет расширенному синтаксическому анализатору 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';


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

учитывая следующий пример кода, с $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>

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

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

<script>
    // Simple Conditionals Are Unaffected and Always Work
    {if segment_2 != ""}
        {redirect="404"}
    {/if}
</script>

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

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


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

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