Twig关联对象数组渲染

时间:2016-03-24 12:12:15

标签: php symfony twig

我的控制器输出如下所示:

D:\web\www2\application\src\CommonBundle\Controller\ClassesController.php:22:
 array (size=2)
  'Grade 8' => 
    array (size=1)
      0 => 
        array (size=2)
         0 => 
           object(CommonBundle\Entity\GradeLevel)[363]
             ...
         1 => 
           object(CommonBundle\Entity\GradeLevel)[367]
             ...
    'Grade 9' => 
      array (size=1)
       0 => 
        array (size=1)
          0 => 
           object(CommonBundle\Entity\GradeLevel)[372]
             ...

这些数据来自One-T-_Many关系,我想做的是在我的html表上进行分组。下面是我创建对象数组的方法:

$grades = $this->getDoctrine()->getRepository('CommonBundle:Grade')->findAll();

    $classes = array();
    foreach($grades as $grade){
       $classes[$grade->getName()][] = $this->getDoctrine()->getRepository('CommonBundle:GradeLevel')->findBy(array(
          'grade' => $grade->getId()
        ));
     }

    return $this->render('CommonBundle:Classes:index.html.twig', array(
       'classes' => $classes
      )); 

如果这是一个简单的PHP代码,我会简单地做这样的事情:

<?php

   foreach($classes as $key => $values){
      ...
      <td colspan="4"><?php echo $key //Being the category name as indexed from the controller ?></td>
      //And continue with the contents of the classes
      foreach($values as $class){
         <tr>
          <td><?php echo $class->getName(); ?>
           ....
        }
    }

我发现很难在网上获得任何解决方案来满足我的要求。任何人都可以指出我正确的方向,因为TWIG文档似乎也是抽象的。

编辑:

下面是当前的表格结构,我必须让任何助手都能轻松了解我想要实现的目标。

<table class="table">
<thead>
  <tr>
    <th>#</th>
    <th>Class</th>
    <th>Created on</th>
    <th>Modified at</th>
    <th>Actions</th>
  </tr>
</thead>
<tbody>
  {% for values in classes %}
    <tr>
      <!--- Category name should go here e.g "Grade 8" then next loop should list all Grades from that category -->
      <td colspan="5" align="right">{{ values }}</td>
    </tr>
    {% for item in values %}
      <tr>
        <td>&nbsp;</td>
        <td>{{ item.name }}</td>
        <td>{{ item.created|date('Y-m-d H:i:s') }}</td>
        <td>{{ item.modified|date('Y-m-d H:i:s') }}</td>
        <td><a class="btn btn-sm btn-primary" href="#" role="button">Summary</a></td>
       </tr>
    {% endfor %}
  {% endfor %}
</tbody>

编辑2

enter image description here

2 个答案:

答案 0 :(得分:1)

你需要在twig中做同样的事情,你将在php中做 - 循环内循环。

请记住,您的阵列中有 3级

{% for values in classes %}
    {% for item in values[0] %}
        <li>{{ item.name }}</li>
    {% endfor %}
{% endfor %}

使用Grade *访问values[0]密钥下的第一个(并且只有元素)。

从性能角度来看,这不是最好的事情,但如果您无法更改数据结构,那么您可以使用它。

答案 1 :(得分:0)

这是我在视图中的最终表格代码,可以根据需要正确呈现。

<table class="table">
<thead>
  <tr>
    <th>#</th>
    <th>Class</th>
    <th>Created on</th>
    <th>Modified at</th>
    <th>Actions</th>
  </tr>
</thead>
<tbody>
  {% for group, values in classes %}
    <tr>
      <td colspan="5" align="left"><strong>{{ group }}</strong></td>
    </tr>{% for item in values %}
      <tr>
        <td>&nbsp;</td>
        <td>{{ item.name }}</td>
        <td>{{ item.created|date('Y-m-d H:i:s') }}</td>
        <td>{{ item.modified|date('Y-m-d H:i:s') }}</td>
        <td><a class="btn btn-sm btn-primary" href="#" role="button">Summary</a></td>
       </tr>
    {% endfor %}
  {% endfor %}
</tbody>