2017-09-29 2 views
1

Ich habe Probleme mit Kommentaren in Zweig anzeigen. Sie sind sichtbar, wenn ich sie alle aufliste, aber ich brauche sie, um verschachtelt zu werden.wie Kommentare im Zweig rekursiv anzuzeigen

Diese Entität ist, dachte ich, es sollte wie folgt referenziert werden:

/** 
* @var \AppBundle\Entity\Comment 
* 
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Comment") 
* @ORM\JoinColumn(name="parentId", referencedColumnName="id") 
*/ 
private $parentId; 

Controller ist einfach, holt alle Kommentare von db und kehrt Array (mit und ohne parentId) einige Anweisung folgend i dieser hinzugefügt zur Hauptzweigdatei:

<!-- Comments and omments with parentId --> 
{% include 'front/main/comments-main.html.twig' with {'commments':comments} %} 

Alle Kommentare auflisten funktioniert. Aber im mitgelieferten Zweig scheint dieser Frieden des Codes

{% if comment.parentId != null %} 
      {% set children = [] %} 
      {% set children = children|merge([ comment ]) %} 
      {% include 'front/main/comments-main.html.twig' with {'comments':children} %} 
     {% endif %} 

funktioniert nicht. Wenn ich etwas stimme, wird es an der richtigen Stelle angezeigt, unter Kommentar mit dieser ID. Aber mit diesen Zeilen, wenn nicht. Die Seiten werden sehr langsam geladen und enden nie. Wie Endlosschleife. Was mache ich falsch?

+4

Sie müssen mit 'macro's' arbeiten, diese zu lösen, haben einen Blick auf diese [Antwort] (https://stackoverflow.com/questions/45955614/multi-level-menu-with-twig/45956255# 45956255) – DarkBee

+0

Ich folgte diesem https://stackoverflow.com/questions/8326482/how-to-render-a-tree-in-twig. erste Antwort von Random-Coder-1920. Er hat es sowohl mit Makros als auch ohne Makro getan. Ich werde versuchen, Makro .... –

+0

Ja, aber er verwendet ein Subtemplate zu enthalten. Sie fügen die gesamte Vorlage erneut ein, was zur Endlosschleife führt. 'Macro's' sind nur ein bisschen sauberer, um das zu lösen (und sind wiederverwendbar) – DarkBee

Antwort

0

Nun, ich habe es getan. Es war ein Problem mit der endlosen Schleife, aber weil ich mich mit parentId beschäftigte, und ich folgte Anweisungen von jemandem, der sich mit object.children beschäftigte. Also musste ich Beziehung Viele auf eine Selbstrichtungs

// ... 
/** 
* One Category has Many Categories. 
* @OneToMany(targetEntity="Category", mappedBy="parent") 
*/ 
private $children; 

/** 
* Many Categories have One Category. 
* @ManyToOne(targetEntity="Category", inversedBy="children") 
* @JoinColumn(name="parent_id", referencedColumnName="id") 
*/ 
private $parent; 
// ... 

public function addChild(Comment $child) { 
    $this->children[] = $child; 
    $child->setParentId($this); 
} 
public function __construct() { 
    $this->children = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

(von http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-self-referencing) machen und kleine Änderung in Controler zu machen children.Before Flush()

 $parent = $comment->getParentId(); 
     $parent->addChild($comment); 

zu setzen und in Zweig, ich in Subtemplate bereits hatte, innerhalb der Schleife

<div> 
    {% if comment.children is defined %} 
     {% include 'front/main/comments-main.html.twig' with {'comments':comment.children} %} 
    {% endif %} 
</div> 

Hoffnung ein paar Minuten, um jemanden zu retten, verlor ich Stunden!