vendor/pimcore/pimcore/lib/Sitemap/Document/DocumentTreeGenerator.php line 78

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. /**
  4.  * Pimcore
  5.  *
  6.  * This source file is available under two different licenses:
  7.  * - GNU General Public License version 3 (GPLv3)
  8.  * - Pimcore Commercial License (PCL)
  9.  * Full copyright and license information is available in
  10.  * LICENSE.md which is distributed with this source code.
  11.  *
  12.  *  @copyright  Copyright (c) Pimcore GmbH (http://www.pimcore.org)
  13.  *  @license    http://www.pimcore.org/license     GPLv3 and PCL
  14.  */
  15. namespace Pimcore\Sitemap\Document;
  16. use Pimcore\Model\Document;
  17. use Pimcore\Model\Site;
  18. use Pimcore\Sitemap\Element\AbstractElementGenerator;
  19. use Presta\SitemapBundle\Service\UrlContainerInterface;
  20. use Presta\SitemapBundle\Sitemap\Url\Url;
  21. use Presta\SitemapBundle\Sitemap\Url\UrlConcrete;
  22. use Symfony\Component\OptionsResolver\OptionsResolver;
  23. class DocumentTreeGenerator extends AbstractElementGenerator
  24. {
  25.     /**
  26.      * @var DocumentUrlGeneratorInterface
  27.      */
  28.     private $urlGenerator;
  29.     /**
  30.      * @var array
  31.      */
  32.     protected $options = [];
  33.     /**
  34.      * @var int
  35.      */
  36.     private $currentBatchCount 0;
  37.     public function __construct(
  38.         DocumentUrlGeneratorInterface $urlGenerator,
  39.         array $filters = [],
  40.         array $processors = [],
  41.         array $options = []
  42.     ) {
  43.         parent::__construct($filters$processors);
  44.         $this->urlGenerator $urlGenerator;
  45.         $optionsResolver = new OptionsResolver();
  46.         $this->configureOptions($optionsResolver);
  47.         $this->options $optionsResolver->resolve($options);
  48.     }
  49.     protected function configureOptions(OptionsResolver $options)
  50.     {
  51.         $options->setDefaults([
  52.             'rootId' => 1,
  53.             'handleMainDomain' => true,
  54.             'handleSites' => true,
  55.             'urlGeneratorOptions' => [],
  56.             'garbageCollectThreshold' => 50,
  57.         ]);
  58.         $options->setAllowedTypes('rootId''int');
  59.         $options->setAllowedTypes('handleMainDomain''bool');
  60.         $options->setAllowedTypes('handleSites''bool');
  61.         $options->setAllowedTypes('urlGeneratorOptions''array');
  62.         $options->setAllowedTypes('garbageCollectThreshold''int');
  63.     }
  64.     public function populate(UrlContainerInterface $urlContainerstring $section null)
  65.     {
  66.         if ($this->options['handleMainDomain'] && null === $section || $section === 'default') {
  67.             $rootDocument Document::getById($this->options['rootId']);
  68.             $this->populateCollection($urlContainer$rootDocument'default');
  69.         }
  70.         if ($this->options['handleSites']) {
  71.             $sites = (new Site\Listing())->load();
  72.             foreach ($sites as $site) {
  73.                 $siteSection sprintf('site_%s'$site->getId());
  74.                 if (null === $section || $section === $siteSection) {
  75.                     $this->populateCollection($urlContainer$site->getRootDocument(), $siteSection$site);
  76.                 }
  77.             }
  78.         }
  79.     }
  80.     private function populateCollection(UrlContainerInterface $urlContainerDocument $rootDocumentstring $sectionSite $site null)
  81.     {
  82.         $context = new DocumentGeneratorContext($urlContainer$section$site);
  83.         $visit $this->visit($rootDocument$context);
  84.         foreach ($visit as $document) {
  85.             $url $this->createUrl($document$context);
  86.             if (null === $url) {
  87.                 continue;
  88.             }
  89.             $urlContainer->addUrl($url$section);
  90.         }
  91.     }
  92.     /**
  93.      * @param Document $document
  94.      * @param DocumentGeneratorContext $context
  95.      *
  96.      * @return Url|null
  97.      */
  98.     private function createUrl(Document $documentDocumentGeneratorContext $context)
  99.     {
  100.         $url $this->urlGenerator->generateDocumentUrl(
  101.             $document,
  102.             $context->getSite(),
  103.             $this->options['urlGeneratorOptions']
  104.         );
  105.         $url = new UrlConcrete($url);
  106.         $url $this->process($url$document$context);
  107.         return $url;
  108.     }
  109.     /**
  110.      * @param Document $document
  111.      * @param DocumentGeneratorContext $context
  112.      *
  113.      * @return \Generator
  114.      *
  115.      * @throws \Exception
  116.      */
  117.     private function visit(Document $documentDocumentGeneratorContext $context): \Generator
  118.     {
  119.         if ($document instanceof Document\Hardlink) {
  120.             $document Document\Hardlink\Service::wrap($document);
  121.             if (empty($document)) {
  122.                 return;
  123.             }
  124.         }
  125.         if ($this->canBeAdded($document$context)) {
  126.             yield $document;
  127.             if (++$this->currentBatchCount >= $this->options['garbageCollectThreshold']) {
  128.                 $this->currentBatchCount 0;
  129.                 \Pimcore::collectGarbage();
  130.             }
  131.         }
  132.         if ($document->hasChildren() && $this->handlesChildren($document$context)) {
  133.             foreach ($document->getChildren() as $child) {
  134.                 yield from $this->visit($child$context);
  135.             }
  136.         }
  137.     }
  138. }