2015-09-08 21 views
5

Oto moja jednostka wiadomości. Jest to klasa, która definiuje wiadomości między użytkownikami w mojej aplikacji.Wyświetlanie macierzy zagnieżdżonej w gałązce

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

Co ważne jest, aby pamiętać, jest zmienna replyof, który mówi to, co wiadomość jest dominująca w komunikacie. Jeśli jest to wartość NULL, wiadomość nie jest odpowiedzią, jest to wiadomość nadrzędna (root).

I zmienna messages, która jest tablicą wiadomości, które są odpowiedziami na wiadomość. Te odpowiedzi mogą same odpowiadać. Ta tablica może mieć także wartość NULL dla węzłów liści, ponieważ nie mają żadnej odpowiedzi.

Wszystkie pozostałe zmienne zawierają tylko niektóre pola definiujące rzeczywistą wiadomość między dwoma użytkownikami.

Co staram się zrobić, to wyświetlacz w Gałązka wszystkich moich wiadomości w formacie drzewiastych, tak:

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 

Problemem jest to, że obsługuje tylko foreach Gałązka pętle i nie jestem pewien, jak wyświetla ten format, gdy ma większą głębokość, większą niż dwa.

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

Spowoduje wyświetlenie każdej odpowiedzi na wiadomość, ale jak wyświetlić zagnieżdżone wiadomości na całej głębokości?

+3

Czy widziałeś [Twig - Jak renderować drzewo] (http://stackoverflow.com/questions/8326482/twig-how-to-render-a-tree)? – HPierce

Odpowiedz

2

Nie przetestowałem tego, powinieneś być w stanie zapętlić się ponownie warstwy:

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

Wyświetli tylko 2 poziomy odpowiedzi. Można użyć gałązkę macro zdefiniować wielokrotnego użytku funkcji, które powinny rekurencyjnie wyświetlić Odpowiedzi:

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

W zależności od zapytania, może on wykazywać odpowiedzi w niewłaściwej kolejności, być może trzeba uporządkować odpowiedzi w kolejności malejącej w zapytaniu .

1

Można zrobić rekurencyjnej podejście następujące:

w głównej gałązki, wydrukować głównego przesłania i iteracyjne rekurencyjnie w częściowym następująco:

## 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> 

i

## 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> 

nadzieję, że ta pomoc

Powiązane problemy