src/Controller/FeedbackController.php line 102

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Feedback;
  4. use App\Form\FeedbackType;
  5. use App\Message\SendEmailSMTPMessage;
  6. use App\Service\MetaTags\MetaTags;
  7. use Doctrine\ORM\EntityManagerInterface;
  8. use Knp\Component\Pager\PaginatorInterface;
  9. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  10. use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Messenger\MessageBusInterface;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. class FeedbackController extends AbstractController
  16. {
  17.     
  18.     private $em;
  19.     
  20.     public function __construct(EntityManagerInterface $em)
  21.     {
  22.         $this->em $em;
  23.     }
  24.     /**
  25.      * @Route("/admin/feedback", name="feedback_index", methods={"GET"})
  26.      */
  27.     public function index(PaginatorInterface $paginatorRequest $request): Response
  28.     {
  29.         $feedbacks $this->em->getRepository(Feedback::class)->createQueryBuilder('feedback')->orderBy('feedback.id''DESC');
  30.         $direction $this->getParameter('feedback');
  31.         $defaultData = array('title' => '');
  32.         $form $this->createFormBuilder($defaultData, ['csrf_protection' => false])
  33.             ->add('status'ChoiceType::class, [
  34.                 'label' => 'Опубликовано да/нет',
  35.                 'placeholder' => 'Опубликовано да/нет?',
  36.                 'required' => false,
  37.                 'multiple' => false,
  38.                 'choices' => ['нет' => 0'да' => 1]
  39.             ])
  40.             ->add('direction'ChoiceType::class, [
  41.                 'placeholder' => 'Выберите направление',
  42.                 'choices' => array_flip($direction['direction']),
  43.                 'required' => false,
  44.                 'multiple' => false,
  45.                 'label' => 'Направление',
  46.             ])
  47.             ->setMethod('GET')
  48.             ->getForm();
  49.         if ($request->getMethod() == 'GET') {
  50.             $form->handleRequest($request);
  51.             $data $form->getData();
  52.         }
  53.         if(isset($data['status'])){
  54.             $feedbacks->andWhere('feedback.status LIKE :status')
  55.                 ->setParameter('status'$data['status']);
  56.         }
  57.         if(isset($data['direction'])){
  58.             $feedbacks->andWhere('feedback.direction = :direction')
  59.                 ->setParameter('direction'$data['direction']);
  60.         }
  61.         $pagination $paginator->paginate(
  62.             $feedbacks->getQuery(), $request->query->getInt('page'1), 25);
  63.         $pagination->setTemplate('@KnpPaginator/Pagination/twitter_bootstrap_v4_pagination.html.twig');
  64.         return $this->render('admin/feedback/index.html.twig', [
  65.             'pagination' => $pagination,
  66.             'form' => $form->createView(),
  67.             'direction' => $this->getParameter('feedback')
  68.         ]);
  69.     }
  70.     /**
  71.      * @Route("/admin/feedback/new", name="feedback_new", methods={"GET","POST"})
  72.      */
  73.     public function new(Request $request): Response
  74.     {
  75.         $feedback = new Feedback();
  76.         $form $this->createForm(FeedbackType::class, $feedback);
  77.         $form->handleRequest($request);
  78.         if ($form->isSubmitted() && $form->isValid()) {
  79.             $feedback->setCreated(time());
  80.             $this->em->persist($feedback);
  81.             $this->em->flush();
  82.             return $this->redirectToRoute('feedback_index');
  83.         }
  84.         return $this->render('admin/feedback/new.html.twig', [
  85.             'feedback' => $feedback,
  86.             'form' => $form->createView(),
  87.         ]);
  88.     }
  89.     /**
  90.      * @Route("/guestbook", name="feedback_add", methods={"GET","POST"})
  91.      */
  92.     public function add(Request $requestMessageBusInterface $busPaginatorInterface $paginatorMetaTags $metaTags): Response
  93.     {
  94.         $feedback = new Feedback();
  95.         $feedback->setStatus(false);
  96.         $form $this->createForm(FeedbackType::class, $feedback);
  97.         $form->handleRequest($request);
  98.         if ($form->isSubmitted() && $form->isValid()) {
  99.             //Поле ContactPhone должно быть пустым, т.к. скрыто в форме
  100.             if(!empty($feedback->getContactPhone())) return $this->redirectToRoute('fake_form_complete');
  101.             $feedback->setCreated(time());
  102.             $this->em->persist($feedback);
  103.             $this->em->flush();
  104.             $adminEmail = [
  105.                 'from' => [
  106.                     'email' => 'robot@internauka.org',
  107.                     'name' => 'Издательство Интернаука'
  108.                 ],
  109.                 'to' => 'igoragulin@gmail.com',
  110.                 'subject' => 'Отзыв, '.$feedback->getName(),
  111.                 'htmlTemplate' => 'emails/feedback/admin.html.twig',
  112.                 'context' => [
  113.                     'feedback' => $feedback,
  114.                     'direction' => $this->getParameter('feedback')
  115.                 ],
  116.                 'transport' => 'main'
  117.             ];
  118.             //добавление задачи в очередь
  119.             $bus->dispatch(new SendEmailSMTPMessage($adminEmail));
  120.             return $this->redirectToRoute('feedback_complete');
  121.         }
  122.         $feedbacks $this->em->getRepository(Feedback::class)
  123.             ->findBy(['status' => 1],['id'=>'DESC']);
  124.         $page = (!empty($request->query->getInt('page'1)))?$request->query->getInt('page'1):1;
  125.         $pagination $paginator->paginate(
  126.             $feedbacks$page15);
  127.         return $this->render('feedback/new.html.twig', [
  128.             'feedbacks' => $pagination,
  129.             'form' => $form->createView(),
  130.             'metaTags' => $metaTags->getFeedback(),
  131.         ]);
  132.     }
  133.     /**
  134.      * @Route("/guestbook/complete", name="feedback_complete")
  135.      */
  136.     public function complete(): Response
  137.     {
  138.         return $this->render('feedback/complete.html.twig', []);
  139.     }
  140.     /**
  141.      * @Route("/admin/feedback/{id}/edit", name="feedback_edit", methods={"GET","POST"})
  142.      */
  143.     public function edit(Request $requestFeedback $feedback): Response
  144.     {
  145.         $form $this->createForm(FeedbackType::class, $feedback);
  146.         $form->handleRequest($request);
  147.         if ($form->isSubmitted() && $form->isValid()) {
  148.             $this->em->flush();
  149.             return $this->redirectToRoute('feedback_index');
  150.         }
  151.         return $this->render('admin/feedback/edit.html.twig', [
  152.             'feedback' => $feedback,
  153.             'form' => $form->createView(),
  154.         ]);
  155.     }
  156.     /**
  157.      * @Route("/admin/feedback/{id}", priority=11, name="feedback_delete", methods={"DELETE"})
  158.      */
  159.     public function delete(Request $requestFeedback $feedback): Response
  160.     {
  161.         if ($this->isCsrfTokenValid('delete'.$feedback->getId(), $request->request->get('_token'))) {
  162.             $this->em->remove($feedback);
  163.             $this->em->flush();
  164.         }
  165.         return $this->redirectToRoute('feedback_index');
  166.     }
  167. }