6

我对 Symfony2 和 Twig 有疑问:我不知道如何显示动态加载的实体的所有字段。这是我的代码(什么都不显示!!)

控制器 :

public function detailAction($id)
{
    $em = $this->container->get('doctrine')->getEntityManager();

    $node = 'testEntity'
    $Attributes = $em->getRepository('TestBetaBundle:'.$node)->findOneById($id);

    return $this->container->get('templating')->renderResponse('TestBetaBundle:test:detail.html.twig', 
    array(
    'attributes' => $Attributes
    ));

}

detail.html.twig :

    {% for key in attributes %} 
        <p>{{ value }} : {{ key }}</p>
    {% endfor %}
4

4 回答 4

9

Don't settle for just the public properties! Get the private/protected as well!

public function detailAction($id){
    $em = $this->container->get('doctrine')->getEntityManager();

    $node = 'testEntity'
    $Attributes = $em->getRepository('TestBetaBundle:'.$node)->findOneById($id);

    // Must be a (FQCN) Fully Qualified ClassName !!!
    $MetaData = $em->getClassMetadata('Test\Beta\Bundle\Entity\'. $node);
    $fields = array();
    foreach ($MetaData->fieldNames as $value) {
        $fields[$value] = $Attributes->{'get'.ucfirst($value)}();
    }

    return $this->container
                ->get('templating')
                ->renderResponse('TestBetaBundle:test:detail.html.twig', 
                array(
                    'attributes' => $fields
                ));

}
于 2012-11-05T23:36:17.367 回答
8

好的。您尝试做的事情不能通过for您的属性对象上的 Twig 循环来完成。让我试着解释一下:
Twigfor循环遍历对象数组,为数组中的每个对象运行循环内部。在您的情况下,$attributes它不是一个数组,它是一个您通过调用检索的 OBJECT findOneById。所以for循环发现这不是一个数组并且没有在循环内部运行,甚至一次都没有,这就是你没有输出的原因。
@thecatontheflat 提出的解决方案也不起作用,因为它只是对数组的相同迭代,只是您可以访问数组的键和值,但由于$attributes不是数组,因此什么也做不了。

您需要做的是向模板传递一个包含 $Attributes 对象属性的数组。您可以为此使用 php get_object_vars() 函数。执行以下操作:

$properties = get_object_vars ($Attributes);
return $this->container->get('templating')->renderResponse('TestBetaBundle:test:detail.html.twig', 
array(
'attributes' => $Attributes
'properties' => $properties
));

在 Twig 模板中:

{% for key, value in properties %} 
    <p>{{ value }} : {{ key }}</p>
{% endfor %}

考虑到这只会显示对象的公共属性。

于 2012-08-02T15:34:01.217 回答
0

对于 Symfony3

    $em = $this->getDoctrine()->getEntityManager();

    $MetaData = $em->getClassMetadata('TestBetaBundle:Node');
    $fields = $MetaData->getFieldNames();

    return $this->render('test/detail.html.twig', array('fields'=>fields));    
于 2017-01-27T16:37:11.180 回答
-2

你应该把它改成

{% for key, value in attributes %} 
    <p>{{ value }} : {{ key }}</p>
{% endfor %}
于 2012-08-02T14:53:45.633 回答