diff --git a/VERSIONS_HOTLINE/155841 b/VERSIONS_HOTLINE/155841 new file mode 100644 index 0000000000000000000000000000000000000000..1d4c657e115171a00230399589b406b63440f378 --- /dev/null +++ b/VERSIONS_HOTLINE/155841 @@ -0,0 +1 @@ + - correctif #155841 : Cosmogramme : Lors d'un import via un flux OAI en DublinCore, les identifiants multiples sont bien pris en comptes. Les ISSN et ISBN sont correctement detectés. \ No newline at end of file diff --git a/library/Class/Cosmogramme/Integration/Record/DublinCore.php b/library/Class/Cosmogramme/Integration/Record/DublinCore.php index b1599319426d4f501475b52834e52b0179bebf70..149efa0902509739afbcc1e75cddd2b911d17c78 100644 --- a/library/Class/Cosmogramme/Integration/Record/DublinCore.php +++ b/library/Class/Cosmogramme/Integration/Record/DublinCore.php @@ -68,13 +68,31 @@ class Class_Cosmogramme_Integration_Record_DublinCore extends notice_unimarc { ->visitItems($this->_getItem()) ->visitAuteur($authors); - return $this->_achieveUnimarc($unimarc_visitor); + $this->_acceptVisitorForIdentifier($this->_datas['id_oai'], $unimarc_visitor); + + foreach($this->_datas['other_ids'] as $url) + $this->_acceptVisitorForIdentifier($url, $unimarc_visitor); + + return $unimarc_visitor; } - protected function _achieveUnimarc($unimarc_visitor) { - return $unimarc_visitor - ->visitLabelledUrl($this->_('Consulter la ressource en ligne'), $this->_datas['id_oai']); + protected function _acceptVisitorForIdentifier(string $url, + Class_Indexation_PseudoNotice_UnimarcVisitor $unimarc_visitor) + { + $matches=[]; + if (preg_match('/URN:ISBN[^\d]+((97(8|9))?\d{9}(\d|X))/',$url,$matches)) { + $unimarc_visitor->visitIsbn($matches[1]); + return $unimarc_visitor; + } + if (preg_match('/ISSN[^\d]+([0-9]{4}-[0-9]{4})/',$url,$matches)){ + $unimarc_visitor->visitIssn($matches[1]); + return $unimarc_visitor; + } + if (Class_Url::isAnUrl($url)) + $unimarc_visitor->visitLabelledUrl($this->_('Consulter la ressource en ligne'), $url); + + return $unimarc_visitor; } diff --git a/library/Class/Indexation/PseudoNotice/UnimarcVisitor.php b/library/Class/Indexation/PseudoNotice/UnimarcVisitor.php index 51784ef8a882b3cefd2286649d0bf00dffa3f218..5cef2b55111e38e3c0ed76213af7fb05d55999e9 100644 --- a/library/Class/Indexation/PseudoNotice/UnimarcVisitor.php +++ b/library/Class/Indexation/PseudoNotice/UnimarcVisitor.php @@ -53,6 +53,16 @@ class Class_Indexation_PseudoNotice_UnimarcVisitor extends Class_Indexation_Pseu } + public function visitIsbn(string $isbn) { + $this->addUnimarcField('010', ' ', 'a' . $isbn); + } + + + public function visitIssn(string $issn) { + $this->addUnimarcField('011', ' ', 'b' . $issn); + } + + protected function _rendDate($date) { if (!$date) return false; diff --git a/library/Class/WebService/OAI/DublinCoreParser.php b/library/Class/WebService/OAI/DublinCoreParser.php index 8ebf69a50302373078af813af7ff6e34cef2c559..f0ef9413b55331229b0e90d1f8360f5fcccc282f 100644 --- a/library/Class/WebService/OAI/DublinCoreParser.php +++ b/library/Class/WebService/OAI/DublinCoreParser.php @@ -45,6 +45,7 @@ class Class_WebService_OAI_DublinCoreParser extends Class_WebService_OAI_ParserA public function newRecord($attributes) { return $this->_record = ['record_id', 'id_oai' => '', + 'other_ids' => [], 'titre' => '', 'date' => '', 'auteur' => [], @@ -62,7 +63,12 @@ class Class_WebService_OAI_DublinCoreParser extends Class_WebService_OAI_ParserA public function enddc_identifier($data) { - $this->_record['id_oai'] = $data; + if(!$this->_record['id_oai']) { + $this->_record['id_oai'] = $data; + return; + } + + $this->_record['other_ids'][] = $data; } diff --git a/tests/library/Class/Cosmogramme/Integration/PhaseNoticeDublinCoreTest.php b/tests/library/Class/Cosmogramme/Integration/PhaseNoticeDublinCoreTest.php index d77319118d9cb1a3e5250416de3d9a83b913f429..47e32e5968ad00e0d72e3c2c44186475af5f0a8b 100644 --- a/tests/library/Class/Cosmogramme/Integration/PhaseNoticeDublinCoreTest.php +++ b/tests/library/Class/Cosmogramme/Integration/PhaseNoticeDublinCoreTest.php @@ -187,6 +187,37 @@ class PhaseNoticeDublinCoreTest extends AbstractPhaseNoticeDublinCoreTestCase { } + /** @test */ + public function firstRecordISBNShouldBe9782955314357() { + $isbn = Class_Notice::find(1)->get_subfield('010','a'); + $this->assertContains('9782955314357',$isbn); + } + + + /** @test */ + public function firstRecordISSNShouldBe1234dash6789() { + $isbn = Class_Notice::find(1)->get_subfield('011','b'); + $this->assertContains('1234-6789',$isbn); + } + + + /** @test */ + public function firstRecord856UShouldNotContainsCeciNEstPasUneURL() { + $field856u = Class_Notice::find(1)->get_subfield('856','u'); + $this->assertNotContains('Ceci n\'est pas une URL', + $field856u); + } + + + /** @test */ + public function firstRecord856uShouldContainsTwoLinks() { + $field856u = Class_Notice::find(1)->get_subfield('856','u'); + $this->assertEquals(['http://gallica.bnf.fr/ark:/12148/btv1b55006135m', + 'https://biblio.nantes.archi.fr/cgi-bin/koha/opac-detail.pl?biblionumber=46829'], + $field856u); + } + + /** * @test * @depends totalNumberOfRecordsFromOAIShouldBeNine diff --git a/tests/library/Class/Cosmogramme/Integration/dublinCoreResults_all.xml b/tests/library/Class/Cosmogramme/Integration/dublinCoreResults_all.xml index 9de5a5e403ce5888f577c6e35467b571cf14cf40..5208a832c278c32214d1c92c90d388c682f674f1 100644 --- a/tests/library/Class/Cosmogramme/Integration/dublinCoreResults_all.xml +++ b/tests/library/Class/Cosmogramme/Integration/dublinCoreResults_all.xml @@ -1,6 +1,10 @@ <?xml version="1.0" encoding="UTF-8" ?><OAI-PMH xmlns="http://www.openarchives.org/OAI/2.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/ http://www.openarchives.org/OAI/2.0/OAI-PMH.xsd"><responseDate>2016-04-06T15:37:13Z</responseDate><request metadataPrefix="oai_dc" verb="ListRecords" set="gallica:typedoc:cartes:atlas">http://oai.bnf.fr/oai2/OAIHandler</request><ListRecords> <record><header><identifier>oai:bnf.fr:gallica/ark:/12148/btv1b55006135m</identifier><datestamp>2012-09-21</datestamp><setSpec>gallica:typedoc:cartes:atlas</setSpec></header><metadata><oai_dc:dc xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd"> <dc:identifier>http://gallica.bnf.fr/ark:/12148/btv1b55006135m</dc:identifier> +<dc:identifier>URN:ISBN :9782955314357</dc:identifier> +<dc:identifier>URN:ISSN :1234-6789</dc:identifier> +<dc:identifier>Ceci n'est pas une URL</dc:identifier> +<dc:identifier>https://biblio.nantes.archi.fr/cgi-bin/koha/opac-detail.pl?biblionumber=46829</dc:identifier> <dc:title>Citta, fortezze, isole, e porti principali dell'Europa, in planta, et in elevatione, descritte, e publicate ad uso dell'Accademia Cosmografica degli Argonauti / Dal Padre Maestro Coronelli, ...</dc:title> <dc:creator>Coronelli, Vincenzo Maria (1650-1718). Cartographe</dc:creator> <dc:date>1689</dc:date>