<?php
namespace App\ModuleHandler;
use App\Entity\Post;
use App\Entity\Category;
use App\Entity\MediaCms;
use App\Service\RenderBlocService;
use App\Service\CodeService;
use App\Service\MetaService;
use App\Entity\ModelGallerie;
use Symfony\Component\Intl\Locale;
use Doctrine\ORM\EntityManagerInterface;
use App\Service\ImageGalleryService;
use App\ModuleHandler\ModuleHandlerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Leogout\Bundle\SeoBundle\Seo\Og\OgSeoGenerator;
use Symfony\Component\String\Slugger\SluggerInterface;
use Leogout\Bundle\SeoBundle\Seo\Basic\BasicSeoGenerator;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class PageCategorieService implements ModuleHandlerInterface
{
public $basicSeo;
public $seo;
public $metaService;
private $theme;
private $em;
private $renderBloc;
private $codeService;
private $urlGenerator;
private $imageGalleryService;
private $requestStack;
public function __construct(string $theme,
UrlGeneratorInterface $urlGenerator,
BasicSeoGenerator $basicSeo,
OgSeoGenerator $seo,
MetaService $metaService,
RenderBlocService $renderBloc,
EntityManagerInterface $em,
ImageGalleryService $imageGalleryService,
CodeService $codeService,
RequestStack $requestStack){
$this->em = $em;
$this->metaService = $metaService;
$this->renderBloc = $renderBloc;
$this->basicSeo = $basicSeo;
$this->seo = $seo;
$this->theme = $theme;
$this->codeService = $codeService;
$this->urlGenerator = $urlGenerator;
$this->imageGalleryService = $imageGalleryService;
$this->requestStack = $requestStack;
}
public function handle(string $slug): array
{
$locale = Locale::getDefault();
$request = $this->requestStack->getCurrentRequest();
$path = $request->get('slug');
$nb_page = $request->query->get('page') ?? 1;
$categorie = $this->em->getRepository(Category::class)->findCategoryBySlug($slug);
if(!$categorie){
throw new NotFoundHttpException('Sorry not existing!');
}
$this->metaService->metaTags($categorie);
$this->codeService->setCodeHead($categorie->getTagManagerhead()?? '');
$this->codeService->setCodeBody($categorie->getTagManagerbody()?? '');
$slugs = explode('/', $path);
$breadcrumb = [];
$breadcrumb [] = ['url'=> $this->urlGenerator->generate('index_page_home', [], UrlGeneratorInterface::ABSOLUTE_URL),
'name'=> 'Accueil','active'=> true];
if($categorie->getTypePost()->getSystemName() == 'actualites' && $categorie->getParent()){
$categorieParent = $this->em->getRepository(Category::class)->find($categorie->getParent());
if($categorieParent){
$breadcrumb [] = ['url'=> $this->urlGenerator->generate('page', ['slug'=> $categorieParent->translate($locale)->getSlugUrl()], UrlGeneratorInterface::ABSOLUTE_URL),
'name'=> $categorieParent->translate($locale)->getTitreCategorie(),'active'=> true];
}
}
if (false) {
array_pop($slugs);
foreach ($slugs as $value) {
$res_categorie = $this->em->getRepository(Category::class)->findCategoryBySlug($value);
if($res_categorie){
$breadcrumb [] = ['url'=> $this->urlGenerator->generate('page', ['slug'=> $value], UrlGeneratorInterface::ABSOLUTE_URL),
'name'=> $res_categorie->translate($locale)->getTitreCategorie(),'active'=> true];
}
}
}else{
$breadcrumb [] = ['url'=> $this->urlGenerator->generate('page', ['slug'=> $slug], UrlGeneratorInterface::ABSOLUTE_URL),
'name'=> $categorie->translate($locale)->getTitreCategorie(),'active'=> false];
}
$schemaOrg = $this->metaService->schemaOrgBreadcrumb($breadcrumb);
$renderService = $this->renderBloc->RenderBloc($categorie,$schemaOrg,'Category');
$blocs = $renderService['bloc'];
$schemaOrg = $renderService['schemaOrg'];
$this->codeService->setSchemaOrg($schemaOrg);
$this->codeService->setcanonicalUrl($this->metaService->canonicalCategorieUrl($categorie));
$titre_page = $categorie->translate($locale)->getTitreCategorie();
$image_bandeau = $categorie->getImageBandeau() ?? null;
$image_bandeau_alt = $titre_page;
$galleries = $this->em->getRepository(MediaCms::class)->findFileByModule('category',$categorie->getId(),'media');
$galleries_images = $this->imageGalleryService->getGalleryImages($galleries);
$modele_galerie_choisie = $categorie->getModeleGallerie() ? $categorie->getModeleGallerie()->getId() : 6;
$modele_gallerie = $this->em->getRepository(ModelGallerie::class)->findById($modele_galerie_choisie);
$twig_galerie = $modele_gallerie[0]->getTwig();
$sous_categories = $this->em->getRepository(Category::class)->findCategoryIdsByParentId($categorie->getId());
$resultats = $this->em->getRepository(Post::class)->findPostBySpecifiqueCategory($categorie,$nb_page,$sous_categories);
$template = $categorie->getTypeAffichageHome();
if($categorie->getParent() != 0){
$categorieParent = $this->em->getRepository(Category::class)->find($categorie->getParent());
if($categorieParent){
$liste_sous_categorie = $this->em->getRepository(Category::class)->findListSousCategorie($categorieParent);
}
}else{
$liste_sous_categorie = $this->em->getRepository(Category::class)->findListSousCategorie($categorie);
}
$categories = null;
if($categorie->getTypePost()->getSystemName() == 'actualites'){
$categories = $this->em->getRepository(Category::class)->findBy(['actif'=> true,'TypePost'=> $categorie->getTypePost()->getId()],['position'=> 'ASC']);
}
if($categorie->getTypePost()->getSystemName() == 'actualites' || $categorie->getTypePost()->getSystemName() == 'besoins'){
return [
'template' => 'theme/'.$this->theme.'/page_categorie_custom.html.twig',
'data' => [
'id_page'=> 'categorie-'.$categorie->getId(),
'breadcrumb'=> $breadcrumb,
'titre_page'=> $titre_page,
'image_bandeau'=> $image_bandeau,
'image_bandeau_alt'=> $image_bandeau_alt,
'galleries'=> $galleries_images,
'twig_galerie'=> $twig_galerie,
'categorie' => $categorie,
'categories'=> $categories,
'blocs'=> $blocs,
'liste_sous_categorie'=> $liste_sous_categorie,
'articles'=> $resultats,
'template'=> $template,
'systemName' => $categorie->getTypePost()->getSystemName(),
]
];
}else{
return [
'template' => 'theme/'.$this->theme.'/page_categorie.html.twig',
'data' => [
'id_page'=> 'categorie-'.$categorie->getId(),
'breadcrumb'=> $breadcrumb,
'titre_page'=> $titre_page,
'image_bandeau'=> $image_bandeau,
'image_bandeau_alt'=> $image_bandeau_alt,
'galleries'=> $galleries_images,
'twig_galerie'=> $twig_galerie,
'categorie' => $categorie,
'categories'=> $categories,
'blocs'=> $blocs,
'liste_sous_categorie'=> $liste_sous_categorie,
'articles'=> $resultats,
'template'=> $template
]
];
}
}
}