Хорошо, у меня есть этот FormType:
<?php
namespace AppBundle\Form;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class CommentFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('content', TextareaType::class, array(
'label' => 'Коментар',
'attr' => array(
'class' => 'form-control input_box'
)
))
->add('submit', SubmitType::class, array(
'label' => 'ИЗПРАТИ',
'attr' => array(
'id' => 'saveButton'
)
));
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\Comment',
'attr' => [
'class' => 'comment_box',
]
));
}
public function getBlockPrefix()
{
return '';
}
}
И этот метод в контроллере, который возвращает представление с формами, поэтому у меня есть два экземпляра одинаковой формы (для комментариев и для ответов)
/**
* @Route("/articles/{category}/{id}", name="article")
*/
public function getArticle($category, $id)
{
$articleRepo = $this->getDoctrine()->getRepository(Article::class);
$article = $articleRepo->find($id);
$categoryRepo = $this->getDoctrine()->getRepository(ArticleCategory::class);
$categories = $categoryRepo->findAll();
$categoryId = $categoryRepo->getCategoryIdByCode($category);
$lastArticles = $articleRepo->getLimitArticles($categoryId, 3);
$commentForm = $this->createForm(CommentFormType::class);
$answerForm = $this->createForm(CommentFormType::class);
$commentRepo = $this->getDoctrine()->getRepository(Comment::class);
$comments = $commentRepo->getComments($id);
foreach ($comments as $comment) {
$subcomments = $commentRepo->getSubComments($comment->getId());
$comment->subComments = $subcomments;
}
return $this->render('articles/article.html.twig', [
'article' => $article,
'categories' => $categories,
'lastArticles' => $lastArticles,
'commentForm' => $commentForm->createView(),
'answerForm' => $answerForm->createView(),
'comments' => $comments
]);
}
Затем в файле просмотра я выкладываю комментарии с подкомментами:
{% for comment in comments %}
<div class="comment_area">
<!--h3>2 Comment</h3-->
<div class="media">
<div class="media-left">
<a href="#">
<img class="media-object" src="images/testimonial-4.jpg" alt="">
</a>
</div>
<div class="media-body" id="comment-div{{ comment.id }}">
<a class="media-heading" href="#">Emran Khan</a>
<h5>Oct 18, 2016</h5>
<p>{{ comment.content }}</p>
<a class="reply" id="reply{{ comment.id }}" href="{{ comment.id }}">Отговори</a>
</div>
<div class="post_comment" id="reply-comment-form{{ comment.id }}" style="display:none;">
<h3>Добави отговор</h3>
{{ form_start(answerForm, {'attr': {'id':'answer-box'}, 'action': path('addcomment', {'category':article.category.code, 'id':article.id, 'replyToId':comment.id})}) }}
<div class="col-md-12">
<h4>{{ form_label(answerForm.content) }}</h4>
{{ form_widget(answerForm.content) }}
{{ form_widget(answerForm.submit) }}
</div>
{{ form_end(answerForm) }}
</div>
</div>
</div>
{% for subComment in comment.subComments %}
<div class="comment_area reply_comment">
<div class="media">
<div class="media-left">
<a href="#">
<img class="media-object" src="images/testimonial-1.jpg" alt="">
</a>
</div>
<div class="media-body">
<a class="media-heading" href="#">Prodip Ghosh</a>
<h5>Oct 18, 2016</h5>
<p>{{ subComment.content }}</p>
</div>
</div>
</div>
{% endfor %}
{% endfor %}
<div class="post_comment">
<h3>Добави коментар</h3>
{{ form_start(commentForm, {'action': path('addcomment', {'category':article.category.code, 'id':article.id})}) }}
<div class="col-md-12">
<h4>{{ form_label(commentForm.content) }}</h4>
{{ form_widget(commentForm.content) }}
{{ form_widget(commentForm.submit) }}
</div>
{{ form_end(commentForm) }}
</div>
Таким образом, форма ответа скрывается с помощью display:none
, поэтому при нажатии на ссылку для ответа я вызываю файл js и показываю форму:
$('.reply').click(function (event)
{
event.preventDefault();
var commentId = $(this).attr('href');
$('#reply-comment-form' + commentId).show();
});
Наконец, когда я нажимаю «Ответить», он работает только для первого комментария, потому что форма может быть отображена только один раз, я исследовал и нашел способ сделать несколько форм, но это не очень хорошо. Как я могу справиться с этим? Спасибо!