2012-08-02 7 views
6

Ich habe ein Problem mit Symfony2 und Twig: Ich weiß nicht, wie ich alle Felder meiner Entity anzeigen kann, die dynamisch geladen werden. Hier ist mein Code (zeigt nichts !!)Symfony2 & Twig: Alle Felder und Schlüssel anzeigen

Controller:

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 %} 

Antwort

8

OK. Was Sie versuchen zu tun, kann nicht mit einer Zweig for Schleife über Ihr Attributobjekt getan werden. Lassen Sie mich versuchen, zu erklären:
Die Zweig for Schleife iteriert über ein Array von Objekten und führt das Innere der Schleife für jedes der Objekte im Array. In Ihrem Fall ist $attributes KEIN Array, es ist ein OBJEKT, das Sie mit Ihrem findOneById Aufruf abgerufen haben. Also die for Schleife findet, dass dies kein Array ist und nicht innerhalb der Schleife ausgeführt wird, nicht einmal, deshalb erhalten Sie keine Ausgabe.
Die von @thecatontheflat vorgeschlagene Lösung funktioniert auch nicht, da es sich um die gleiche Iteration über ein Array handelt, nur dass Sie Zugriff auf die Schlüssel und Werte des Arrays haben, aber da $attributes kein Array ist, wird nichts erreicht .

Sie müssen der Vorlage ein Array mit den Eigenschaften des Objekts $ Attributes übergeben. Sie können dazu die Funktion php get_object_vars() verwenden. so etwas wie Sie:

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

Und in der Zweig Vorlage:

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

berücksichtigen, dass dies nur die öffentlichen Eigenschaften des Objekts zeigen.

+0

Guter Punkt @Carlos – Mick

+0

Danke! Es war mein erster Beitrag und mein Englisch ist nicht perfekt! Es funktioniert ... – user1571729

-2

Sie sollten es ändern zu

{% for key, value in attributes %} 
    <p>{{ value }} : {{ key }}</p> 
{% endfor %} 
+0

Es hat nichts angezeigt werden soll. Wenn ich {{attributes.name}} oder {{attributes.description}} teste, ist alles in Ordnung. Aber in der Schleife nichts! – user1571729

9

Begnügen Sie sich nicht nur mit öffentlichen Objekten! Holen Sie sich auch privat/geschützt!

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 
       )); 

} 
+1

Die Komponente [PropertyAccess] (http://symfony.com/doc/current/components/property_access/introduction.html) ist möglicherweise besser geeignet. – keyboardSmasher

0

Für Symfony3

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

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

    return $this->render('test/detail.html.twig', array('fields'=>fields));  
Verwandte Themen