diff --git a/models/classes/metadata/MetadataLomService.php b/models/classes/metadata/MetadataLomService.php index cc60b2fe5..a1473a886 100644 --- a/models/classes/metadata/MetadataLomService.php +++ b/models/classes/metadata/MetadataLomService.php @@ -24,11 +24,10 @@ use DOMDocument; use DOMNodeList; +use DOMXPath; class MetadataLomService { - public const FEATURE_FLAG = 'FEATURE_FLAG_METADATA_LOM_SERVICE'; - public function addPropertiesToMetadataBlock(array $properties, DOMDocument $manifest): void { /** @var DOMNodeList $metadataBlock */ @@ -39,13 +38,30 @@ public function addPropertiesToMetadataBlock(array $properties, DOMDocument $man $manifest->documentElement->appendChild($metadataBlock); } - $metadataBlock->item(0) - ->appendChild($manifest->createElement('imsmd:lom')) - ->appendChild($manifest->createElement('imsmd:metaMetadata')) - ->appendChild($manifest->createElement('extension')) - ->appendChild($manifest->createElement('customProperties')); + $customProperties = $this->getCustomProperties($manifest); + + // If there is no custom properties means that it is initial loop and we need to create customProperties node + if (empty($customProperties)) { + $metadataBlock->item(0) + ->appendChild($manifest->createElement('imsmd:lom')) + ->appendChild($manifest->createElement('imsmd:metaMetadata')) + ->appendChild($manifest->createElement('extension')) + ->appendChild($manifest->createElement('customProperties')); + } foreach ($properties as $property) { + $propertyExists = false; + if (!empty($customProperties)) { + //Check if custom property DomElement array contain object where nodeValue is equal to $property['uri'] + $propertyExists = !empty(array_filter($customProperties, function ($customProperty) use ($property) { + return $customProperty->nodeValue === $property['uri']; + })); + } + + if ($propertyExists) { + continue; + } + $propertyNode = $manifest->createElement('property'); foreach ($property as $key => $value) { $propertyNode->appendChild($manifest->createElement($key, $value)); @@ -56,4 +72,14 @@ public function addPropertiesToMetadataBlock(array $properties, DOMDocument $man ->appendChild($propertyNode); } } + + private function getCustomProperties(DOMDocument $manifest): array + { + $xpath = new DOMXPath($manifest); + $xpath->registerNamespace('manifest', 'http://www.imsglobal.org/xsd/imscp_v1p1'); + $xpath->registerNamespace('imsmd', 'http://ltsc.ieee.org/xsd/LOM'); + + $customProperties = $xpath->query('//customProperties/property/uri'); + return iterator_to_array($customProperties); + } }