/
IntegratorExtractor.php
75 lines (61 loc) · 2.5 KB
/
IntegratorExtractor.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
namespace SeoBundle\MetaData\Extractor;
use Pimcore\Model\DataObject\Concrete;
use Pimcore\Model\Document;
use Pimcore\Model\Document\Page;
use SeoBundle\Manager\ElementMetaDataManagerInterface;
use SeoBundle\Model\SeoMetaDataInterface;
use SeoBundle\Registry\MetaDataIntegratorRegistryInterface;
class IntegratorExtractor implements ExtractorInterface
{
protected array $integratorConfiguration;
protected ElementMetaDataManagerInterface $elementMetaDataManager;
protected MetaDataIntegratorRegistryInterface $metaDataIntegratorRegistry;
public function __construct(
array $integratorConfiguration,
ElementMetaDataManagerInterface $elementMetaDataManager,
MetaDataIntegratorRegistryInterface $metaDataIntegratorRegistry
) {
$this->integratorConfiguration = $integratorConfiguration;
$this->elementMetaDataManager = $elementMetaDataManager;
$this->metaDataIntegratorRegistry = $metaDataIntegratorRegistry;
}
public function supports(mixed $element): bool
{
if ($element instanceof Concrete) {
if ($this->integratorConfiguration['objects']['enabled'] === false) {
return false;
}
return in_array($element->getClassName(), $this->integratorConfiguration['objects']['data_classes'], true);
}
if ($element instanceof Page) {
return $this->integratorConfiguration['documents']['enabled'] === true;
}
return false;
}
public function updateMetaData(mixed $element, ?string $locale, SeoMetaDataInterface $seoMetadata): void
{
$elementId = null;
$elementType = null;
if ($element instanceof Concrete) {
$elementId = $element->getId();
$elementType = 'object';
} elseif ($element instanceof Document) {
$elementId = $element->getId();
$elementType = 'document';
}
if ($elementType === null || !$elementId) {
return;
}
$elementMetaData = $this->elementMetaDataManager->getElementData($elementType, $elementId);
foreach ($elementMetaData as $elementMeta) {
try {
$metaDataIntegrator = $this->metaDataIntegratorRegistry->get($elementMeta->getIntegrator());
} catch (\Exception $e) {
// fail silently
continue;
}
$metaDataIntegrator->updateMetaData($element, $elementMeta->getData(), $locale, $seoMetadata);
}
}
}