Я пытаюсь реализовать раздел комментариев в блоге с Symfony и Doctrine, используя шаблоны Twig.
У меня возникли проблемы с попыткой реализовать систему ответов для моих комментариев. Я хотел бы иметь что-то вроде этого:
<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>
Поэтому я хотел бы иметь некоторую систему вложенных комментариев.
У меня есть объект Comment с свойством $response
с отношением OneToOne с другим объектом Comment:
/**
* @ORM\OneToOne(targetEntity="Comment")
*/
protected $response;
В моем контроллере я просто получаю свои комментарии следующим образом:
$comments = $this->getDoctrine()
->getManager()
->getRepository('AppBundle:Comment')
->findByArticle($article);
Теперь я пытаюсь создать HTML (Twig), но я не знаю, как цитировать весь комментарий и связанный с ним ответ, чтобы я мог создавать HTML, как я писал чуть выше...
Кто может мне помочь?
Благодарю.
Все, что вам нужно, это повторение. У вас есть несколько вариантов выбора, один из которых использует макрос.
Создайте файл 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>
Здесь у вас есть аналогичная проблема, уже решена, с другими решениями: как визуализировать дерево в Twig