<?php
namespace App\ModuleHandler;
use App\Entity\Post;
use App\Entity\Video;
use App\Entity\Category;
use App\Entity\MediaCms;
use App\Service\CodeService;
use App\Service\MetaService;
use App\Entity\ModelGallerie;
use App\Service\HrefLangService;
use App\Service\RenderBlocService;
use Symfony\Component\Intl\Locale;
use App\Service\ImageGalleryService;
use Doctrine\ORM\EntityManagerInterface;
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 PageCmsService implements ModuleHandlerInterface
{
public $basicSeo;
public $seo;
public $metaService;
private $theme;
private $em;
private $renderBloc;
private $codeService;
private $urlGenerator;
private $imageGalleryService;
private $requestStack;
private $hrefLang;
public function __construct(string $theme,
UrlGeneratorInterface $urlGenerator,
BasicSeoGenerator $basicSeo,
OgSeoGenerator $seo,
MetaService $metaService,
RenderBlocService $renderBloc,
EntityManagerInterface $em,
ImageGalleryService $imageGalleryService,
CodeService $codeService,
HrefLangService $hrefLang,
RequestStack $requestStack){
$this->em = $em;
$this->metaService = $metaService;
$this->renderBloc = $renderBloc;
$this->basicSeo = $basicSeo;
$this->seo = $seo;
$this->hrefLang = $hrefLang;
$this->theme = $theme;
$this->codeService = $codeService;
$this->urlGenerator = $urlGenerator;
$this->requestStack = $requestStack;
$this->imageGalleryService = $imageGalleryService;
}
public function handle(string $slug): array
{
$locale = Locale::getDefault();
$request = $this->requestStack->getCurrentRequest();
$url = $request->getUri();
$page = $this->em->getRepository(Post::class)->findPostBySlug($slug);
if($page == null){
throw new NotFoundHttpException('Sorry not existing!');
}
if ($page->getTypePost()->getSystemName() == "produits") {
throw new NotFoundHttpException('Sorry not existing!');
}
$this->metaService->metaTags($page);
$this->codeService->setCodeRobots($page->getMetaRobots()?? '');
$this->codeService->setCodeHead($page->getTagManagerhead()?? '');
$this->codeService->setCodeBody($page->getTagManagerbody()?? '');
$this->codeService->setcanonicalUrl($this->metaService->canonicalUrl($page));
$this->codeService->setSchemaOrgGeneral($page->translate($locale)->getSchema()?? '');
$this->codeService->sethreflang($this->hrefLang->hreflangCmsPage($page));
$breadcrumb = [];
$breadcrumb [] = ['url'=> $this->urlGenerator->generate('index_page_home', [], UrlGeneratorInterface::ABSOLUTE_URL),
'name'=> 'Accueil','active'=> true];
// $path = $request->get('slug');
// $slugs = explode('/', $path);
// if ($slugs && count($slugs) > 1) {
// array_pop($slugs);
// foreach ($slugs as $value) {
// $res_categorie = $this->em->getRepository(Category::class)->findCategoryBySlug($value);
// if($res_categorie){
// if($res_categorie->getParent() != 0){
// $categorieParent = $this->em->getRepository(Category::class)->find($res_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];
// $breadcrumb [] = ['url'=> $this->urlGenerator->generate('page', ['slug'=> $categorieParent->translate($locale)->getSlugUrl().'/'.$value], UrlGeneratorInterface::ABSOLUTE_URL),
// 'name'=> $res_categorie->translate($locale)->getTitreCategorie(),'active'=> true];
// }
// }else{
// $breadcrumb [] = ['url'=> $this->urlGenerator->generate('page', ['slug'=> $value], UrlGeneratorInterface::ABSOLUTE_URL),
// 'name'=> $res_categorie->translate($locale)->getTitreCategorie(),'active'=> true];
// }
// }
// }
// }else{
// if ($page->getDefaultCategorie()) {
// $categorieDefault = $this->em->getRepository(Category::class)->find($page->getDefaultCategorie());
// if ($categorieDefault) {
// if($page->getTypePost()->getSystemName() == 'actualites'){
// $categorieParent = $this->em->getRepository(Category::class)->find($categorieDefault->getParent());
// if($categorieParent){
// $breadcrumb [] = ['url'=> $this->urlGenerator->generate('page', ['slug'=> $categorieParent->translate($locale)->getSlugUrl()], UrlGeneratorInterface::ABSOLUTE_URL),
// 'name'=> $categorieParent->translate($locale)->getTitreCategorie(),'active'=> true];
// }
// }
// $breadcrumb [] = ['url'=> $this->urlGenerator->generate('page', ['slug'=> $categorieDefault->translate($locale)->getSlugUrl()], UrlGeneratorInterface::ABSOLUTE_URL),
// 'name'=> $categorieDefault->translate($locale)->getTitreCategorie(),'active'=> true];
// }
// }
// }
if ($page->getDefaultCategorie()) {
$categorieDefault = $this->em->getRepository(Category::class)->find($page->getDefaultCategorie());
if ($categorieDefault) {
if($categorieDefault->getParent() != 0){
$categorieParent = $this->em->getRepository(Category::class)->find($categorieDefault->getParent());
if($categorieParent){
$breadcrumb [] = ['url'=> $this->urlGenerator->generate('page', [
'slug'=> $categorieParent->translate($locale)->getSlugUrl()], UrlGeneratorInterface::ABSOLUTE_URL),
'name'=> $categorieParent->translate($locale)->getTitreCategorie(),'active'=> true];
$breadcrumb [] = ['url'=> $this->urlGenerator->generate('page', [
'slug'=> $categorieParent->translate($locale)->getSlugUrl().'/'. $categorieDefault->translate($locale)->getSlugUrl()], UrlGeneratorInterface::ABSOLUTE_URL),
'name'=> $categorieDefault->translate($locale)->getTitreCategorie(),'active'=> true];
}
}else{
$breadcrumb [] = ['url'=> $this->urlGenerator->generate('page', ['slug'=> $categorieDefault->translate($locale)->getSlugUrl()], UrlGeneratorInterface::ABSOLUTE_URL),
'name'=> $categorieDefault->translate($locale)->getTitreCategorie(),'active'=> true];
}
}
}
$breadcrumb [] = ['url'=> $this->urlGenerator->generate('page', ['slug'=> $slug], UrlGeneratorInterface::ABSOLUTE_URL),
'name'=> $page->translate($locale)->getTitle(),'active'=> false];
$schemaOrg = $this->metaService->schemaOrgBreadcrumb($breadcrumb);
// schemaOrg page article
if($page->getTypePost()->getSystemName() == 'actualites'){
$schemaOrg = $this->metaService->schemaOrgArticle($schemaOrg,$page);
$time_update = $page->getUpdatedAt() != null ?$page->getUpdatedAt()->format('Y-m-d h:i:s'):$page->getCreatedAt()->format('Y-m-d h:i:s');
$codeHead = $this->codeService->getCodeHead().' <meta property="article:modified_time" content="'.$time_update.'" />';
$this->codeService->setCodeHead($codeHead);
}
$renderService = $this->renderBloc->RenderBloc($page,$schemaOrg);
$blocs = $renderService['bloc'];
$schemaOrg = $renderService['schemaOrg'];
$this->codeService->setSchemaOrg($schemaOrg);
$titre_page = $page->translate($locale)->getTitle();
$image_bandeau = $page->getImageBandeau() ?? null;
$image_bandeau_alt = $page->getImageBandeauAlt() ?$page->getImageBandeauAlt() :$titre_page;
$galleries = $this->em->getRepository(MediaCms::class)->findFileByModule($page->getTypePost()->translate($locale)->getSystemName(),$page->getId(),'media');
$galleries_images = $this->imageGalleryService->getGalleryImages($galleries);
$modele_galerie_choisie = $page->getModeleGallerie() ? $page->getModeleGallerie()->getId() : 6;
$modele_gallerie = $this->em->getRepository(ModelGallerie::class)->findById($modele_galerie_choisie);
$twig_galerie = $modele_gallerie[0]->getTwig();
$post_aleatoire = null;
if ($page->getTypePost()->getSystemName() == 'actualites') {
$post_aleatoire = $this->em->getRepository(Post::class)->findPostAleatoire($page->getTypePost()->getId(),3,$page->getId());
}
$post_associer = [];
if($page->getPostsAssocies() != null){
$ids_post_associer = explode(',',$page->getPostsAssocies());
foreach ($ids_post_associer as $key => $id) {
$postExiste = $this->em->getRepository(Post::class)->find($id);
if($postExiste){
$post_associer[] = $postExiste;
}
}
}
if($slug == 'nos-videos'){
$nb_page = $request->query->get('page') ?? 1;
$videos = $this->em->getRepository(Video::class)->findAllVideo($nb_page);
return [
'template' => 'theme/'.$this->theme.'/page_nos_videos.html.twig',
'data' => [
'id_page'=> 'page-'.$page->getId(),
'breadcrumb'=> $breadcrumb,
'titre_page'=> $titre_page,
'image_bandeau'=> $image_bandeau,
'image_bandeau_alt'=> $image_bandeau_alt,
'galleries'=> $galleries_images,
'twig_galerie'=> $twig_galerie,
'page' => $page,
'blocs'=> $blocs,
'post_aleatoire'=> $post_aleatoire,
'post_associer'=> $post_associer,
'videos'=> $videos,
]
];
}else{
return [
'template' => 'theme/'.$this->theme.'/page_cms.html.twig',
'data' => [
'id_page'=> 'page-'.$page->getId(),
'breadcrumb'=> $breadcrumb,
'titre_page'=> $titre_page,
'image_bandeau'=> $image_bandeau,
'image_bandeau_alt'=> $image_bandeau_alt,
'galleries'=> $galleries_images,
'twig_galerie'=> $twig_galerie,
'page' => $page,
'blocs'=> $blocs,
'post_aleatoire'=> $post_aleatoire,
'post_associer'=> $post_associer
]
];
}
}
}