用symfony 2进入Controller的Javascript

时间:2014-05-06 18:27:11

标签: javascript symfony controller

我正在尝试使用symfony 2将一些java脚本编码到控制器中。 此代码有效:

    public function indexAction() {
    echo "<script  type=\"text/javascript\">"
    . "alert(\" test message! \");"
    . "</script>";
    return $this->render('TestBundle:Default:GuiLogin.html.twig');
    }

但不是这一个:

    echo "<script  type=\"text/javascript\">"
    . "document.getElementById(\"DivInfo\").style.display = 'block';"
    . "</script>";

有人有想法吗?

2 个答案:

答案 0 :(得分:1)

您可以在控制器中定义字符串,然后在Twig模板中显示它:

控制器

public function indexAction() {
    $js = '<script  type="text/javascript">'.
     'document.getElementById("DivInfo").style.display = "block";'.
     '</script>';

    return $this->render(
        'TestBundle:Default:GuiLogin.html.twig',
        array(
            'js' => $js
        )
    );
}

Twig模板

将此代码放在</html>标记之前:

<div id="DivInfo" style="display:none;">
    DivInfo
</div>

{% if (js is defined) %}{{ js|raw }}{% endif %}

<div id="DivInfo">默认隐藏,并在启用Javascript时显示。

评论

我不明白你问题背后的逻辑是什么。有几种方法只能在某些条件下显示代码。在Controller中定义Javascript函数是一个坏主意,因为它将Javascript代码放在.js文件或Twig HTML文件中的逻辑更多。

更好的解决方案

根据您的评论,您正在检查用户凭据,因此您可以在控制器中执行测试:

控制器

public function indexAction() {
    $message = null;

    if (check credentials)
    {
        $message = 'whatever';
    }

    return $this->render(
        'TestBundle:Default:GuiLogin.html.twig',
        array(
            'message' => $message
        )
    );
}

Twig模板

<div id="DivInfo" style="display:none;">
    DivInfo
</div>

{% if ((message is defined) and (message is not null)) %}
    <div>{{ message }}</div>
{% endif %}

答案 1 :(得分:0)

好。首先。你永远不应该做这样的事情。除非您正在测试某些内容,否则您的控制器操作不应回显/转储任何内容。

我的猜测是,第一个例子有效,因为alert函数不会尝试在dom中找到任何元素,浏览器仍然可以执行它。我还相信在渲染方法输出模板之前,您的脚本已经输出。这意味着你的脚本在html之前输出,这在第一时间是无效的。第二个示例需要已经加载的html(dom),以便按ID查找元素。还要考虑使用jQuery来获取id的元素。 jQuery可以用选择器做到这一点,并且有#34; load&#34;和&#34;准备好&#34;方法,当你需要等待加载的东西。

jQuery - What are differences between $(document).ready and $(window).load?

你应该至少将javascript移动到模板中。如果必须,将javascript放在php变量中并将其传递给模板。然后使用模板引擎(如twig),尝试将该变量输出为html,也许尝试使用原始过滤器或其他一些可以做到这一点。