Skip to content
Snippets Groups Projects
Commit 74a024f4 authored by Patrick Barroca's avatar Patrick Barroca :grin:
Browse files

Merge branch 'hotline#94786_niveaux_lecture_toujours_lies_alors_que_ne_le_sont_plus' into 'hotline'

hotline#94786: cosmogramme : deleting multiple thesaurus field would leave some…

See merge request !3239
parents e7942be7 c3620240
Branches
Tags
3 merge requests!3297WIP: Master,!3252Hotline,!3239hotline#94786: cosmogramme : deleting multiple thesaurus field would leave some…
Pipeline #8306 passed with stage
in 35 minutes and 46 seconds
......@@ -50,6 +50,7 @@ class notice_unimarc extends iso2709_record {
private $id_genre_documentaire; // Identifiant pour le genre "documentaire"
private $controle_codes_barres; // Exception de filtrage des codes-barres
protected $_id_bib; // Bibliotheque d'intégration
protected $_fluent; // Class_NoticeUnimarc_Fluent
public function __construct($id_bib=null) {
......@@ -94,10 +95,18 @@ class notice_unimarc extends iso2709_record {
}
$this->setNotice($data, $this->profil['accents']);
$this->_fluent = null;
return true;
}
protected function _getFluent() {
return $this->_fluent
? $this->_fluent
: $this->_fluent = Class_NoticeUnimarc_Fluent::fromLegacy($this);
}
public function updateItemsWithUrl(&$exemplaires) {
if (!$champ_url = $this->profil['attributs'][Class_IntProfilDonnees::FT_RECORDS][Class_IntProfilDonnees::FIELD_ITEM_URL])
return $this;
......@@ -187,7 +196,7 @@ class notice_unimarc extends iso2709_record {
$notice["dewey"] = $this->getDewey();
$notice["thesauri"] = $this->getThesauri($notice);
$notice["thesauri"] = $this->getThesauri();
$notice["pcdm4"] = $this->getPcdm4();
......@@ -1258,7 +1267,7 @@ class notice_unimarc extends iso2709_record {
}
public function getThesauri($notice) {
public function getThesauri() {
return array_merge($this->_findThesauriIn686(),
$this->_findOtherThesauri());
......@@ -1271,27 +1280,34 @@ class notice_unimarc extends iso2709_record {
}
/** @return array thesaurus list */
protected function _findThesauriIn686() {
$thesaurus = [];
$data = $this->get_subfield('686');
$thesauri = $this
->_getFluent()
->zonesCollect(function($zone)
{
return $this->_findThesauriIn686Zone($zone);
});
foreach($data as $items) {
$sous_champs = $this->decoupe_bloc_champ($items);
$code_thesaurus = null;
$id_origine = null;
foreach($sous_champs as $item) {
if ($item["code"] == "a")
$id_origine = $item['valeur'];
if ($item["code"] == "2")
$code_thesaurus = trim($item['valeur']);
if ($code_thesaurus && $id_origine ) {
$thesaurus[] = Class_CodifThesaurus::findByIdOrigineAndCode($id_origine,
$code_thesaurus);
}
}
}
return $thesaurus;
return array_filter($thesauri->getArrayCopy());
}
/**
* @param $zone Class_NoticeUnimarc_Zone
* @return Class_CodifThesaurus
*/
protected function _findThesauriIn686Zone($zone) {
if (!$zone->isLabel('686'))
return;
$id_field = $zone->detectFieldByCode('a');
$code_field = $zone->detectFieldByCode('2');
return $id_field && $code_field
? Class_CodifThesaurus::findByIdOrigineAndCode($id_field->getValue(),
trim($code_field->getValue()))
: null;
}
......
This diff is collapsed.
01762njm0 2200313 450 00100060000001000110000610000450001720000220006221000260008422500320011041000230014246400540016546400610021946401950028060600110047560600220048668600760050868600390058470000310062370200200065470200230067471200670069771200280076480100170079290003240080999300150113399501370114899601630128511785 d41,5 F a20110812u u u0frey50 1 aSuites de ballets cPolydordRééd. 19932 aPanorama classique9id:2999 0tPanorama classique tLe Lac des cygnes:suite extraite du ballet op. 20 tLa belle au bois dormant:suite extraite du ballet op. 66 tCasse-noisette:suite extraite du ballet op. 71/ Piotr Ilyich Tchaïkovski, Witold Rowicki, dir., Ferdinand Leitner, dir., Orchestre Symphonique de la Philharmonie Nationale de Varsovie, Berl 1aballet amusique classique a3tMusique classique (Musique savante de tradition occidentale)2Cestas aAdultestAdultes2Code stat Cestas 1aTchaïkovskibPiotr Ilyich 1aRowickibWitold 1aLeitnerbFerdinand02aOrchestre Symphonique de la Philharmonie Nationale de Varsovie 1aBerliner Philharmoniker 2aFrc20190726 aLe Lac des cygnes:suite extraite du ballet op. 20 ; La belle au bois dormant:suite extraite du ballet op. 66 ; Casse-noisette:suite extraite du ballet op. 71/ Piotr Ilyich Tchaïkovski, Witold Rowicki, dir., Ferdinand Leitner, dir., Orchestre Symphonique de la Philharmonie Nationale de Varsovie, BerllContientntracks 41a0-4 ans aMédiathèque de Cestasf35025224k3 TCH 28m20190726qdrjeopv12[DISPO][Disponible][0][1][En rayon][0][0][0][0]50641758191  f35025224k3 TCH 28m00000000n00000000aFonds propreb2vMédiathèque MunicipalexCompact disques adulteeCompact disque adulterCD1Document en bon état31
\ No newline at end of file
......@@ -278,11 +278,9 @@ class CodifThesaurusLoader extends Storm_Model_Loader {
* @param int
* $return Class_CodifThesaurus
*/
public function findByIdOrigineAndCode($id_origine,$code_thesaurus) {
if ($thesaurus = Class_CodifThesaurus::findFirstBy(['id_origine' => $id_origine,
'code' => $code_thesaurus ]))
return $thesaurus;
return Class_CodifThesaurus::findFirstBy(['id_origine' => $id_origine]);
public function findByIdOrigineAndCode($id_origine, $code_thesaurus) {
return Class_CodifThesaurus::findFirstBy(['id_origine' => $id_origine,
'code' => $code_thesaurus ]);
}
......
......@@ -25,6 +25,13 @@ class Class_NoticeUnimarc_Fluent {
$_label,
$_zones;
/** @param $reader Class_NoticeUnimarc */
public static function fromLegacy($reader) {
return (new Class_NoticeUnimarc_LegacyVisitor())
->legacyToFluent($reader);
}
public function __construct() {
$this->_label = new Class_NoticeUnimarc_BibliographicLabel();
$this->_zones = new Storm_Collection();
......@@ -65,20 +72,26 @@ class Class_NoticeUnimarc_Fluent {
}
public function zonesCollect($callback) {
return $this->_zones->collect($callback);
}
public function render() {
$address = 0;
$directory = '';
$zones = implode($this->_zones
->collect(
function($zone) use(&$address, &$directory) {
$marc = $zone->render();
$length = strlen($marc);
$directory .= $zone->directoryWith($length, $address);
$address += $length;
return $marc;
})
->getArrayCopy());
$zones = $this
->zonesCollect(function($zone) use(&$address, &$directory)
{
$marc = $zone->render();
$length = strlen($marc);
$directory .= $zone->directoryWith($length, $address);
$address += $length;
return $marc;
});
$zones = implode($zones->getArrayCopy());
$zones .= chr(0x1d);
$directory .= chr(0x1e);
......@@ -183,6 +196,11 @@ class Class_NoticeUnimarc_Zone {
}
public function isLabel($label) {
return $label == $this->_label;
}
public function content($content) {
$this->_content = $content;
$this->_sub_zones = new Storm_Collection();
......@@ -192,9 +210,17 @@ class Class_NoticeUnimarc_Zone {
public function children($children) {
foreach($children as $code => $value)
$this->_sub_zones->append((new Class_NoticeUnimarc_SubZone)->code($code)->value($value));
$this->_content = null;
$this->addChild($code, $value);
return $this;
}
public function addChild($code, $value) {
$this->_sub_zones
->append((new Class_NoticeUnimarc_SubZone)->code($code)->value($value));
$this->_content = null;
return $this;
}
......@@ -205,6 +231,19 @@ class Class_NoticeUnimarc_Zone {
}
public function detectFieldByCode($code) {
return $this->detectField(function($field) use($code)
{
return $field->isCode($code);
});
}
public function detectField($callback) {
return $this->_sub_zones->detect($callback);
}
public function render() {
$content = $this->_content
? $this->_content
......@@ -234,13 +273,60 @@ class Class_NoticeUnimarc_SubZone {
}
public function isCode($code) {
return $code == $this->_code;
}
public function value($value) {
$this->_value = $value;
return $this;
}
public function getValue() {
return $this->_value;
}
public function render() {
return chr(0x1f) . $this->_code . $this->_value;
}
}
class Class_NoticeUnimarc_LegacyVisitor {
protected $_fluent;
public function __call($name, $args) {
if ('visit' === substr($name, 0, 5))
return $this;
throw new RuntimeException('Call to undefine method Class_NoticeUnimarc_LegacyVisitor::' . $name);
}
public function legacyToFluent($reader) {
$this->_fluent = new Class_NoticeUnimarc_Fluent;
$reader->acceptVisitor($this);
return $this->_fluent;
}
public function visitZone($label, $definition) {
$zone = $this->_fluent->newZone()->label($label);
$fields = $definition['champs'];
if (1 == count($fields) && '' === $fields[0]['code']) {
$zone->content($fields[0]['valeur']);
return $this;
}
foreach($fields as $field)
$zone->addChild(substr($field['code'], 1, 1), $field['valeur']);
return $this;
}
}
\ No newline at end of file
......@@ -154,7 +154,7 @@ class LastfmGetMorceauxNoTracksIntegrationTest extends ModelTestCase {
public function setUp() {
parent::setUp();
$this->_last_fm = new Class_WebService_Lastfm();
$this->_album = $this->_last_fm->getMorceaux('Les années de pélerinage', 'Franz Liszt');
$this->_album = $this->_last_fm->getMorceaux('uiaunesrttt', 'auierst');
}
......@@ -162,9 +162,4 @@ class LastfmGetMorceauxNoTracksIntegrationTest extends ModelTestCase {
public function nbResultsShouldBeZero() {
$this->assertEquals(0, $this->_album['nb_resultats']);
}
}
?>
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment