如何以递归方式在树枝中显示注释

时间:2017-09-29 12:46:06

标签: php symfony twig

我在树枝上显示评论时遇到问题。如果我列出它们,它们是可见的,但我需要它们嵌套。

这是实体,我认为它应该像这样引用:

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

Controller很简单,从db获取所有注释并返回数组(有,没有parentId) 按照一些指示,我将其添加到主枝文件中:

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

列出所有评论都有效。但是在包含的枝条中,似乎是代码的和平

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

不起作用。如果我回应某些内容,它会显示在正确的位置,并在该ID下进行评论。但如果没有那条线。页面加载非常慢,永远不会结束。像无限循环。我做错了什么?

1 个答案:

答案 0 :(得分:0)

嗯,我做到了。这是无限循环的问题,但因为我正在处理parentId,而且我正在按照一个正在处理object.children的人的指示。因此,我必须与多对一的关系进行自我定向

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

(来自http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#one-to-many-self-referencing) 并在控制器中进行小的更改以设置children.Before flush()

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

在树枝中,我已经在子模板中,在循环内

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

希望能节省一些时间给某人,我浪费了几个小时!