Как обрабатывать комментарии с формами подкомментариев в Symfony 3? - PullRequest
0 голосов
/ 26 октября 2018

Хорошо, у меня есть этот 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();

});

Наконец, когда я нажимаю «Ответить», он работает только для первого комментария, потому что форма может быть отображена только один раз, я исследовал и нашел способ сделать несколько форм, но это не очень хорошо. Как я могу справиться с этим? Спасибо!

...