src/Front/Controller/PageController.php line 34
<?php
namespace App\Front\Controller;
use App\Entity\Journal;
use App\Entity\JournalVolume;
use App\Front\Util\JournalUrlGenerator;
use App\Repository\JournalRepository;
use App\Repository\JournalVolumeRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use App\Repository\PageRepository;
use App\Util\LanguageUtil;
use App\Front\Util\LangChanger;
use App\Front\Controller\Journal\JournalController;
class PageController extends AbstractController
{
#[Route(path: [
'en' => '/{slug}/{additional}/{type}',
'pl' => '/{slug}/{additional}/{type}',
], name: 'page', requirements: [
'slug' => '[a-zA-Z0-9\-_]+',
'additional' => '[a-zA-Z0-9\-_]+',
'type' => '[a-zA-Z]+',
], defaults: [
'additional' => null,
'type' => null,
], priority: 0)]
public function item(
Request $request,
PageRepository $pageRepository,
LangChanger $langChanger,
JournalRepository $journalRepository,
JournalVolumeRepository $journalVolumeRepository,
JournalUrlGenerator $journalUrlGenerator,
string $slug,
?string $additional,
?string $type,
): Response {
$lang = LanguageUtil::getLanguage($request->getLocale());
// old url redirect
/** @var Journal $journal */
if ($slug === 'pl' && $additional) {
$journalSlug = $additional;
} else {
$journalSlug = $slug;
}
$journal = $journalRepository->createQueryBuilder('j')
->where('j.slug = :slug OR j.importSlug = :slug OR j.importSlugEn = :slug')
->andWhere('j.stat = true')
->setParameter('slug', $journalSlug)
->getQuery()
->setMaxResults(1)
->getOneOrNullResult();
if ($journal) {
if ($additional) {
/** @var JournalVolume $volume */
$volume = $journalVolumeRepository->createQueryBuilder('v')
->where('v.parent = :journal')
->andWhere('v.importLink = :slug OR v.importLinkEn = :slug')
->andWhere('v.stat = true')
->setParameter('journal', $journal)
->setParameter('slug', $additional)
->getQuery()
->setMaxResults(1)
->getOneOrNullResult();
if ($volume) {
$slug = $volume->readAvailableTranslation($request->getLocale(), 'slug');
if ($slug) {
$url = $journalUrlGenerator->getPredefinedPageUrl(
'journal_volumes_and_issues',
$journal,
$request->getLocale(),
false,
['volumeSlug' => $slug]
);
} else {
$url = $journalUrlGenerator->getPredefinedPageUrl(
'journal_volumes_and_issues',
$journal,
$request->getLocale(),
false,
['volume' => $volume->getUuid()->toString()]
);
}
if ($url) {
return $this->redirect($url, 301);
}
}
}
return $this->redirectToRoute('journal_detail', [
'_locale' => $journal->getNativeLanguage()->value,
'journalSlug' => $journal->getSlug(),
], 302);
}
$entity = $pageRepository->findOneVisibleBySlug($slug, $lang);
if (! $entity) {
throw new NotFoundHttpException('Page not found.');
}
$langChanger->setMain($entity);
if ($additional !== null) {
return match ($entity->getIdName()) {
'news' => $this->forward(sprintf('%s::detail', NewsController::class), [
'request' => $request,
'page' => $entity,
'slug' => $additional
]),
'partners' => $this->forward(sprintf('%s::detail', PartnerController::class), [
'request' => $request,
'page' => $entity,
'slug' => $additional
]),
'collections' => $this->forward(sprintf('%s::detail', CollectionController::class), [
'request' => $request,
'page' => $entity,
'slug' => $additional
]),
'page_authors_list' => $this->forward(sprintf('%s::detail', AuthorController::class), [
'request' => $request,
'page' => $entity,
'slug' => $additional,
'type' => $type,
]),
'page_affiliations_list' => $this->forward(sprintf('%s::detail', AffiliationController::class), [
'request' => $request,
'page' => $entity,
'slug' => $additional,
]),
default => throw new NotFoundHttpException(),
};
}
return match ($entity->getIdName()) {
'home' => $this->redirect($this->generateUrl('index', [])),
'news' => $this->forward(sprintf('%s::index', NewsController::class), [
'request' => $request,
'page' => $entity
]),
'collections' => $this->forward(sprintf('%s::index', CollectionController::class), [
'request' => $request,
'page' => $entity
]),
'partners' => $this->forward(sprintf('%s::index', PartnerController::class), [
'request' => $request,
'page' => $entity
]),
'page_journals_list' => $this->forward(sprintf('%s::index', JournalController::class), [
'request' => $request,
'page' => $entity
]),
'page_authors_list' => $this->forward(sprintf('%s::index', AuthorController::class), [
'request' => $request,
'page' => $entity
]),
'contact' => $this->render('@front_templates/Page/contact.html.twig', [
'entity' => $entity,
]),
'error_report' => $this->render('@front_templates/Page/error_report.html.twig', [
'entity' => $entity,
]),
'search_results' => $this->forward(sprintf('%s::index', SearchController::class), [
'request' => $request,
'page' => $entity
]),
default => $this->render('@front_templates/Page/item.html.twig', [
'entity' => $entity,
]),
};
}
}