vendor/presta/sitemap-bundle/Service/AbstractGenerator.php line 86

Open in your IDE?
  1. <?php
  2. /**
  3.  * This file is part of the PrestaSitemapBundle package.
  4.  *
  5.  * (c) PrestaConcept <www.prestaconcept.net>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Presta\SitemapBundle\Service;
  11. use Presta\SitemapBundle\Event\SitemapPopulateEvent;
  12. use Presta\SitemapBundle\Sitemap\Sitemapindex;
  13. use Presta\SitemapBundle\Sitemap\Url\Url;
  14. use Presta\SitemapBundle\Sitemap\Url\UrlConcrete;
  15. use Presta\SitemapBundle\Sitemap\Url\UrlDecorator;
  16. use Presta\SitemapBundle\Sitemap\Urlset;
  17. use Symfony\Component\EventDispatcher\EventDispatcherInterface;
  18. use Symfony\Contracts\EventDispatcher\EventDispatcherInterface as ContractsEventDispatcherInterface;
  19. /**
  20.  * Abstract sitemap generator class
  21.  *
  22.  * @author Konstantin Myakshin <koc-dp@yandex.ru>
  23.  */
  24. abstract class AbstractGenerator implements UrlContainerInterface
  25. {
  26.     /**
  27.      * @var EventDispatcherInterface
  28.      */
  29.     protected $dispatcher;
  30.     /**
  31.      * @var Sitemapindex
  32.      */
  33.     protected $root;
  34.     /**
  35.      * @var Urlset[]
  36.      */
  37.     protected $urlsets = [];
  38.     /**
  39.      * The maximum number of item generated in a sitemap
  40.      * @var int
  41.      */
  42.     protected $itemsBySet;
  43.     /**
  44.      * @var array
  45.      */
  46.     private $defaults;
  47.     /**
  48.      * @param EventDispatcherInterface $dispatcher
  49.      * @param int|null                 $itemsBySet
  50.      */
  51.     public function __construct(EventDispatcherInterface $dispatcher$itemsBySet null)
  52.     {
  53.         $this->dispatcher $dispatcher;
  54.         // We add one to LIMIT_ITEMS because it was used as an index, not a quantity
  55.         $this->itemsBySet = ($itemsBySet === null) ? Sitemapindex::LIMIT_ITEMS $itemsBySet;
  56.         $this->defaults = [
  57.             'priority' => 1,
  58.             'changefreq' => UrlConcrete::CHANGEFREQ_DAILY,
  59.             'lastmod' => 'now',
  60.         ];
  61.     }
  62.     /**
  63.      * @param array $defaults
  64.      */
  65.     public function setDefaults(array $defaults)
  66.     {
  67.         $this->defaults $defaults;
  68.     }
  69.     /**
  70.      * @inheritdoc
  71.      */
  72.     public function addUrl(Url $url$section)
  73.     {
  74.         $urlset $this->getUrlset($section);
  75.         // Compare the number of items in the urlset against the maximum
  76.         // allowed and check the maximum of 50k sitemap in sitemapindex
  77.         $i 0;
  78.         while ((count($urlset) >= $this->itemsBySet || $urlset->isFull()) && $i <= Sitemapindex::LIMIT_ITEMS) {
  79.             $urlset $this->getUrlset($section '_' $i);
  80.             $i++;
  81.         }
  82.         if (count($urlset) >= $this->itemsBySet || $urlset->isFull()) {
  83.             throw new \RuntimeException('The limit of sitemapindex has been exceeded');
  84.         }
  85.         $concreteUrl $this->getUrlConcrete($url);
  86.         if ($concreteUrl instanceof UrlConcrete) {
  87.             if (null === $concreteUrl->getLastmod() && null !== $this->defaults['lastmod']) {
  88.                 $concreteUrl->setLastmod(new \DateTimeImmutable($this->defaults['lastmod']));
  89.             }
  90.             if (null === $concreteUrl->getChangefreq()) {
  91.                 $concreteUrl->setChangefreq($this->defaults['changefreq']);
  92.             }
  93.             if (null === $concreteUrl->getPriority()) {
  94.                 $concreteUrl->setPriority($this->defaults['priority']);
  95.             }
  96.         }
  97.         $urlset->addUrl($url);
  98.     }
  99.     /**
  100.      * get or create urlset
  101.      *
  102.      * @param string $name
  103.      *
  104.      * @return Urlset
  105.      */
  106.     public function getUrlset($name)
  107.     {
  108.         if (!isset($this->urlsets[$name])) {
  109.             $this->urlsets[$name] = $this->newUrlset($name);
  110.         }
  111.         return $this->urlsets[$name];
  112.     }
  113.     /**
  114.      * Factory method for create Urlsets
  115.      *
  116.      * @param string                  $name
  117.      * @param \DateTimeInterface|null $lastmod
  118.      *
  119.      * @return Urlset
  120.      */
  121.     abstract protected function newUrlset($name\DateTimeInterface $lastmod null);
  122.     /**
  123.      * Dispatches SitemapPopulate Event - the listeners should use it to add their URLs to the sitemap
  124.      *
  125.      * @param string|null $section
  126.      */
  127.     protected function populate($section null)
  128.     {
  129.         $event = new SitemapPopulateEvent($this$section);
  130.         if ($this->dispatcher instanceof ContractsEventDispatcherInterface) {
  131.             $this->dispatcher->dispatch($eventSitemapPopulateEvent::ON_SITEMAP_POPULATE);
  132.         } else {
  133.             $this->dispatcher->dispatch(SitemapPopulateEvent::ON_SITEMAP_POPULATE$event);
  134.         }
  135.     }
  136.     /**
  137.      * @return Sitemapindex
  138.      */
  139.     protected function getRoot()
  140.     {
  141.         if (null === $this->root) {
  142.             $this->root = new Sitemapindex();
  143.             foreach ($this->urlsets as $urlset) {
  144.                 $this->root->addSitemap($urlset);
  145.             }
  146.         }
  147.         return $this->root;
  148.     }
  149.     /**
  150.      * @param Url $url
  151.      *
  152.      * @return Url|null
  153.      */
  154.     private function getUrlConcrete(Url $url)
  155.     {
  156.         if ($url instanceof UrlConcrete) {
  157.             return $url;
  158.         }
  159.         if ($url instanceof UrlDecorator) {
  160.             return $this->getUrlConcrete($url->getUrlDecorated());
  161.         }
  162.         return null;
  163.     }
  164. }