src/Front/Controller/PageController.php line 34

  1. <?php
  2. namespace App\Front\Controller;
  3. use App\Entity\Journal;
  4. use App\Entity\JournalVolume;
  5. use App\Front\Util\JournalUrlGenerator;
  6. use App\Repository\JournalRepository;
  7. use App\Repository\JournalVolumeRepository;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  13. use App\Repository\PageRepository;
  14. use App\Util\LanguageUtil;
  15. use App\Front\Util\LangChanger;
  16. use App\Front\Controller\Journal\JournalController;
  17. class PageController extends AbstractController
  18. {
  19.     #[Route(path: [
  20.         'en' => '/{slug}/{additional}/{type}',
  21.         'pl' => '/{slug}/{additional}/{type}',
  22.     ], name'page'requirements: [
  23.         'slug' => '[a-zA-Z0-9\-_]+',
  24.         'additional' => '[a-zA-Z0-9\-_]+',
  25.         'type' => '[a-zA-Z]+',
  26.     ], defaults: [
  27.         'additional' => null,
  28.         'type' => null,
  29.     ], priority0)]
  30.     public function item(
  31.         Request $request,
  32.         PageRepository $pageRepository,
  33.         LangChanger $langChanger,
  34.         JournalRepository $journalRepository,
  35.         JournalVolumeRepository $journalVolumeRepository,
  36.         JournalUrlGenerator $journalUrlGenerator,
  37.         string $slug,
  38.         ?string $additional,
  39.         ?string $type,
  40.     ): Response {
  41.         $lang LanguageUtil::getLanguage($request->getLocale());
  42.         // old url redirect
  43.         /** @var Journal $journal */
  44.         if ($slug === 'pl' && $additional) {
  45.             $journalSlug $additional;
  46.         } else {
  47.             $journalSlug $slug;
  48.         }
  49.         $journal $journalRepository->createQueryBuilder('j')
  50.             ->where('j.slug = :slug OR j.importSlug = :slug OR j.importSlugEn = :slug')
  51.             ->andWhere('j.stat = true')
  52.             ->setParameter('slug'$journalSlug)
  53.             ->getQuery()
  54.             ->setMaxResults(1)
  55.             ->getOneOrNullResult();
  56.         if ($journal) {
  57.             if ($additional) {
  58.                 /** @var JournalVolume $volume */
  59.                 $volume $journalVolumeRepository->createQueryBuilder('v')
  60.                     ->where('v.parent = :journal')
  61.                     ->andWhere('v.importLink = :slug OR v.importLinkEn = :slug')
  62.                     ->andWhere('v.stat = true')
  63.                     ->setParameter('journal'$journal)
  64.                     ->setParameter('slug'$additional)
  65.                     ->getQuery()
  66.                     ->setMaxResults(1)
  67.                     ->getOneOrNullResult();
  68.                 if ($volume) {
  69.                     $slug $volume->readAvailableTranslation($request->getLocale(), 'slug');
  70.                     if ($slug) {
  71.                         $url $journalUrlGenerator->getPredefinedPageUrl(
  72.                             'journal_volumes_and_issues',
  73.                             $journal,
  74.                             $request->getLocale(),
  75.                             false,
  76.                             ['volumeSlug' => $slug]
  77.                         );
  78.                     } else {
  79.                         $url $journalUrlGenerator->getPredefinedPageUrl(
  80.                             'journal_volumes_and_issues',
  81.                             $journal,
  82.                             $request->getLocale(),
  83.                             false,
  84.                             ['volume' => $volume->getUuid()->toString()]
  85.                         );
  86.                     }
  87.                     if ($url) {
  88.                         return $this->redirect($url301);
  89.                     }
  90.                 }
  91.             }
  92.             return $this->redirectToRoute('journal_detail', [
  93.                 '_locale' => $journal->getNativeLanguage()->value,
  94.                 'journalSlug' => $journal->getSlug(),
  95.             ], 302);
  96.         }
  97.         $entity $pageRepository->findOneVisibleBySlug($slug$lang);
  98.         if (! $entity) {
  99.             throw new NotFoundHttpException('Page not found.');
  100.         }
  101.         $langChanger->setMain($entity);
  102.         if ($additional !== null) {
  103.             return match ($entity->getIdName()) {
  104.                 'news' => $this->forward(sprintf('%s::detail'NewsController::class), [
  105.                     'request' => $request,
  106.                     'page' => $entity,
  107.                     'slug' => $additional
  108.                 ]),
  109.                 'partners' => $this->forward(sprintf('%s::detail'PartnerController::class), [
  110.                     'request' => $request,
  111.                     'page' => $entity,
  112.                     'slug' => $additional
  113.                 ]),
  114.                 'collections' => $this->forward(sprintf('%s::detail'CollectionController::class), [
  115.                     'request' => $request,
  116.                     'page' => $entity,
  117.                     'slug' => $additional
  118.                 ]),
  119.                 'page_authors_list' => $this->forward(sprintf('%s::detail'AuthorController::class), [
  120.                     'request'  => $request,
  121.                     'page' => $entity,
  122.                     'slug' => $additional,
  123.                     'type' => $type,
  124.                 ]),
  125.                 'page_affiliations_list' => $this->forward(sprintf('%s::detail'AffiliationController::class), [
  126.                     'request'  => $request,
  127.                     'page' => $entity,
  128.                     'slug' => $additional,
  129.                 ]),
  130.                 default => throw new NotFoundHttpException(),
  131.             };
  132.         }
  133.         return match ($entity->getIdName()) {
  134.             'home' => $this->redirect($this->generateUrl('index', [])),
  135.             'news' => $this->forward(sprintf('%s::index'NewsController::class), [
  136.                 'request' => $request,
  137.                 'page' => $entity
  138.             ]),
  139.             'collections' => $this->forward(sprintf('%s::index'CollectionController::class), [
  140.                 'request' => $request,
  141.                 'page' => $entity
  142.             ]),
  143.             'partners' => $this->forward(sprintf('%s::index'PartnerController::class), [
  144.                 'request' => $request,
  145.                 'page' => $entity
  146.             ]),
  147.             'page_journals_list' => $this->forward(sprintf('%s::index'JournalController::class), [
  148.                 'request'  => $request,
  149.                 'page' => $entity
  150.             ]),
  151.             'page_authors_list' => $this->forward(sprintf('%s::index'AuthorController::class), [
  152.                 'request'  => $request,
  153.                 'page' => $entity
  154.             ]),
  155.             'contact' => $this->render('@front_templates/Page/contact.html.twig', [
  156.                 'entity' => $entity,
  157.             ]),
  158.             'error_report' => $this->render('@front_templates/Page/error_report.html.twig', [
  159.                 'entity' => $entity,
  160.             ]),
  161.             'search_results' => $this->forward(sprintf('%s::index'SearchController::class), [
  162.                 'request'  => $request,
  163.                 'page' => $entity
  164.             ]),
  165.             default => $this->render('@front_templates/Page/item.html.twig', [
  166.                 'entity' => $entity,
  167.             ]),
  168.         };
  169.     }
  170. }