src/Front/Controller/PageController.php line 35

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