<?php
namespace App\Controller;
use App\Entity\Feedback;
use App\Form\FeedbackType;
use App\Message\SendEmailSMTPMessage;
use App\Service\MetaTags\MetaTags;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Messenger\MessageBusInterface;
use Symfony\Component\Routing\Annotation\Route;
class FeedbackController extends AbstractController
{
private $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
/**
* @Route("/admin/feedback", name="feedback_index", methods={"GET"})
*/
public function index(PaginatorInterface $paginator, Request $request): Response
{
$feedbacks = $this->em->getRepository(Feedback::class)->createQueryBuilder('feedback')->orderBy('feedback.id', 'DESC');
$direction = $this->getParameter('feedback');
$defaultData = array('title' => '');
$form = $this->createFormBuilder($defaultData, ['csrf_protection' => false])
->add('status', ChoiceType::class, [
'label' => 'Опубликовано да/нет',
'placeholder' => 'Опубликовано да/нет?',
'required' => false,
'multiple' => false,
'choices' => ['нет' => 0, 'да' => 1]
])
->add('direction', ChoiceType::class, [
'placeholder' => 'Выберите направление',
'choices' => array_flip($direction['direction']),
'required' => false,
'multiple' => false,
'label' => 'Направление',
])
->setMethod('GET')
->getForm();
if ($request->getMethod() == 'GET') {
$form->handleRequest($request);
$data = $form->getData();
}
if(isset($data['status'])){
$feedbacks->andWhere('feedback.status LIKE :status')
->setParameter('status', $data['status']);
}
if(isset($data['direction'])){
$feedbacks->andWhere('feedback.direction = :direction')
->setParameter('direction', $data['direction']);
}
$pagination = $paginator->paginate(
$feedbacks->getQuery(), $request->query->getInt('page', 1), 25);
$pagination->setTemplate('@KnpPaginator/Pagination/twitter_bootstrap_v4_pagination.html.twig');
return $this->render('admin/feedback/index.html.twig', [
'pagination' => $pagination,
'form' => $form->createView(),
'direction' => $this->getParameter('feedback')
]);
}
/**
* @Route("/admin/feedback/new", name="feedback_new", methods={"GET","POST"})
*/
public function new(Request $request): Response
{
$feedback = new Feedback();
$form = $this->createForm(FeedbackType::class, $feedback);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$feedback->setCreated(time());
$this->em->persist($feedback);
$this->em->flush();
return $this->redirectToRoute('feedback_index');
}
return $this->render('admin/feedback/new.html.twig', [
'feedback' => $feedback,
'form' => $form->createView(),
]);
}
/**
* @Route("/guestbook", name="feedback_add", methods={"GET","POST"})
*/
public function add(Request $request, MessageBusInterface $bus, PaginatorInterface $paginator, MetaTags $metaTags): Response
{
$feedback = new Feedback();
$feedback->setStatus(false);
$form = $this->createForm(FeedbackType::class, $feedback);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
//Поле ContactPhone должно быть пустым, т.к. скрыто в форме
if(!empty($feedback->getContactPhone())) return $this->redirectToRoute('fake_form_complete');
$feedback->setCreated(time());
$this->em->persist($feedback);
$this->em->flush();
$adminEmail = [
'from' => [
'email' => 'robot@internauka.org',
'name' => 'Издательство Интернаука'
],
'to' => 'igoragulin@gmail.com',
'subject' => 'Отзыв, '.$feedback->getName(),
'htmlTemplate' => 'emails/feedback/admin.html.twig',
'context' => [
'feedback' => $feedback,
'direction' => $this->getParameter('feedback')
],
'transport' => 'main'
];
//добавление задачи в очередь
$bus->dispatch(new SendEmailSMTPMessage($adminEmail));
return $this->redirectToRoute('feedback_complete');
}
$feedbacks = $this->em->getRepository(Feedback::class)
->findBy(['status' => 1],['id'=>'DESC']);
$page = (!empty($request->query->getInt('page', 1)))?$request->query->getInt('page', 1):1;
$pagination = $paginator->paginate(
$feedbacks, $page, 15);
return $this->render('feedback/new.html.twig', [
'feedbacks' => $pagination,
'form' => $form->createView(),
'metaTags' => $metaTags->getFeedback(),
]);
}
/**
* @Route("/guestbook/complete", name="feedback_complete")
*/
public function complete(): Response
{
return $this->render('feedback/complete.html.twig', []);
}
/**
* @Route("/admin/feedback/{id}/edit", name="feedback_edit", methods={"GET","POST"})
*/
public function edit(Request $request, Feedback $feedback): Response
{
$form = $this->createForm(FeedbackType::class, $feedback);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->em->flush();
return $this->redirectToRoute('feedback_index');
}
return $this->render('admin/feedback/edit.html.twig', [
'feedback' => $feedback,
'form' => $form->createView(),
]);
}
/**
* @Route("/admin/feedback/{id}", priority=11, name="feedback_delete", methods={"DELETE"})
*/
public function delete(Request $request, Feedback $feedback): Response
{
if ($this->isCsrfTokenValid('delete'.$feedback->getId(), $request->request->get('_token'))) {
$this->em->remove($feedback);
$this->em->flush();
}
return $this->redirectToRoute('feedback_index');
}
}