【问题标题】:ExpressionEngine rendering JS code with { } bracketsExpressionEngine 用 { } 括号渲染 JS 代码
【发布时间】:2011-06-29 00:50:44
【问题描述】:

有没有办法强制表达式引擎不将大括号内的项目呈现为 EE 代码? google chart tools 使用包含大括号 { } 括号的 javascript 代码,EE 自然认为它是一个变量并尝试渲染它。有什么办法吗?

【问题讨论】:

    标签: javascript expressionengine


    【解决方案1】:

    ExpressionEngine的Template Class将花括号{}解析为template variables,寻找三种变量:单​​变量、对变量、条件变量:

    // 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 的处理方式不同,并阻止了高级条件解析器处理标签中的任何内容。例如,下面的 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>
    

    如果您编写了一个期望来自 ExpressionEngine 的值的 JavaScript 函数,只需将大括号放在单独的行上 — 这是 good coding conventionoptimal for readability

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

    按照 Ben 的建议,您可以通过设置 Hidden Configuration Variable: $conf['protect_javascript'] = 'n'; 来更改此行为

    【讨论】:

    • 多么棒的回应。这正是我正在寻找的关于一些 javascript 和 EE 的信息。
    【解决方案2】:

    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'; 上面的相同代码 sn-p 将允许评估高级条件并会产生:

    <script>
        Welcome, admin!
    </script>
    

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

    Simple conditionalstemplate tags 始终在 &lt;script&gt; 标记中进行评估,无论 $config['protect_javascript'] 设置如何 - 请务必将大括号 {} 放在不同的行上!

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

    【讨论】:

      【解决方案3】:

      创建一个全局变量来包含您的 JS 代码。然后只需在模板中使用全局变量:

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

      【讨论】:

        【解决方案4】:

        出于某种原因,简单地将花括号放在单独的行上对我不起作用(我使用的是 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>
        

        【讨论】:

        • 虽然这可能有效,但不知道为什么有效并不能完全解决问题。在弄清楚它的工作原理和原因之前,在这一点上作为评论可能会更好。
        猜你喜欢
        • 1970-01-01
        • 2017-05-26
        • 2011-05-14
        • 2020-03-02
        • 2021-11-20
        • 2021-11-16
        • 1970-01-01
        • 2021-11-27
        • 1970-01-01
        相关资源
        最近更新 更多