<?php
namespace App\EventListener;
use App\Entity\Blog;
//use App\Entity\Category;
use App\Entity\Career;
use App\Entity\News;
use App\Entity\Office;
use App\Entity\Product;
//use App\Entity\TextPage;
//use App\Service\RouteBuilderService;
use App\Entity\Promotion;
use App\SiteMap\SiteMapService;
use DateTime;
use Doctrine\Persistence\ManagerRegistry;
use Presta\SitemapBundle\Event\SitemapPopulateEvent;
use Presta\SitemapBundle\Service\UrlContainerInterface;
use Presta\SitemapBundle\Sitemap\Url\GoogleImage;
use Presta\SitemapBundle\Sitemap\Url\GoogleImageUrlDecorator;
use Presta\SitemapBundle\Sitemap\Url\UrlConcrete;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
class SitemapSubscriber implements EventSubscriberInterface
{
/**
* @var UrlGeneratorInterface
*/
private $urlGenerator;
/**
* @var ManagerRegistry
*/
private $doctrine;
private $locales;
private $productAndCategoryRouteBuilder;
private $baseURL;
private $uploadsDir;
private $defaultLocale;
private $siteMapService;
/**
* SitemapSubscriber constructor.
* @param UrlGeneratorInterface $urlGenerator
* @param ManagerRegistry $doctrine
* @param $defaultLocale
* @param $localesArr
* @param SiteMapService $siteMapService
* @param $uploadsDir
* @param $siteBaseUrl
*/
public function __construct(UrlGeneratorInterface $urlGenerator, ManagerRegistry $doctrine, $defaultLocale, $localesArr, SiteMapService $siteMapService, /*RouteBuilderService $productAndCategoryRouteBuilder,*/
$uploadsDir, $siteBaseUrl)
{
$this->urlGenerator = $urlGenerator;
$this->doctrine = $doctrine;
$this->locales = $localesArr;
$this->defaultLocale = $defaultLocale;
// $this->productAndCategoryRouteBuilder = $productAndCategoryRouteBuilder;
$this->baseURL = $siteBaseUrl;
$this->uploadsDir = $uploadsDir;
$this->siteMapService = $siteMapService;
}
/**
* @inheritdoc
*/
public static function getSubscribedEvents()
{
return [
SitemapPopulateEvent::ON_SITEMAP_POPULATE => 'populate',
];
}
/**
* @param SitemapPopulateEvent $event
*/
public function populate(SitemapPopulateEvent $event): void
{
$this->registerSiteUrls($event->getUrlContainer());
$this->registerBlogPostsUrls($event->getUrlContainer());
$this->registerNewsUrls($event->getUrlContainer());
$this->registerOfficesUrls($event->getUrlContainer());
$this->registerProductsUrls($event->getUrlContainer());
$this->registerCareersUrls($event->getUrlContainer());
$this->registerPromotionsUrls($event->getUrlContainer());
// $this->registerBlogPostCategoriesUrls($event->getUrlContainer());
// $this->registerTextPagesUrls($event->getUrlContainer());
// $this->registerProductsUrls($event->getUrlContainer());
// $this->registerProductCategoriesUrls($event->getUrlContainer());
}
/**
* @param UrlContainerInterface $urls
* @throws \Psr\Cache\InvalidArgumentException
* @throws \ReflectionException
*/
public function registerSiteUrls(UrlContainerInterface $urls): void
{
$collection = $this->siteMapService->routesForSiteMap(true)->itemsForLocale();
// foreach ($this->locales as $locale) {
foreach ($collection as $siteUrl) {
$priority = 1;
// $lastMod = $post->getUpdatedAt() ?? $post->getCreatedAt();
$changeFreq = UrlConcrete::CHANGEFREQ_WEEKLY;
$url = (new UrlConcrete(
$this->baseURL . $siteUrl->path
))->setChangefreq($changeFreq)
->setPriority($priority)// ->setLastmod($lastMod)
;
$urls->addUrl(
$url,
'site'
);
}
// }
}
/**
* @param UrlContainerInterface $urls
*/
public function registerBlogPostsUrls(UrlContainerInterface $urls): void
{
$postsCount = $this->doctrine->getRepository(Blog::class)->getBlogPostsCount();
$limit = 100;
$counter = 0;
while ($counter < $postsCount) {
$posts = $this->doctrine->getRepository(Blog::class)->getBlogPostsByLimit($counter, $limit);
foreach ($this->locales as $locale) {
foreach ($posts as $post) {
$post->setTranslatableLocale($locale);
$this->doctrine->getManager()->refresh($post);
$priority = 1;
$lastMod = $post->getUpdatedAt() ?? $post->getCreatedAt();
$changeFreq = UrlConcrete::CHANGEFREQ_WEEKLY;
// $category = $post->getCategory();
// $category->setTranslatableLocale($locale);
// $this->doctrine->getManager()->refresh($category);
$url = (new UrlConcrete(
$this->urlGenerator->generate(
'blog.show',
[
// '_locale' => $locale,
'slug' => $post->getSlug(),
// 'route' => $post->getRoute(),
],
UrlGeneratorInterface::ABSOLUTE_URL
)
))->setChangefreq($changeFreq)
->setPriority($priority)
->setLastmod($lastMod);
//Add images
// $gallery = $post->getImage();
// $gallery->setTranslatableLocale($locale);
// $this->doctrine->getManager()->refresh($gallery);
$url = new GoogleImageUrlDecorator($url);
$imagePath = $post->getImage();
// $imageRelativeURL = $image;
if ($imagePath) $url->addImage(new GoogleImage($imagePath));
// if ($gallery !== null) {
// $mediaItems = $gallery->getMediaItems();
// $url = new GoogleImageUrlDecorator($url);
//
// foreach ($mediaItems as $mediaItem) {
// if ($mediaItem->isImage()) {
// $image = $mediaItem->getImage();
// $imageRelativeURL = $this->uploadsDir . '/' . $image->getFileName();
// $url->addImage(new GoogleImage($this->baseURL . '/' . $imageRelativeURL));
// }
// }
// }
$urls->addUrl(
$url,
'blog-posts'
);
}
}
$counter += $limit;
}
}
/**
* @param UrlContainerInterface $urls
*/
public function registerNewsUrls(UrlContainerInterface $urls): void
{
$posts = $this->doctrine->getRepository(News::class)->findAll();
foreach ($this->locales as $locale) {
foreach ($posts as $post) {
$post->setTranslatableLocale($locale);
$priority = 1;
$lastMod = $post->getUpdatedAt() ?? $post->getCreatedAt();
$changeFreq = UrlConcrete::CHANGEFREQ_WEEKLY;
$url = (new UrlConcrete(
$this->urlGenerator->generate(
'news.show',
[
'slug' => $post->getSlug(),
],
UrlGeneratorInterface::ABSOLUTE_URL
)
))->setChangefreq($changeFreq)
->setPriority($priority)
->setLastmod($lastMod);
$url = new GoogleImageUrlDecorator($url);
$imagePath = $post->getImage();
if ($imagePath) $url->addImage(new GoogleImage($imagePath));
$urls->addUrl(
$url,
'news'
);
}
}
}
/**
* @param UrlContainerInterface $urls
*/
public function registerOfficesUrls(UrlContainerInterface $urls): void
{
$posts = $this->doctrine->getRepository(Office::class)->findBy(['isActive' => 1]);
foreach ($this->locales as $locale) {
foreach ($posts as $post) {
// $post->setTranslatableLocale($locale);
$priority = 1;
$lastMod = $post->getUpdatedAt() ?? $post->getCreatedAt();
$changeFreq = UrlConcrete::CHANGEFREQ_WEEKLY;
$url = (new UrlConcrete(
$this->urlGenerator->generate(
'office.view',
[
'slug' => $post->getSlug(),
],
UrlGeneratorInterface::ABSOLUTE_URL
)
))->setChangefreq($changeFreq)
->setPriority($priority)
->setLastmod($lastMod);
$url = new GoogleImageUrlDecorator($url);
$imagePath = $post->getImage();
if ($imagePath) $url->addImage(new GoogleImage($imagePath));
$urls->addUrl(
$url,
'offices'
);
}
}
}
/**
* @param UrlContainerInterface $urls
*/
public function registerProductsUrls(UrlContainerInterface $urls): void
{
$posts = $this->doctrine->getRepository(Product::class)->findBy(['active' => 1]);
foreach ($this->locales as $locale) {
foreach ($posts as $post) {
// $post->setTranslatableLocale($locale);
$priority = 1;
$lastMod = $post->getUpdatedAt() ?? $post->getCreatedAt();
$changeFreq = UrlConcrete::CHANGEFREQ_WEEKLY;
$url = (new UrlConcrete(
$this->urlGenerator->generate(
'products.details',
[
'slug' => $post->getSlug(),
],
UrlGeneratorInterface::ABSOLUTE_URL
)
))->setChangefreq($changeFreq)
->setPriority($priority)
->setLastmod($lastMod);
$url = new GoogleImageUrlDecorator($url);
$imagePath = $post->getImage();
if ($imagePath) $url->addImage(new GoogleImage($imagePath));
$urls->addUrl(
$url,
'products'
);
}
}
}
/**
* @param UrlContainerInterface $urls
*/
public function registerCareersUrls(UrlContainerInterface $urls): void
{
$posts = $this->doctrine->getRepository(Career::class)->findAll();
foreach ($this->locales as $locale) {
foreach ($posts as $post) {
// $post->setTranslatableLocale($locale);
$priority = 1;
$lastMod = $post->getUpdatedAt() ?? $post->getCreatedAt();
$changeFreq = UrlConcrete::CHANGEFREQ_WEEKLY;
$url = (new UrlConcrete(
$this->urlGenerator->generate(
'career.view',
[
'slug' => $post->getSlug(),
],
UrlGeneratorInterface::ABSOLUTE_URL
)
))->setChangefreq($changeFreq)
->setPriority($priority)
->setLastmod($lastMod);
// $url = new GoogleImageUrlDecorator($url);
// $imagePath = $post->getImage();
// if ($imagePath) $url->addImage(new GoogleImage($imagePath));
$urls->addUrl(
$url,
'careers'
);
}
}
}
/**
* @param UrlContainerInterface $urls
*/
public function registerPromotionsUrls(UrlContainerInterface $urls): void
{
$posts = $this->doctrine->getRepository(Promotion::class)->findAll();
foreach ($this->locales as $locale) {
foreach ($posts as $post) {
// $post->setTranslatableLocale($locale);
$priority = 1;
$lastMod = $post->getUpdatedAt() ?? $post->getCreatedAt();
$changeFreq = UrlConcrete::CHANGEFREQ_WEEKLY;
$url = (new UrlConcrete(
$this->urlGenerator->generate(
'promotion.view',
[
'slug' => $post->getSlug(),
],
UrlGeneratorInterface::ABSOLUTE_URL
)
))->setChangefreq($changeFreq)
->setPriority($priority)
->setLastmod($lastMod);
$url = new GoogleImageUrlDecorator($url);
$imagePath = $post->getImage();
if ($imagePath) $url->addImage(new GoogleImage($imagePath));
$urls->addUrl(
$url,
'promotions'
);
}
}
}
}