2012-08-02 17 views
6

Tengo un problema con Symfony2 y Twig: no sé cómo mostrar todos los campos de mi entidad que se cargan dinámicamente. Aquí está mi código (no se muestra nada !!)Symfony2 & Twig: mostrar todos los campos y las teclas

controlador:

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

Respuesta

8

OK. Lo que intenta hacer no se puede hacer con un bucle de Twig for sobre su objeto de atributos. Permítanme intentar explicar:
El bucle Twig for itera sobre un ARRAY de objetos, ejecutando el interior del bucle para cada uno de los objetos en la matriz. En su caso, $attributes NO es una matriz, es un OBJETO que recuperó con su llamada findOneById. Por lo tanto, el bucle for encuentra que esto no es una matriz y no ejecuta el interior del bucle, ni siquiera una vez, por eso no obtiene ningún resultado.
La solución propuesta por @thecatontheflat tampoco funciona, ya que es la misma iteración sobre una matriz, solo que tiene acceso a las claves y valores de la matriz, pero como $attributes no es una matriz, no se lleva a cabo nada .

Lo que debe hacer es pasarle a la plantilla una matriz con las propiedades del objeto $ Attributes. Puede usar la función php get_object_vars() para esto. Hacer algo como:

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

Y en la plantilla de la ramita:

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

Tenga en cuenta que esto sólo mostrará las propiedades públicas de su objeto.

+0

Buen punto @Carlos – Mick

+0

¡Gracias! ¡Fue mi primer post y mi inglés no es perfecto! Funciona ... – user1571729

-2

se debe cambiar a

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

Se muestra nada. Cuando pruebo {{attributes.name}} o {{attributes.description}} todo está bien. Pero dentro del lazo nada! – user1571729

9

¡No te conformes solo con las propiedades públicas! Obtenga el privado/protegido también!

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

El uso del componente [PropertyAccess] (http://symfony.com/doc/current/components/property_access/introduction.html) puede ser más apropiado. – keyboardSmasher

0

Para Symfony3

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

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

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