src/AppBundle/Controller/MediaController.php line 112

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace AppBundle\Controller;
  4. use AppBundle\Form\MediaFormType;
  5. use AppBundle\Service\ReCaptchaService;
  6. use AppBundle\Website\LinkGenerator\MediaArticleLinkGenerator;
  7. use Exception;
  8. use Pimcore\Logger;
  9. use Pimcore\Mail;
  10. use Pimcore\Model\DataObject\MediaArticle;
  11. use Pimcore\Model\DataObject\MediaArticle\Listing;
  12. use Pimcore\Model\Document\Email;
  13. use Pimcore\Translation\Translator;
  14. use function Sentry\captureException;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Response;
  17. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  18. use Symfony\Component\Routing\Annotation\Route;
  19. class MediaController extends BaseController
  20. {
  21.     private ReCaptchaService $reCaptchaService;
  22.     public function __construct(ReCaptchaService $reCaptchaService)
  23.     {
  24.         $this->reCaptchaService $reCaptchaService;
  25.     }
  26.     public function mailAction(Request $request): Response
  27.     {
  28.         $params = [];
  29.         foreach ($request->attributes->all() as $key => $value) {
  30.             if (str_starts_with((string) $key'_')) {
  31.                 continue;
  32.             }
  33.             $params[$key] = $value;
  34.         }
  35.         return $this->render('Media/media_mail.html.twig'$params);
  36.     }
  37.     public function listAction(Request $request): Response
  38.     {
  39.         $keyword $request->get('keyword');
  40.         $category $request->get('category');
  41.         $mediaList = new Listing();
  42.         $mediaList->setOrderKey('date');
  43.         $mediaList->setOrder('desc');
  44.         return $this->render('Media/list.html.twig', [
  45.             'mediaList' => $mediaList,
  46.             'keyword' => $keyword,
  47.             'category' => $category,
  48.         ]);
  49.     }
  50.     public function searchAction(Request $requestTranslator $translator): Response
  51.     {
  52.         $keyword $request->get('keyword');
  53.         $category $request->get('category');
  54.         $message null;
  55.         $mediaList = new Listing();
  56.         $mediaList->setOrderKey('date');
  57.         $mediaList->setOrder('desc');
  58.         if ($keyword && $category) {
  59.             $mediaList->setCondition('(title LIKE :keyword OR introtext LIKE :keyword OR content LIKE :keyword) AND category = :category', ['keyword' => '%' $keyword '%''category' => $category]);
  60.         } elseif (!$keyword && $category) {
  61.             $mediaList->setCondition('category = ?'$category);
  62.         } elseif ($keyword && !$category) {
  63.             $mediaList->setCondition('(title LIKE :keyword OR introtext LIKE :keyword OR content LIKE :keyword)', ['keyword' => '%' $keyword '%']);
  64.         }
  65.         if (== $mediaList->getTotalCount()) {
  66.             $mediaList null;
  67.             $message $translator->trans('app.general.gemini.media.search.error.noresults');
  68.         }
  69.         return $this->render('Media/search.html.twig', [
  70.             'mediaList' => $mediaList,
  71.             'keyword' => $keyword,
  72.             'category' => $category,
  73.             'message' => $message,
  74.         ]);
  75.     }
  76.     /**
  77.      * @Route("{mediaarticles}/{articleslug}", name="mediaarticle-detail", defaults={"pathjoboffer"=""}, requirements={"mediaarticles":"media/artykuly", "articleslug"="[\w-]+"})
  78.      */
  79.     public function detailAction(Request $requestMediaArticleLinkGenerator $mediaArticleLinkGenerator): Response
  80.     {
  81.         $keyword $request->get('keyword');
  82.         $category $request->get('category');
  83.         $urlSlug $request->get('articleslug');
  84.         $article MediaArticle::getByUrlSlug($urlSlug, ['limit' => 1]);
  85.         if (!($article instanceof MediaArticle && ($article->isPublished() || $this->verifyPreviewRequest($request$article)))) {
  86.             throw new NotFoundHttpException('Article not found.');
  87.         }
  88.         return $this->render('Media/detail.html.twig', [
  89.             'article' => $article,
  90.             'keyword' => $keyword,
  91.             'category' => $category,
  92.         ]);
  93.     }
  94.     public function defaultAction(Request $requestTranslator $translator): Response
  95.     {
  96.         $keyword $request->get('keyword');
  97.         $category $request->get('category');
  98.         $mediaList = new Listing();
  99.         $mediaList->setOrderKey('date');
  100.         $mediaList->setOrder('desc');
  101.         $mediaList->setLimit(7);
  102.         $form $this->createForm(MediaFormType::class);
  103.         $form->handleRequest($request);
  104.         if ($form->isSubmitted() && $form->isValid()) {
  105.             $data $form->getData();
  106.             try {
  107.                 $this->sendMediaMail($data$request$translator);
  108.                 $this->addFlash('success'$translator->trans('app.general.gemini.mediaform.success'));
  109.                 $form $this->createForm(MediaFormType::class);
  110.             } catch (Exception $ex) {
  111.                 $this->addFlash('error'$ex->getMessage());
  112.             }
  113.         } elseif ($form->isSubmitted() && !$form->isValid()) {
  114.             $this->addFlash('error'$translator->trans('app.general.gemini.mediaform.error'));
  115.         }
  116.         return $this->render('Media/default.html.twig', [
  117.             'mediaList' => $mediaList,
  118.             'form' => $form->createView(),
  119.             'errors' => $form->getErrors(),
  120.             'keyword' => $keyword,
  121.             'category' => $category,
  122.             'googleRecaptchaSiteKey' => getenv('GOOGLE_RECAPTCHA_SITE_KEY') ?: '',
  123.         ]);
  124.     }
  125.     /**
  126.      * @throws Exception
  127.      */
  128.     private function sendMediaMail(array $dataRequest $requestTranslator $translator): void
  129.     {
  130.         $mailTemplate $this->document->getProperty('geminiMediaMailTemplate');
  131.         $mailTarget $this->document->getProperty('geminiMediaMailTarget');
  132.         $recaptchaVerified $this->reCaptchaService->verify((string) $request->get('g-recaptcha-response'));
  133.         if (empty($mailTemplate) || empty($mailTarget)) {
  134.             throw new Exception($translator->trans('app.general.gemini.mediaform.formconfigurationerror'));
  135.         }
  136.         if (!$recaptchaVerified) {
  137.             throw new Exception($translator->trans('app.general.gemini.recaptcha.error'));
  138.         }
  139.         $mail = new Mail();
  140.         $mail->disableLogging();
  141.         $mail->setDocument(Email::getByPath($mailTemplate));
  142.         $mail->setParams($data);
  143.         $mail->setSubject($translator->trans('app.general.gemini.mediaform.mediamailsubject'));
  144.         $mail->from('stronakorporacyjna@gemini.pl');
  145.         $mail->addTo($mailTarget);
  146.         try {
  147.             Logger::info('Media mail sending to: ' $mailTarget);
  148.             $mail->send();
  149.         } catch (Exception $ex) {
  150.             captureException($ex);
  151.             Logger::error('Media mail send failed: ' $ex->getMessage(), ['exception' => $ex]);
  152.             throw new Exception($translator->trans('app.general.gemini.mediaform.mailnotsenterror'), $ex->getCode(), $ex);
  153.         }
  154.     }
  155. }