vendor/dachcom-digital/seo/src/SeoBundle/Manager/ElementMetaDataManager.php line 223

Open in your IDE?
  1. <?php
  2. namespace SeoBundle\Manager;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Pimcore\Model\DataObject;
  5. use Pimcore\Model\Document;
  6. use Pimcore\Model\Document\Page;
  7. use SeoBundle\Model\ElementMetaData;
  8. use SeoBundle\Model\ElementMetaDataInterface;
  9. use SeoBundle\Registry\MetaDataIntegratorRegistryInterface;
  10. use SeoBundle\Repository\ElementMetaDataRepositoryInterface;
  11. class ElementMetaDataManager implements ElementMetaDataManagerInterface
  12. {
  13.     protected array $integratorConfiguration;
  14.     protected EntityManagerInterface $entityManager;
  15.     protected MetaDataIntegratorRegistryInterface $metaDataIntegratorRegistry;
  16.     protected ElementMetaDataRepositoryInterface $elementMetaDataRepository;
  17.     public function __construct(
  18.         array $integratorConfiguration,
  19.         EntityManagerInterface $entityManager,
  20.         MetaDataIntegratorRegistryInterface $metaDataIntegratorRegistry,
  21.         ElementMetaDataRepositoryInterface $elementMetaDataRepository
  22.     ) {
  23.         $this->integratorConfiguration $integratorConfiguration;
  24.         $this->entityManager $entityManager;
  25.         $this->metaDataIntegratorRegistry $metaDataIntegratorRegistry;
  26.         $this->elementMetaDataRepository $elementMetaDataRepository;
  27.     }
  28.     public function getMetaDataIntegratorConfiguration(): array
  29.     {
  30.         return $this->integratorConfiguration;
  31.     }
  32.     public function getMetaDataIntegratorBackendConfiguration(mixed $correspondingElement): array
  33.     {
  34.         $configuration = [];
  35.         foreach ($this->integratorConfiguration['enabled_integrator'] as $enabledIntegrator) {
  36.             $enabledIntegratorName $enabledIntegrator['integrator_name'];
  37.             $metaDataIntegrator $this->metaDataIntegratorRegistry->has($enabledIntegratorName) ? $this->metaDataIntegratorRegistry->get($enabledIntegratorName) : null;
  38.             $config $metaDataIntegrator === null ? [] : $metaDataIntegrator->getBackendConfiguration($correspondingElement);
  39.             $configuration[$enabledIntegratorName] = $config;
  40.         }
  41.         return $configuration;
  42.     }
  43.     public function getElementData(string $elementTypeint $elementId): array
  44.     {
  45.         $elementValues $this->elementMetaDataRepository->findAll($elementType$elementId);
  46.         // BC Reason: If old document metadata is available, use it!
  47.         // @todo: make this decision configurable? We don't need this within fresh installations!
  48.         return $this->checkForLegacyData($elementValues$elementType$elementId);
  49.     }
  50.     public function getElementDataForBackend(string $elementTypeint $elementId): array
  51.     {
  52.         $parsedData = [];
  53.         $data $this->getElementData($elementType$elementId);
  54.         foreach ($data as $element) {
  55.             $metaDataIntegrator $this->metaDataIntegratorRegistry->get($element->getIntegrator());
  56.             $parsedData[$element->getIntegrator()] = $metaDataIntegrator->validateBeforeBackend($elementType$elementId$element->getData());
  57.         }
  58.         // BC Reason: If old document metadata is available, use it!
  59.         // @todo: make this decision configurable? We don't need this within fresh installations!
  60.         return $this->checkForLegacyBackendData($parsedData$elementType$elementId);
  61.     }
  62.     public function saveElementData(string $elementTypeint $elementIdstring $integratorName, array $data): void
  63.     {
  64.         $elementMetaData $this->elementMetaDataRepository->findByIntegrator($elementType$elementId$integratorName);
  65.         if (!$elementMetaData instanceof ElementMetaDataInterface) {
  66.             $elementMetaData = new ElementMetaData();
  67.             $elementMetaData->setElementType($elementType);
  68.             $elementMetaData->setElementId($elementId);
  69.             $elementMetaData->setIntegrator($integratorName);
  70.         }
  71.         $metaDataIntegrator $this->metaDataIntegratorRegistry->get($integratorName);
  72.         $sanitizedData $metaDataIntegrator->validateBeforePersist($elementType$elementId$data$elementMetaData->getData());
  73.         // remove empty meta data
  74.         if ($sanitizedData === null) {
  75.             if ($elementMetaData->getId() > 0) {
  76.                 $this->entityManager->remove($elementMetaData);
  77.                 $this->entityManager->flush();
  78.             }
  79.             return;
  80.         }
  81.         $elementMetaData->setData($sanitizedData);
  82.         $this->entityManager->persist($elementMetaData);
  83.         $this->entityManager->flush();
  84.     }
  85.     public function generatePreviewDataForElement(string $elementTypeint $elementIdstring $integratorName, ?string $template, array $data): array
  86.     {
  87.         if ($elementType === 'object') {
  88.             $element DataObject::getById($elementId);
  89.         } else {
  90.             $element Document::getById($elementId);
  91.         }
  92.         $metaDataIntegrator $this->metaDataIntegratorRegistry->get($integratorName);
  93.         return $metaDataIntegrator->getPreviewParameter($element$template$data);
  94.     }
  95.     public function deleteElementData(string $elementTypeint $elementId): void
  96.     {
  97.         $elementData $this->elementMetaDataRepository->findAll($elementType$elementId);
  98.         if (count($elementData) === 0) {
  99.             return;
  100.         }
  101.         foreach ($elementData as $element) {
  102.             $this->entityManager->remove($element);
  103.         }
  104.         $this->entityManager->flush();
  105.     }
  106.     /**
  107.      * @return array<int, ElementMetaDataInterface>
  108.      */
  109.     protected function checkForLegacyData(array $elementsstring $elementTypeint $elementId): array
  110.     {
  111.         // as soon we have configured seo elements,
  112.         // we'll never check the document again. It's all about performance.
  113.         if (count($elements) > 0) {
  114.             return $elements;
  115.         }
  116.         if ($elementType !== 'document') {
  117.             return $elements;
  118.         }
  119.         $legacyData $this->getDocumentLegacyData($elementId);
  120.         if ($legacyData === null) {
  121.             return $elements;
  122.         }
  123.         if ($legacyData['hasTitleDescriptionIntegrator'] === true) {
  124.             $legacyTitleDescription = new ElementMetaData();
  125.             $legacyTitleDescription->setElementType($elementType);
  126.             $legacyTitleDescription->setElementId($elementId);
  127.             $legacyTitleDescription->setIntegrator('title_description');
  128.             $legacyTitleDescription->setData(['title' => $legacyData['title'], 'description' => $legacyData['description']]);
  129.             $elements[] = $legacyTitleDescription;
  130.         }
  131.         if ($legacyData['hasHtmlTagIntegrator'] === true && is_array($legacyData['metaData']) && count($legacyData['metaData']) > 0) {
  132.             $legacyMetaData = new ElementMetaData();
  133.             $legacyMetaData->setElementType($elementType);
  134.             $legacyMetaData->setElementId($elementId);
  135.             $legacyMetaData->setIntegrator('html_tag');
  136.             $legacyMetaData->setData($legacyData['metaData']);
  137.             $elements[] = $legacyMetaData;
  138.         }
  139.         return $elements;
  140.     }
  141.     protected function checkForLegacyBackendData(array $parsedDatastring $elementTypeint $elementId): array
  142.     {
  143.         // as soon we have configured seo elements,
  144.         // we'll never check the document again. It's all about performance.
  145.         if (count($parsedData) !== 0) {
  146.             return $parsedData;
  147.         }
  148.         if ($elementType !== 'document') {
  149.             return $parsedData;
  150.         }
  151.         $legacyData $this->getDocumentLegacyData($elementId);
  152.         if ($legacyData === null) {
  153.             return $parsedData;
  154.         }
  155.         if ($legacyData['hasTitleDescriptionIntegrator'] === true) {
  156.             $legacyTitleDescription = [];
  157.             if (!empty($legacyData['title'])) {
  158.                 $legacyTitleDescription['title'] = $legacyData['title'];
  159.             }
  160.             if (!empty($legacyData['description'])) {
  161.                 $legacyTitleDescription['description'] = $legacyData['description'];
  162.             }
  163.             if (count($legacyTitleDescription) > 0) {
  164.                 $parsedData['title_description'] = $legacyTitleDescription;
  165.             }
  166.         }
  167.         if ($legacyData['hasHtmlTagIntegrator'] === true) {
  168.             $legacyHtmlTags = [];
  169.             if (is_array($legacyData['metaData'])) {
  170.                 foreach ($legacyData['metaData'] as $metaDataRow) {
  171.                     $legacyHtmlTags[] = $metaDataRow;
  172.                 }
  173.             }
  174.             if (count($legacyHtmlTags) > 0) {
  175.                 $parsedData['html_tag'] = $legacyHtmlTags;
  176.             }
  177.         }
  178.         return $parsedData;
  179.     }
  180.     protected function getDocumentLegacyData(int $documentId): ?array
  181.     {
  182.         $enabledIntegrator $this->integratorConfiguration['enabled_integrator'];
  183.         if (!is_array($enabledIntegrator) || count($enabledIntegrator) === 0) {
  184.             return null;
  185.         }
  186.         $hasTitleDescriptionIntegrator array_search('title_description'array_column($enabledIntegrator'integrator_name'), true);
  187.         $hasHtmlTagIntegrator array_search('html_tag'array_column($enabledIntegrator'integrator_name'), true);
  188.         // no required integrators are active. skip this task...
  189.         if ($hasTitleDescriptionIntegrator === false && $hasHtmlTagIntegrator === false) {
  190.             return null;
  191.         }
  192.         $document Document::getById($documentId);
  193.         if (!$document instanceof Page) {
  194.             return null;
  195.         }
  196.         return [
  197.             'description'                   => $document->getDescription(),
  198.             'title'                         => $document->getTitle(),
  199.             'metaData'                      => $document->getMetaData(),
  200.             'hasTitleDescriptionIntegrator' => $hasTitleDescriptionIntegrator !== false,
  201.             'hasHtmlTagIntegrator'          => $hasHtmlTagIntegrator !== false,
  202.         ];
  203.     }
  204. }