<?php
namespace App\Service;
use App\Entity\Post;
use App\Entity\Category;
use Spatie\SchemaOrg\Graph;
use App\Entity\ParametreRef;
use Spatie\SchemaOrg\Schema;
use App\Entity\ParametreSite;
use Symfony\Component\Intl\Locale;
use App\Entity\ParametreLabelPhrase;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Leogout\Bundle\SeoBundle\Seo\Og\OgSeoGenerator;
use Leogout\Bundle\SeoBundle\Seo\Basic\BasicSeoGenerator;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class MetaService
{
private $em;
private $templating;
public $basicSeo;
public $seo;
public $requestStack;
private $urlGenerator;
public function __construct(EntityManagerInterface $em,
\Twig\Environment $templating,
BasicSeoGenerator $basicSeo,
OgSeoGenerator $seo,
UrlGeneratorInterface $urlGenerator,
RequestStack $requestStack)
{
$this->templating = $templating;
$this->em = $em;
$this->basicSeo = $basicSeo;
$this->seo = $seo;
$this->requestStack = $requestStack;
$this->urlGenerator = $urlGenerator;
}
public function metaTags($page){
$_locale = Locale::getDefault();
$url = null;
$request = $this->requestStack->getCurrentRequest();
if ($request) {
$url = $request->getUri();
}
$title = $page->translate($_locale)->getMetaTitle() ?? null;
$description = $page->translate($_locale)->getMetaDescription() ?? null;
$metacle = $page->translate($_locale)->getMetaKeys() ?? null;
if ($title != null || $description != null) {
$sanitizedTitle = strip_tags($title);
$sanitizedDescription = str_replace('"', '', $description);
$this->basicSeo
->setTitle($sanitizedTitle)
->setDescription($sanitizedDescription)
->setKeywords($metacle);
$this->seo
->setTitle($sanitizedTitle)
->setDescription($sanitizedDescription)
->setUrl($url);
}
}
public function schemaOrg($page){
$_locale = Locale::getDefault();
$url = null;
$request = $this->requestStack->getCurrentRequest();
if ($request) {
$url = $request->getUri();
}
$title = $page->translate($_locale)->getMetaTitle() ?? null;
$description = $page->translate($_locale)->getMetaDescription() ?? null;
$sanitizedTitle = strip_tags($title);
$sanitizedDescription = str_replace('"', '', $description);
$schemaOrg = new Graph();
$schemaOrg->add(Schema::WebSite()->name(strip_tags($sanitizedTitle))->url($url));
return $schemaOrg;
}
public function schemaOrgBreadcrumb($breadcrumb){
$_locale = Locale::getDefault();
$schema_breadcrumb_items = [];
$schemaOrg = new Graph();
if($breadcrumb){
foreach ($breadcrumb as $key => $value) {
$schema_breadcrumb_items[] = Schema::ListItem()->position($key + 1)
->item(["@id"=> $value['url'],"name"=> $value['name']]);
}
}
if ($schema_breadcrumb_items) {
$schemaOrg->add(Schema::BreadcrumBList()->itemListElement($schema_breadcrumb_items));
}
return $schemaOrg;
}
public function schemaOrgArticle($schemaOrg,$page){
$_locale = Locale::getDefault();
$parametre = $this->em->getRepository(ParametreSite::class)->findOneBy([],['id'=> 'ASC']);
$request = $this->requestStack->getCurrentRequest();
$baseurl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
$url = $request->getUri();
$schemaOrg->add(Schema::Article()->headline($page->translate($_locale)->getTitle())
->datePublished($page->getDatePublication()?$page->getDatePublication():$page->getCreatedAt())
->dateModified($page->getUpdatedAt())
->image($page->getImage()!= null?$baseurl.$page->getImage():'')
->publisher(Schema::Organization()
->name($parametre?$parametre->translate($_locale)->getTitre():'')
->logo($parametre?$baseurl.'/public/uploads/media-site/'.$parametre->getImage():''))
->mainEntityOfPage(Schema::WebPage()->url($url)));
return $schemaOrg;
}
public function canonicalUrl($page = null){
$_locale = Locale::getDefault();
$request = $this->requestStack->getCurrentRequest();
$url = $request->getUri();
if($page != null){
// if($page->getCanonical() != null){
// $url = $page->getCanonical();
// }elseif($page->getDefaultCategorie() != null){
// $categorieDefault = $this->em->getRepository(Category::class)->find($page->getDefaultCategorie());
// if($categorieDefault){
// $url = $this->urlGenerator->generate('page', ['slug'=> $categorieDefault->translate($_locale)->getSlugUrl().'/'.$page->translate($_locale)->getSlug()], UrlGeneratorInterface::ABSOLUTE_URL);
// }
// }else{
// $url = $this->urlGenerator->generate('page', ['slug'=> $page->translate($_locale)->getSlug()], UrlGeneratorInterface::ABSOLUTE_URL);
// }
$url = $this->urlGenerator->generate('page', ['slug'=> $page->translate($_locale)->getSlug()], UrlGeneratorInterface::ABSOLUTE_URL);
}
return '<link rel="canonical" href="'.$url.'" />';
}
public function canonicalCategorieUrl($categorie = null){
$_locale = Locale::getDefault();
$request = $this->requestStack->getCurrentRequest();
$url = $request->getUri();
if($categorie){
if($categorie->getParent() == 0 && $categorie->getSousParent() == 0){
$url = $this->urlGenerator->generate('page', ['slug'=> $categorie->translate($_locale)->getSlugUrl()], UrlGeneratorInterface::ABSOLUTE_URL);
}elseif($categorie->getParent() != 0){
$categorieParent = $this->em->getRepository(Category::class)->find($categorie->getParent());
$url = $this->urlGenerator->generate('page', ['slug'=> $categorieParent->translate($_locale)->getSlugUrl().'/'.$categorie->translate($_locale)->getSlugUrl()], UrlGeneratorInterface::ABSOLUTE_URL);
}
}
return '<link rel="canonical" href="'.$url.'" />';
}
}