diff --git a/README.md b/README.md index c06fac98a717f78e3507fd26bfc14b178220e938..d3021ab6536d76001cba6e7f18d74abd878a3772 100644 --- a/README.md +++ b/README.md @@ -162,13 +162,20 @@ by harvesters or other tools and because the RRCHNM itself removed the [schema] from the last site. **NOTE**: Because of its limited support by harvesters, the format is not -implemented. +implemented in Omeka S. ### Other formats Other formats can be added or replace an existing one via a key in the config `['oaipmhrepository']['metadata_formats']`. +### Customization + +The output can be customized via the filter `oaipmhrepository.values`, that is +triggered for each term. So it is possible to remove, to update or to append +some values, or to convert some properties from other vocabularies into the +standard formats. + Warning ------- diff --git a/src/OaiPmh/Metadata/AbstractMetadata.php b/src/OaiPmh/Metadata/AbstractMetadata.php index fc1ccd034977befe7dae56b6543a754dd22bea7e..d1428c5d96d422d255b55e0a82f254e7e623eaa1 100644 --- a/src/OaiPmh/Metadata/AbstractMetadata.php +++ b/src/OaiPmh/Metadata/AbstractMetadata.php @@ -16,7 +16,6 @@ use Omeka\Api\Representation\AbstractResourceEntityRepresentation; use Omeka\Api\Representation\ItemRepresentation; use Omeka\Api\Representation\ValueRepresentation; use Omeka\Settings\SettingsInterface; -use Zend\EventManager\Event; use Zend\EventManager\EventManagerAwareInterface; use Zend\EventManager\EventManagerAwareTrait; @@ -159,18 +158,16 @@ abstract class AbstractMetadata $term, $values ) { - /** @var \Zend\EventManager\EventManager $eventManager */ - $eventManager = $this->getEventManager(); - /** @var \ArrayObject $args */ - $args = $eventManager->prepareArgs([]); - $args['repository'] = self::class; - $args['resource'] = $resource; + $args = []; + $args['prefix'] = $this->getMetadataPrefix(); $args['term'] = $term; + $args['resource'] = $resource; $args['values'] = $values; - $event = new Event('oaipmhrepository.values', $this, $args); - $eventManager->triggerEvent($event); - + /** @var \ArrayObject $args */ + $eventManager = $this->getEventManager(); + $args = $eventManager->prepareArgs($args); + $eventManager->trigger('oaipmhrepository.values', $this, $args); return $args['values']; } diff --git a/src/OaiPmh/Metadata/CdwaLite.php b/src/OaiPmh/Metadata/CdwaLite.php index 8b74c7c749a43e9f95ff3867541a3f83c1af68f4..035070a637aab7ae929ed3d2c677ae0908d05d2c 100644 --- a/src/OaiPmh/Metadata/CdwaLite.php +++ b/src/OaiPmh/Metadata/CdwaLite.php @@ -61,6 +61,7 @@ class CdwaLite extends AbstractMetadata * Required. Fill with 'Unknown' if omitted. */ $types = $item->value('dcterms:type', ['all' => true, 'default' => []]); + $types = $this->filterValues($item, 'dcterms:type', $types); $objectWorkTypeWrap = $this->appendNewElement($descriptive, 'cdwalite:objectWorkTypeWrap'); if (empty($types)) { $types[] = 'Unknown'; @@ -74,6 +75,7 @@ class CdwaLite extends AbstractMetadata * Required. Fill with 'Unknown' if omitted. */ $titles = $item->value('dcterms:title', ['all' => true, 'default' => []]); + $titles = $this->filterValues($item, 'dcterms:title', $titles); $titleWrap = $this->appendNewElement($descriptive, 'cdwalite:titleWrap'); foreach ($titles as $title) { @@ -86,6 +88,7 @@ class CdwaLite extends AbstractMetadata * Non-repeatable, implode for inclusion of many creators. */ $creators = $item->value('dcterms:creator', ['all' => true, 'default' => []]); + $creators = $this->filterValues($item, 'dcterms:creator', $creators); $creatorTexts = []; foreach ($creators as $creator) { @@ -121,6 +124,7 @@ class CdwaLite extends AbstractMetadata * Non-repeatable, include only first date. */ $date = $item->value('dcterms:date'); + $date = $this->filterValues($item, 'dcterms:date', $date); $dateText = $date ? (string) $date : 'Unknown'; $this->appendNewElement($descriptive, 'cdwalite:displayCreationDate', $dateText); @@ -130,6 +134,7 @@ class CdwaLite extends AbstractMetadata */ $indexingDatesWrap = $this->appendNewElement($descriptive, 'cdwalite:indexingDatesWrap'); $dates = $item->value('dcterms:date', ['all' => true, 'default' => []]); + $dates = $this->filterValues($item, 'dcterms:date', $dates); foreach ($dates as $date) { $indexingDatesSet = $this->appendNewElement($indexingDatesWrap, 'cdwalite:indexingDatesSet'); $this->appendNewElement($indexingDatesSet, 'cdwalite:earliestDate', (string) $date); @@ -147,6 +152,7 @@ class CdwaLite extends AbstractMetadata * Not required. */ $subjects = $item->value('dcterms:subject', ['all' => true, 'default' => []]); + $subjects = $this->filterValues($item, 'dcterms:subject', $subjects); $classWrap = $this->appendNewElement($descriptive, 'cdwalite:classWrap'); foreach ($subjects as $subject) { $this->appendNewElement($classWrap, 'cdwalite:classification', (string) $subject); @@ -156,6 +162,7 @@ class CdwaLite extends AbstractMetadata * Not required. */ $descriptions = $item->value('dcterms:description', ['all' => true, 'default' => []]); + $descriptions = $this->filterValues($item, 'dcterms:description', $descriptions); if (!empty($descriptions)) { $descriptiveNoteWrap = $this->appendNewElement($descriptive, 'cdwalite:descriptiveNoteWrap'); foreach ($descriptions as $description) { @@ -175,6 +182,7 @@ class CdwaLite extends AbstractMetadata * Not required. */ $rights = $item->value('dcterms:rights', ['all' => true, 'default' => []]); + $rights = $this->filterValues($item, 'dcterms:rights', $rights); foreach ($rights as $right) { $this->appendNewElement($administrative, 'cdwalite:rightsWork', (string) $right); } diff --git a/src/OaiPmh/Metadata/Mets.php b/src/OaiPmh/Metadata/Mets.php index bb51cf5b91f10d534c89c14e4e24e07a2cdcd7d9..8989bff2a683df87e961a739245c028b81530679 100755 --- a/src/OaiPmh/Metadata/Mets.php +++ b/src/OaiPmh/Metadata/Mets.php @@ -66,7 +66,9 @@ class Mets extends AbstractMetadata ]; foreach ($dcElementNames as $elementName) { - $values = $item->value("dcterms:$elementName", ['all' => true, 'default' => []]); + $term = 'dcterms:' . $elementName; + $values = $item->value($term, ['all' => true, 'default' => []]); + $values = $this->filterValues($item, $term, $values); foreach ($values as $value) { $this->appendNewElement($dcXml, "dc:$elementName", (string) $value); } @@ -111,9 +113,11 @@ class Mets extends AbstractMetadata $fileIds[] = $fileId; foreach ($dcElementNames as $elementName) { - $dcElements = $media->value("dcterms:$elementName", ['all' => true, 'default' => []]); - foreach ($dcElements as $value) { - $this->appendNewElement($fileDcXml, "dc:$elementName", (string) $value); + $term = 'dcterms:' . $elementName; + $values = $media->value($term, ['all' => true, 'default' => []]); + $values = $this->filterValues($media, $term, $values); + foreach ($values as $value) { + $this->appendNewElement($fileDcXml, 'dc:' . $elementName, (string) $value); } } } diff --git a/src/OaiPmh/Metadata/Mods.php b/src/OaiPmh/Metadata/Mods.php index 46bccaed25e4e1154ef6a60d67f4f2022ceb0337..f89e653f7240e38a8b4214258cd0f77c81a0ae63 100644 --- a/src/OaiPmh/Metadata/Mods.php +++ b/src/OaiPmh/Metadata/Mods.php @@ -49,12 +49,14 @@ class Mods extends AbstractMetadata . ' ' . self::METADATA_SCHEMA); $titles = $item->value('dcterms:title', ['all' => true, 'default' => []]); + $titles = $this->filterValues($item, 'dcterms:title', $titles); foreach ($titles as $title) { $titleInfo = $this->appendNewElement($mods, 'titleInfo'); $this->appendNewElement($titleInfo, 'title', (string) $title); } $creators = $item->value('dcterms:creator', ['all' => true, 'default' => []]); + $creators = $this->filterValues($item, 'dcterms:creator', $creators); foreach ($creators as $creator) { $name = $this->appendNewElement($mods, 'name'); $this->appendNewElement($name, 'namePart', (string) $creator); @@ -64,6 +66,7 @@ class Mods extends AbstractMetadata } $contributors = $item->value('dcterms:contributor', ['all' => true, 'default' => []]); + $contributors = $this->filterValues($item, 'dcterms:contributor', $contributors); foreach ($contributors as $contributor) { $name = $this->appendNewElement($mods, 'name'); $this->appendNewElement($name, 'namePart', (string) $contributor); @@ -73,23 +76,27 @@ class Mods extends AbstractMetadata } $subjects = $item->value('dcterms:subject', ['all' => true, 'default' => []]); + $subjects = $this->filterValues($item, 'dcterms:subject', $subjects); foreach ($subjects as $subject) { $subjectTag = $this->appendNewElement($mods, 'subject'); $this->appendNewElement($subjectTag, 'topic', (string) $subject); } $descriptions = $item->value('dcterms:description', ['all' => true, 'default' => []]); + $descriptions = $this->filterValues($item, 'dcterms:description', $descriptions); foreach ($descriptions as $description) { $this->appendNewElement($mods, 'note', (string) $description); } $formats = $item->value('dcterms:format', ['all' => true, 'default' => []]); + $formats = $this->filterValues($item, 'dcterms:format', $formats); foreach ($formats as $format) { $physicalDescription = $this->appendNewElement($mods, 'physicalDescription'); $this->appendNewElement($physicalDescription, 'form', (string) $format); } $languages = $item->value('dcterms:language', ['all' => true, 'default' => []]); + $languages = $this->filterValues($item, 'dcterms:language', $languages); foreach ($languages as $language) { $languageElement = $this->appendNewElement($mods, 'language'); $languageTerm = $this->appendNewElement($languageElement, 'languageTerm', (string) $language); @@ -97,16 +104,19 @@ class Mods extends AbstractMetadata } $rights = $item->value('dcterms:rights', ['all' => true, 'default' => []]); + $rights = $this->filterValues($item, 'dcterms:rights', $rights); foreach ($rights as $right) { $this->appendNewElement($mods, 'accessCondition', (string) $right); } $types = $item->value('dcterms:type', ['all' => true, 'default' => []]); + $types = $this->filterValues($item, 'dcterms:type', $types); foreach ($types as $type) { $this->appendNewElement($mods, 'genre', (string) $type); } $identifiers = $item->value('dcterms:identifier', ['all' => true, 'default' => []]); + $identifiers = $this->filterValues($item, 'dcterms:identifier', $identifiers); foreach ($identifiers as $identifier) { $text = (string) $identifier; $idElement = $this->appendNewElement($mods, 'identifier', $text); @@ -118,11 +128,13 @@ class Mods extends AbstractMetadata } $sources = $item->value('dcterms:source', ['all' => true, 'default' => []]); + $sources = $this->filterValues($item, 'dcterms:source', $sources); foreach ($sources as $source) { $this->_addRelatedItem($mods, (string) $source, true); } $relations = $item->value('dcterms:relation', ['all' => true, 'default' => []]); + $relations = $this->filterValues($item, 'dcterms:relation', $relations); foreach ($relations as $relation) { $this->_addRelatedItem($mods, (string) $relation); } @@ -146,7 +158,9 @@ class Mods extends AbstractMetadata $url->setAttribute('usage', 'primary display'); $publishers = $item->value('dcterms:publisher', ['all' => true, 'default' => []]); + $publishers = $this->filterValues($item, 'dcterms:publishers', $publishers); $dates = $item->value('dcterms:date', ['all' => true, 'default' => []]); + $dates = $this->filterValues($item, 'dcterms:date', $dates); // Empty originInfo sections are illegal if (count($publishers) + count($dates) > 0) { diff --git a/src/OaiPmh/Metadata/OaiDc.php b/src/OaiPmh/Metadata/OaiDc.php index 1a8299842bdaeb28c55fbcf70a255b00de90b1f6..6ef13853826b0f61b2b8520504b8618136693071 100644 --- a/src/OaiPmh/Metadata/OaiDc.php +++ b/src/OaiPmh/Metadata/OaiDc.php @@ -63,7 +63,9 @@ class OaiDc extends AbstractMetadata * compliant per-node declarations. */ foreach ($dcElementNames as $elementName) { - $values = $item->value("dcterms:$elementName", ['all' => true, 'default' => []]); + $term = 'dcterms:' . $elementName; + $values = $item->value($term, ['all' => true, 'default' => []]); + $values = $this->filterValues($item, $term, $values); foreach ($values as $value) { $this->appendNewElement($oai_dc, "dc:$elementName", (string) $value); } diff --git a/src/Service/OaiPmh/Metadata/CdwaLiteFactory.php b/src/Service/OaiPmh/Metadata/CdwaLiteFactory.php index c3e3f77d986e9f1fc1b4e7a19675048a598816a4..b5a553e4a9ef71c816d1864268ed2d39a1a83bf3 100644 --- a/src/Service/OaiPmh/Metadata/CdwaLiteFactory.php +++ b/src/Service/OaiPmh/Metadata/CdwaLiteFactory.php @@ -19,6 +19,7 @@ class CdwaLiteFactory implements FactoryInterface $oaiSetManager = $services->get('OaiPmhRepository\OaiPmh\OaiSetManager'); $oaiSet = $oaiSetManager->get($settings->get('oaipmhrepository_oai_set_format', 'base')); $metadataFormat = new CdwaLite(); + $metadataFormat->setEventManager($services->get('EventManager')); $metadataFormat->setSettings($settings); $metadataFormat->setOaiSet($oaiSet); $isGlobalRepository = !$services->get('ControllerPluginManager') diff --git a/src/Service/OaiPmh/Metadata/MetsFactory.php b/src/Service/OaiPmh/Metadata/MetsFactory.php index e041c48bc93adf4a18c0434d73f5d58545c1fd5b..1844aaf1867d96b1cfb2e17eec5fe13fc7bc35c3 100644 --- a/src/Service/OaiPmh/Metadata/MetsFactory.php +++ b/src/Service/OaiPmh/Metadata/MetsFactory.php @@ -19,6 +19,7 @@ class MetsFactory implements FactoryInterface $oaiSetManager = $services->get('OaiPmhRepository\OaiPmh\OaiSetManager'); $oaiSet = $oaiSetManager->get($settings->get('oaipmhrepository_oai_set_format', 'base')); $metadataFormat = new Mets(); + $metadataFormat->setEventManager($services->get('EventManager')); $metadataFormat->setSettings($settings); $metadataFormat->setOaiSet($oaiSet); $isGlobalRepository = !$services->get('ControllerPluginManager') diff --git a/src/Service/OaiPmh/Metadata/ModsFactory.php b/src/Service/OaiPmh/Metadata/ModsFactory.php index 9797ad6024978c259532c253c97cc5f32b0f8375..a9882b51f80bdd5b64fa5cbe8d3b51468d1f2c1c 100644 --- a/src/Service/OaiPmh/Metadata/ModsFactory.php +++ b/src/Service/OaiPmh/Metadata/ModsFactory.php @@ -19,6 +19,7 @@ class ModsFactory implements FactoryInterface $oaiSetManager = $services->get('OaiPmhRepository\OaiPmh\OaiSetManager'); $oaiSet = $oaiSetManager->get($settings->get('oaipmhrepository_oai_set_format', 'base')); $metadataFormat = new Mods(); + $metadataFormat->setEventManager($services->get('EventManager')); $metadataFormat->setSettings($settings); $metadataFormat->setOaiSet($oaiSet); $isGlobalRepository = !$services->get('ControllerPluginManager') diff --git a/src/Service/OaiPmh/Metadata/OaiDcFactory.php b/src/Service/OaiPmh/Metadata/OaiDcFactory.php index 12e9b6f9ac659fbb0afffebc9fb5976502f00a86..a0f719f34dccc2d74ba295b07392f5f875fd5de9 100644 --- a/src/Service/OaiPmh/Metadata/OaiDcFactory.php +++ b/src/Service/OaiPmh/Metadata/OaiDcFactory.php @@ -19,6 +19,7 @@ class OaiDcFactory implements FactoryInterface $oaiSetManager = $services->get('OaiPmhRepository\OaiPmh\OaiSetManager'); $oaiSet = $oaiSetManager->get($settings->get('oaipmhrepository_oai_set_format', 'base')); $metadataFormat = new OaiDc(); + $metadataFormat->setEventManager($services->get('EventManager')); $metadataFormat->setSettings($settings); $metadataFormat->setOaiSet($oaiSet); $isGlobalRepository = !$services->get('ControllerPluginManager')