在Symfony-Doctrine博客中嵌套注释的Twig循环

时间:2016-01-03 23:41:14

标签: php doctrine-orm twig symfony

我正在尝试使用Twig模板在Symfony和Doctrine的博客上实现评论部分。

我在尝试为我的评论实施响应系统时遇到了一些麻烦。我想有这样的事情:

<div class="comment">
    <p>This is comment number 1</p>
    <div class="response">
        <p>This is a response to comment number 1</p>
        <div class="response">
            <p>This is a response to response just above</p>
        </div>
    </div>
</div>

所以我希望有一种嵌套的评论系统。

我有一个具有$response属性的Comment实体,该属性与另一个Comment实体具有OneToOne关系:

/**
 * @ORM\OneToOne(targetEntity="Comment")
 */
protected $response;

在我的控制器中,我只是得到这样的评论:

$comments = $this->getDoctrine()
                    ->getManager()
                    ->getRepository('AppBundle:Comment')
                    ->findByArticle($article);

现在我正在尝试创建HTML(Twig),但我不知道如何遍历所有注释和相关响应,因此我可以创建HTML,就像我上面写的那样......

任何可以帮助我的人?​​

感谢。

1 个答案:

答案 0 :(得分:6)

你需要的只是复发。您有几个选项可供选择,其中一个使用macro

使用您的宏创建twig文件:

{# src/AppBundle/Resources/views/Default/_macro.html.twig #}

{% macro print_comments_recursively(comment) %}
    <div class="response">
        <p>{{ comment }}</p> {# implement __toString on your Comment class or print appropriate property #}
        {% if comment.response is not null  %}
            {{ _self.print_comments_recursively(comment.response) }}
        {% endif %}
    </div>
{% endmacro %}

在视图中导入宏并使用它:

{% import 'AppBundle:Default:_macro.html.twig' as macros %}
<div class="comment">
    <p>{{ comment }}</p>
    {% if comment.response %}
        {{ macros.print_comments_recursively(comment.response) }}
    {% endif %}
</div>

在这里,您已经解决了与其他解决方案类似的问题:How to render a tree in Twig