2015-09-08 2 views
5

Ecco la mia entità di messaggio. È una classe che definisce i messaggi tra gli utenti nella mia app.Visualizzazione dell'array nidificato nel ramoscello

class Message 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @var string 
    * @Assert\NotBlank(message="private_message.title.blank") 
    * @ORM\Column(name="title", type="string", length=50) 
    */ 
    protected $title; 

    /** 
    * @Assert\NotBlank(message="private_message.receiver.blank") 
    * @ORM\ManyToOne(targetEntity="MedAppBundle\Entity\User") 
    * @ORM\JoinColumn(referencedColumnName="id") 
    */ 
    protected $receiver; 
    /** 
    * @ORM\ManyToOne(targetEntity="MedAppBundle\Entity\User") 
    * @ORM\JoinColumn(referencedColumnName="id") 
    */ 
    protected $sender; 

    /** 
    * @var string 
    * @Assert\NotBlank(message="private_message.content.blank") 
    * @ORM\Column(name="content", type="string") 
    */ 
    protected $content; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="sentAt", type="datetime") 
    */ 
    protected $sentAt; 


    /** 
    * @var boolean 
    * 
    * @ORM\Column(name="isSpam", type="boolean") 
    */ 
    protected $isSpam = false; 


    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="seenAt", type="datetime",nullable=true) 
    */ 
    protected $seenAt = null; 

    /** 
    * @ORM\ManyToOne(targetEntity="PrivateMessageBundle\Entity\Message") 
    * @ORM\JoinColumn(referencedColumnName="id",nullable=true) 
    */ 
    protected $replyof; 

    /** 
    * @ORM\OneToMany(targetEntity="PrivateMessageBundle\Entity\Message", mappedBy="replyof") 
    **/ 
    private $replies; 

    public function __construct() { 
     $this->replies = new ArrayCollection(); 
    } 

cosa importante da notare è la variabile replyof, che racconta quale messaggio è un genitore del messaggio. Se è NULL, il messaggio non è una risposta, è un messaggio principale (una radice).

E la variabile messages, che è una matrice di messaggi che sono risposte al messaggio. Queste risposte possono avere risposte, loro stesse. Questo array può anche essere NULL, per i nodi foglia, perché non hanno alcuna risposta.

Tutte le altre variabili contengono solo alcuni campi che definiscono un messaggio effettivo tra due utenti.

Quello che sto cercando di fare è di visualizzazione in tutti i miei messaggi Twig in un formato arborescente, in questo modo:

message1 - root message, reply of none, but has replies 
    reply1 - first reply of message 1 
     reply1 first reply of reply 1 of message 1, leaf with no further replies 
    reply2 - second reply of message 1, leaf with no further replies 

message2 - root message, no replies and a reply of none 

Il problema è che Twig supporta solo foreach loop e non sono sicuro di come mostra questo formato quando ha una profondità maggiore, più grande di due.

{% for reply in message.replies %} 
    <li> sent by: {{ reply.sender }} </li> 
    <li> title: {{ reply.title }} </li> 
    <li> content: {{ reply.content }} </li> 
    <li> date: {{ reply.sentAt|date('d-m-Y H:i:s') }} </li> 
    <hr> 
{% endfor %} 

Questo visualizzerà ogni risposta di un messaggio, ma come posso visualizzare i messaggi annidati, in tutta la profondità?

+3

Hai visto [Twig - Come eseguire il rendering di un albero] (http://stackoverflow.com/questions/8326482/twig-how-to-render-a-tree)? – HPierce

risposta

2

Non l'ho provato da voi dovrebbe essere in grado di ripetere plies:

{% for reply in message.replies %} 
    {% if loop.first %}<ul>{% endif %} 
    <li> sent by: {{ reply.sender }} </li> 
    <li> title: {{ reply.title }} </li> 
    <li> content: {{ reply.content }} </li> 
    <li> date: {{ reply.sentAt|date('d-m-Y H:i:s') }} </li> 
    {% for reply in reply.replies %} 
     {% if loop.first %}<li><ul>{% endif %} 
     <li> sent by: {{ reply.sender }} </li> 
     <li> title: {{ reply.title }} </li> 
     <li> content: {{ reply.content }} </li> 
     <li> date: {{ reply.sentAt|date('d-m-Y H:i:s') }} </li> 
     {% if loop.last %}</ul></li>{% endif %} 
    {% endfor %} 
    {% if loop.last %}</ul>{% endif %} 
{% endfor %} 

Visualizzerà solo 2 livelli di risposte. È possibile utilizzare un Twig macro per definire una funzione riutilizzabile che dovrebbe visualizzare in modo ricorsivo risposte:

{# define the macro #} 
{% macro displayReply(reply) %} 
    <li> sent by: {{ reply.sender }} </li> 
    <li> title: {{ reply.title }} </li> 
    <li> content: {{ reply.content }} </li> 
    <li> date: {{ reply.sentAt|date('d-m-Y H:i:s') }} </li> 
    {% for reply in reply.replies %} 
     {% if loop.first %}<li><ul>{% endif %} 
     {{ displayReply(reply) }} 
     {% if loop.last %}</ul></li>{% endif %} 
    {% endfor %} 
{% endmacro %} 

{# use the macro #} 
{% for reply in message.replies %} 
    {% if loop.first %}<ul>{% endif %} 
    {{ displayReply(reply) }} 
    {% if loop.last %}</ul>{% endif %} 
{% endfor %} 

seconda della query, si può visualizzare risposte nell'ordine sbagliato, potrebbe essere necessario ordinare risposte in ordine decrescente nella query .

1

Si può fare un approccio ricorsivo come segue:

nel ramo principale, si stampa il messaggio principale, e iterare ricorsivamente in un parziale come segue:

## main twig 
Root message: 
    <ul> 
    <li> sent by: {{ message.sender }} </li> 
    <li> title: {{ message.title }} </li> 
    <li> content: {{ message.content }} </li> 
    <li> date: {{ message.sentAt|date('d-m-Y H:i:s') }} </li> 
    {{ include('AcmeDemoBundle:Message:_elem.html.twig', {'replies': message.replies) }} 
    </ul> 

e

## AcmeDemoBundle:Message:_elem.html.twig 
<ul> 
{% for reply in replies %} 
    <li> sent by: {{ reply.sender }} </li> 
    <li> title: {{ reply.title }} </li> 
    <li> content: {{ reply.content }} </li> 
    <li> date: {{ reply.sentAt|date('d-m-Y H:i:s') }} </li> 
    {{ include('AcmeDemoBundle:Message:_elem.html.twig', {'replies': reply.replies) }} 
{% endfor %} 
</ul> 

spero che questo aiuto