在Symfony2中使用类似片段的视图

时间:2012-12-03 18:23:58

标签: twig symfony-2.1

我在数据库中有两个表。其中一个包含应用程序的用户,另一个在ManyToOne关系中保存一些关于它们的医疗报告,因此每个用户都可以在信息表中随机抽取一些医疗报告。

在屏幕左侧,我想显示用户姓名列表,这是一件容易的事。每当我点击其中一个的名字时,我会进入另一个显示医疗数据的页面,我必须再次返回用户列表。但是,我希望在同一视图中显示此信息,因此每次单击左侧的名称时,我都会在右侧显示他或她的数据,当我点击其他用户时,前一个用户的信息消失,新的显示。我的意思是,我想要一个与旧的HTML iframe相似的行为,或者新的Android 4碎片。

这在Symfony2 / Twig中是否可行?

1 个答案:

答案 0 :(得分:1)

Twig只是一个模板引擎,它在服务器端解析,原始的HTML / CSS / JS返回给浏览器,你无法在Twig中与用户进行交互。

Symfony是一个服务器端框架,这意味着它在服务器端解析,原始HTML / CSS / JS返回给浏览器,你不能与Symfony用户编写交互。

您需要使用客户端脚本语言,如JavaScript。您可以创建AJAX请求来解决您的问题。 AJAX请求一个url并在页面上显示url的内容。由于AJAX是JavaScript中最不可交叉的浏览器之一,因此建议使用像MooTools或jQuery这样的库。

我建议为AJAX请求创建RESTful API。像/users/{id}之类的东西应该显示用户信息。为此,创建一个显示用户数据的控制器并将其映射到/users/{id}路由:

<?php
// src/Acme/DemoBundle/Controller/UserController.php
namespace Acme\DemoBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;

class UserController extends Controller
{
    // ...

    /**
     * @Route("/users/{id}")
     */
    public function showAction($id)
    {
        // select user by id
        $user = ...;

        // renders the user data
        $this->render('AcmeDemoBundle:User:show.html.twig', array('user' => $user));
    }
}

现在您为该URL创建一个AJAX请求以获取用户数据:

<ul> 
    <li><a class="js-show-user" data-id="1">Joren</a></li>
    <li><a class="js-show-user" data-id="2">Wouter</a></li>
    <!-- ... -->
</ul>
<div id="js-user-data"></div>

<!-- ... include jquery -->
<script>
jQuery(function($) {

    var output = $('#js-user-data');

    $('.js-show-user').click(function(e) {
        jQuery.ajax({
            url: '/users/' + $(this).data('id'), // request the correct url
            success: function (result) {
                output.html(result); // output the result
            },
        });
    });

});
</script>