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

公共の財産だけに甘んじてはいけません!プライベート/保護も取得してください!

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ループはオブジェクトのARRAYを繰り返し処理し、配列内の各オブジェクトのループの内側を実行します。あなたの場合、$attributesは配列ではなく、findOneById呼び出しで取得したオブジェクトです。したがって、forループはこれが配列ではなく、ループの内部を1回も実行しないことを検出します。これが、出力が得られない理由です。
@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 に答える