【问题标题】:Javascript into Controller with symfony 2使用 symfony 2 将 Javascript 导入控制器
【发布时间】:2014-05-06 18:27:11
【问题描述】:

我正在尝试使用 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>";

有人有想法吗?

【问题讨论】:

  • 使用第一个代码,&lt;script&gt;标签在哪里显示?在&lt;html&gt; 标签之前?
  • 控制器中没有标签
  • 也就是说GuiLogin.html.twig是在&lt;script&gt;标签显示之后渲染的?
  • 只要把&lt;script&gt;代码放到twig文件里面,就可以在controller中创建一个变量然后传给twig文件

标签: javascript symfony controller


【解决方案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
        )
    );
}

树枝模板

将此代码放在&lt;/html&gt; 标签之前:

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

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

&lt;div id="DivInfo"&gt; 默认是隐藏的,如果启用了 Javascript 则会显示。

评论

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

更好的解决方案

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

控制器

public function indexAction() {
    $message = null;

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

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

树枝模板

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

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

【讨论】:

  • 它不适用于 :document.getElementById(\"DivInfo\").style.display = \'block\';
  • 我已经用适合我的代码更新了我的答案。
  • 在评论中:因为,我必须在控制器中测试登录名/密码。抱歉,我只是 MVC 的初学者。我会试试这个!
  • Symfony2 offers some functions to test the credentials。还有 FOSUserBundle 提供与用户身份验证相关的所有内容。
【解决方案2】:

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

我的猜测是,第一个示例有效,因为 alert 函数不会尝试在 dom 中查找任何元素,并且浏览器仍然可以执行它。我也相信你的脚本是在渲染方法输出模板之前输出的。这意味着您的脚本在 html 之前输出,这首先是无效的。第二个示例需要已经加载了 html (dom),才能通过 id 查找元素。还可以考虑使用 jQuery 通过 id 获取元素。当您需要等待加载时,jQuery 可以使用选择器来完成此操作,并且具有“加载”和“就绪”方法。

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

您至少应该将 javascript 移动到模板中。如果必须,请将 javascript 放入 php 变量中并将其传递给模板。然后使用模板引擎(如 twig),尝试将该变量输出为 html,也许尝试使用原始过滤器或其他可以解决问题的方法。

【讨论】:

  • 感谢您的回答,我的回答中忘记了raw 过滤器,HTML 被转义了。
猜你喜欢
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
相关资源
最近更新 更多