ExpressionEngine使用{}括号呈现JS代码

Ada*_*dam 6 javascript expressionengine

有没有办法强制表达引擎不将大括号内的项目呈现为EE代码?在谷歌图表工具使用包含花括号{} javascript代码,自然EE认为它是一个变量,并试图对其进行渲染.有什么方法吗?

rjb*_*rjb 19

ExpressionEngine的Template Class将花括号解析{}模板变量,寻找三种变量:单​​变量,对变量和条件变量:

// Single Variable
{summary}

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

// Conditional Variable
{if segment_2 != ""} ... {/if}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

遗憾的是,JavaScript的处理方式不同,并阻止Advanced Conditionals Parser处理标记中的任何内容.例如,以下带有花括号的 JavaScript 全部在一行中:

<script>var addthis_config = { 'ui_click': true };</script>
Run Code Online (Sandbox Code Playgroud)

将由ExpressionEngine解析为模板变量并呈现为:

<script>var addthis_config = ;</script>
Run Code Online (Sandbox Code Playgroud)

您会注意到从开头开始{到结束}大括号结束的所有内容都会被解析和替换!作为解决方法,您可以将大括号放在单独的行上并避免此问题:

<script>
    var addthis_config = {
        'ui_click': true,
        'data_track_clickback': true
    };
</script>
Run Code Online (Sandbox Code Playgroud)

如果您编写了一个需要ExpressionEngine值的JavaScript函数,只需将您的大括号放在不同的行上 - 这是一个很好的编码约定,并且对于可读性而言最佳的:

<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>
Run Code Online (Sandbox Code Playgroud)

根据Ben的建议,您可以通过设置隐藏配置变量来更改此行为:$conf['protect_javascript'] = 'n';


rjb*_*rjb 8

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>
Run Code Online (Sandbox Code Playgroud)

这将产生以下输出:

<script>
    Welcome, admin!

    Welcome, Administrator!

    Welcome, Guest!
</script>
Run Code Online (Sandbox Code Playgroud)

然而,当$config['protect_javascript'] = 'n';来自上面的相同代码片段将允许评估高级条件并将产生:

<script>
    Welcome, admin!
</script>
Run Code Online (Sandbox Code Playgroud)

如您所见,区别在于是否在JavaScript代码块中评估高级条件.

无论设置如何,总是在标签中评估简单的条件模板标签 - 只需确保将花括号放在单独的行上!<script>$config['protect_javascript']{}

<script>
    // Simple Conditionals Are Unaffected and Always Work
    {if segment_2 != ""}
        {redirect="404"}
    {/if}
</script>
Run Code Online (Sandbox Code Playgroud)