<?php
namespace Hitso\Bundle\CatalogBundle\Service\Sitemap;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Hitso\Bundle\CatalogBundle\Entity\Product;
use Hitso\Bundle\ContentBundle\Manager\ContentManager;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Hitso\Bundle\SeoBundle\Provider\AbstractSitemapProvider;
use Hitso\Bundle\SeoBundle\Sitemap\SitemapSectionPage;
use Hitso\Bundle\SeoBundle\Sitemap\Url;
class ProductProvider extends AbstractSitemapProvider
{
/**
* @var ContentManager
*/
protected $manager;
/**
* ProductProvider constructor.
*
* @param UrlGeneratorInterface $urlGenerator
* @param ContentManager $manager
*/
public function __construct(UrlGeneratorInterface $urlGenerator, ContentManager $manager)
{
parent::__construct($urlGenerator);
$this->manager = $manager;
}
/**
* @param int $pageNumber
*
* @return SitemapSectionPage
*/
public function getPage($pageNumber)
{
$this->manager->setEntityClass(Product::class);
$products = $this->manager
->getRepository()
->getEnabledProductsQuery()
->setMaxResults($this->getMaxItemsPerPage())
->setFirstResult(($pageNumber - 1) * $this->getMaxItemsPerPage())
->getQuery()
->getResult();
$page = new SitemapSectionPage();
/** @var Product $product */
foreach ($products as $product) {
$url = $this->generateUrl('dynamic_' . $product->getRoute()->getId());
$page->addUrl(new Url($url, Url::CHANGEFREQ_WEEKLY, 0.6, $product->getUpdatedAt()));
}
return $page;
}
/**
* @return string
*/
public function getSectionName()
{
return 'products';
}
/**
* @return float|int
*/
public function getCount()
{
$this->manager->setEntityClass(Product::class);
/** @var EntityRepository $repository */
$repository = $this->manager->getRepository();
$queryBuilder = $repository->createQueryBuilder('e');
$query = $queryBuilder->getQuery();
$query->useQueryCache(true);
$query->useResultCache(true);
$paginator = new Paginator($query, true);
$paginator->setUseOutputWalkers(false);
return $paginator->count();
}
}