vendor/dachcom-digital/seo/src/SeoBundle/MetaData/MetaDataProvider.php line 33

Open in your IDE?
  1. <?php
  2. namespace SeoBundle\MetaData;
  3. use Pimcore\Twig\Extension\Templating\HeadMeta;
  4. use Pimcore\Twig\Extension\Templating\HeadTitle;
  5. use SeoBundle\MetaData\Extractor\ExtractorInterface;
  6. use SeoBundle\Middleware\MiddlewareDispatcherInterface;
  7. use SeoBundle\Registry\MetaDataExtractorRegistryInterface;
  8. use SeoBundle\Model\SeoMetaData;
  9. class MetaDataProvider implements MetaDataProviderInterface
  10. {
  11.     protected HeadMeta $headMeta;
  12.     protected HeadTitle $headTitle;
  13.     protected MetaDataExtractorRegistryInterface $extractorRegistry;
  14.     protected MiddlewareDispatcherInterface $middlewareDispatcher;
  15.     public function __construct(
  16.         HeadMeta $headMeta,
  17.         HeadTitle $headTitle,
  18.         MetaDataExtractorRegistryInterface $extractorRegistry,
  19.         MiddlewareDispatcherInterface $middlewareDispatcher
  20.     ) {
  21.         $this->headMeta $headMeta;
  22.         $this->headTitle $headTitle;
  23.         $this->extractorRegistry $extractorRegistry;
  24.         $this->middlewareDispatcher $middlewareDispatcher;
  25.     }
  26.     public function updateSeoElement($element, ?string $locale): void
  27.     {
  28.         $seoMetadata $this->getSeoMetaData($element$locale);
  29.         if ($extraProperties $seoMetadata->getExtraProperties()) {
  30.             foreach ($extraProperties as $key => $value) {
  31.                 $this->headMeta->appendProperty($key$value);
  32.             }
  33.         }
  34.         if ($extraNames $seoMetadata->getExtraNames()) {
  35.             foreach ($extraNames as $key => $value) {
  36.                 $this->headMeta->appendName($key$value);
  37.             }
  38.         }
  39.         if ($extraHttp $seoMetadata->getExtraHttp()) {
  40.             foreach ($extraHttp as $key => $value) {
  41.                 $this->headMeta->appendHttpEquiv($key$value);
  42.             }
  43.         }
  44.         if ($schemaBlocks $seoMetadata->getSchema()) {
  45.             foreach ($schemaBlocks as $schemaBlock) {
  46.                 if (is_array($schemaBlock)) {
  47.                     $schemaTag sprintf('<script type="application/ld+json">%s</script>'json_encode($schemaBlockJSON_UNESCAPED_UNICODE));
  48.                     $this->headMeta->addRaw($schemaTag);
  49.                 }
  50.             }
  51.         }
  52.         if ($raw $seoMetadata->getRaw()) {
  53.             foreach ($raw as $rawValue) {
  54.                 $this->headMeta->addRaw($rawValue);
  55.             }
  56.         }
  57.         if ($seoMetadata->getTitle()) {
  58.             $this->headTitle->set($seoMetadata->getTitle());
  59.         }
  60.         if ($seoMetadata->getMetaDescription()) {
  61.             $this->headMeta->setDescription($seoMetadata->getMetaDescription());
  62.         }
  63.     }
  64.     protected function getSeoMetaData(mixed $element, ?string $locale): SeoMetaData
  65.     {
  66.         $seoMetaData = new SeoMetaData($this->middlewareDispatcher);
  67.         $extractors $this->getExtractorsForElement($element);
  68.         foreach ($extractors as $extractor) {
  69.             $extractor->updateMetadata($element$locale$seoMetaData);
  70.             $this->middlewareDispatcher->dispatchTasks($seoMetaData);
  71.         }
  72.         $this->middlewareDispatcher->dispatchMiddlewareFinisher($seoMetaData);
  73.         return $seoMetaData;
  74.     }
  75.     /**
  76.      * @return array<int, ExtractorInterface>
  77.      */
  78.     protected function getExtractorsForElement($element): array
  79.     {
  80.         return array_filter($this->extractorRegistry->getAll(), static function (ExtractorInterface $extractor) use ($element) {
  81.             return $extractor->supports($element);
  82.         });
  83.     }
  84. }