![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-media-gallery-metadata/Model/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\MediaGalleryMetadata\Model; use Magento\MediaGalleryMetadataApi\Api\Data\MetadataInterface; /** * Add metadata to the XMP template */ class AddXmpMetadata { private const XMP_XPATH_SELECTOR_TITLE = '//dc:title/rdf:Alt/rdf:li'; private const XMP_XPATH_SELECTOR_DESCRIPTION = '//dc:description/rdf:Alt/rdf:li'; private const XMP_XPATH_SELECTOR_KEYWORDS = '//dc:subject/rdf:Bag'; private const XMP_XPATH_SELECTOR_KEYWORDS_EACH = '//dc:subject/rdf:Bag/rdf:li'; private const XMP_XPATH_SELECTOR_KEYWORD_ITEM = 'rdf:li'; /** * Parse metadata * * @param string $data * @param MetadataInterface $metadata * @return string */ public function execute(string $data, MetadataInterface $metadata): string { $xml = simplexml_load_string($data); $namespaces = $xml->getNamespaces(true); foreach ($namespaces as $prefix => $url) { $xml->registerXPathNamespace($prefix, $url); } if ($metadata->getTitle() === null) { $this->deleteValueByXpath($xml, self::XMP_XPATH_SELECTOR_TITLE); } else { $this->setValueByXpath($xml, self::XMP_XPATH_SELECTOR_TITLE, $metadata->getTitle()); } if ($metadata->getDescription() === null) { $this->deleteValueByXpath($xml, self::XMP_XPATH_SELECTOR_DESCRIPTION); } else { $this->setValueByXpath($xml, self::XMP_XPATH_SELECTOR_DESCRIPTION, $metadata->getDescription()); } if ($metadata->getKeywords() === null) { $this->deleteValueByXpath($xml, self::XMP_XPATH_SELECTOR_KEYWORDS); } else { $this->updateKeywords($xml, $metadata->getKeywords()); } $data = $xml->asXML(); return str_replace("<?xml version=\"1.0\"?>\n", '', $data); } /** * Update keywords * * @param \SimpleXMLElement $xml * @param array $keywords */ private function updateKeywords(\SimpleXMLElement $xml, array $keywords): void { foreach ($xml->xpath(self::XMP_XPATH_SELECTOR_KEYWORDS_EACH) as $keywordElement) { unset($keywordElement[0]); } foreach ($xml->xpath(self::XMP_XPATH_SELECTOR_KEYWORDS) as $element) { foreach ($keywords as $keyword) { $element->addChild(self::XMP_XPATH_SELECTOR_KEYWORD_ITEM, $keyword); } } } /** * Deletes xml node by xpath * * @param \SimpleXMLElement $xml * @param string $xpath */ private function deleteValueByXpath(\SimpleXMLElement $xml, string $xpath): void { foreach ($xml->xpath($xpath) as $element) { unset($element[0]); } } /** * Set value to xml node by xpath * * @param \SimpleXMLElement $xml * @param string $xpath * @param string $value */ private function setValueByXpath(\SimpleXMLElement $xml, string $xpath, string $value): void { foreach ($xml->xpath($xpath) as $element) { $element[0] = $value; } } }