【发布时间】:2012-02-11 07:51:47
【问题描述】:
我目前正在开发一个 symfony2 应用程序并且正在使用嵌入式控制器。我的嵌入式控制器就像小部件一样,应该封装自己的一组功能,可以嵌入到任何地方,并且仍然可以正常工作。
我有一个控制器,称为在线用户。它生成的视图很简单,只是一个在线用户列表。但是,我想在该视图中添加一些 javascript,以便我可以使用 ajax 来检索被点击的用户的信息。
控制器基本上返回一个视图:
return $this->render('AppBundle:Users:usersOnline.html.twig', array('somedata' => $data);
这是该控制器的视图:
{% extends partial.html.twig" %}
{% block content %}
<ul>
<li><a href="site.com/ajax/user/1">User 1</a></li> (this would all be generated using 'somedata')
<li><a href="site.com/ajax/user/2">User 2</a></li>
....
<ul>
{% endblock content %}
{% block scripts %}
..some javascript for interacting with this widget
{% endblock %}
这是从以下扩展而来的部分:
{% block content %}
{% endblock content %}
{% block scripts %}{% endblock %}
这是嵌入控制器的主页:
{% "base.html.twig" %}
{% block title %}Main{% endblock %}
{% block content %}
..some markup here
<div id="usersonline">
{% render "AppBundle:Users:usersOnline" with {'max': 4} %}
</div>
{% endblock %}
{% block scripts %}
..some javascript
{% endblock %}
这是它扩展的基础:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>{% block title %}{% endblock %} - App</title>
...Some stylesheets
</head>
<body>
{% block content %}{% endblock %}
<script src="http://yui.yahooapis.com/3.5.0pr2/build/yui/yui-min.js"></script>
{% block scripts %}{% endblock %}
</body>
</html>
我现在面临的问题是包含来自嵌入式控制器的 javascript。在我的例子中,视图扩展了部分,并在插入主页之前完全呈现为 1 个单元。在这种情况下,我只能将我的 javascript 放在 content 块中,这意味着我将在 <div> 标记中包含 <script> 标记。我还希望在正文末尾添加脚本以提高用户界面性能。
我应该如何构建我的模板(或者甚至可能),以便我可以将嵌入式控制器视图中的适当部分渲染到嵌入控制器的模板中的适当块中?在我当前的模板中,YUI 库将在嵌入式控制器呈现 HTML 标记之后加载,因此无法在嵌入式控制器中使用 YUI 库进行访问。
【问题讨论】:
-
Duplicate 虽然更容易阅读。我不认为嵌入式控制器的结果可以在多个块之间划分。返回的结果只是呈现的 html 而不是 twig 模板。我认为您需要两个嵌入式控制器,一个用于内容,一个用于 javascript。在某些情况下,甚至可能是一个用于 css 的。
-
嗯。拥有 2 个嵌入式控制器并不理想,而且 imo 也不是很优雅。
-
好吧,您实际上并不需要两个控制器,只需使用指定您想要的参数的同一个控制器的两次调用,即使用 { 'generate' : 'html' or 'js' or 'css ' }。然后相应地调整您的模板。