2012-08-02 21 views
6

Mam problem z Symfony2 i Twig: Nie wiem, jak wyświetlić wszystkie pola mojej jednostki, która jest ładowana dynamicznie. Tu jest mój kodu (wyświetla nic !!)Symfony2 & Twig: wyświetla wszystkie pola i klucze

Kontroler:

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

Odpowiedz

8

OK. To, co próbujesz zrobić, nie może zostać wykonane za pomocą pętli Twig for nad obiektem atrybutów. Pozwól mi spróbować wyjaśnić:
Pętla Twig for iteruje nad ARRAYĄ obiektów, uruchamiając wnętrze pętli dla każdego z obiektów w tablicy. W twoim przypadku, $attributes NIE jest tablicą, jest to OBIEKT, który zdobyłeś z Twoim połączeniem findOneById. Tak więc pętla for stwierdza, że ​​nie jest to tablica i nie uruchamia się wewnątrz pętli, ani razu, dlatego nie ma wyjścia.
Rozwiązanie zaproponowane przez @thecatontheflat również nie działa, ponieważ jest to ta sama iteracja w stosunku do tablicy, ale tylko dlatego, że masz dostęp do obu kluczy i wartości tablicy, ale ponieważ $attributes nie jest tablicą, nic nie zostaje wykonane .

Co należy zrobić, to przekazać szablonowi tablicę z właściwościami obiektu $ Attributes. Możesz użyć do tego funkcji php get_object_vars(). Czy coś takiego:

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

I w szablonie Twig:

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

Weź pod uwagę, że będzie to pokazać tylko właściwości publiczne swojego obiektu.

+0

Dobry punkt @Carlos – Mick

+0

Dzięki! To był mój pierwszy post, a mój angielski nie jest doskonały! Działa ... – user1571729

-2

należy go zmienić na

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

wyświetlać nic. Kiedy testuję {{attributes.name}} lub {{attributes.description}} wszystko jest w porządku. Ale w środku nic nie ma! – user1571729

9

Nie zadowalaj się tylko nieruchomościami publicznymi! Zdobądź również prywatne/chronione!

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

Korzystanie ze składnika [PropertyAccess] (http://symfony.com/doc/current/components/property_access/introduction.html) może być bardziej odpowiednie. – keyboardSmasher

0

Dla Symfony3

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

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

    return $this->render('test/detail.html.twig', array('fields'=>fields));  
Powiązane problemy