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>