From bd252507bdf063a4a9d74ea2a1086ed3329d5156 Mon Sep 17 00:00:00 2001 From: Ere Maijala <ere.maijala@helsinki.fi> Date: Tue, 1 Oct 2019 15:08:02 +0300 Subject: [PATCH] Fix Alma driver crash when an expected MARC subfield doesn't exist. (#1447) --- module/VuFind/src/VuFind/ILS/Driver/Alma.php | 31 ++++++++++++++------ 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/module/VuFind/src/VuFind/ILS/Driver/Alma.php b/module/VuFind/src/VuFind/ILS/Driver/Alma.php index 368bd27731e..ff8ae700754 100644 --- a/module/VuFind/src/VuFind/ILS/Driver/Alma.php +++ b/module/VuFind/src/VuFind/ILS/Driver/Alma.php @@ -1616,25 +1616,24 @@ class Alma extends AbstractBase implements \VuFindHttp\HttpServiceAwareInterface // Physical $physicalItems = $record->getFields('AVA'); foreach ($physicalItems as $field) { - $avail = $field->getSubfield('e')->getData(); + $avail = $this->getMarcSubfield($field, 'e'); $item = $tmpl; $item['availability'] = strtolower($avail) === 'available'; - $item['location'] = (string)$field->getSubfield('c') - ->getData(); + $item['location'] = $this->getMarcSubfield($field, 'c'); $status[] = $item; } // Electronic $electronicItems = $record->getFields('AVE'); foreach ($electronicItems as $field) { - $avail = $field->getSubfield('e')->getData(); + $avail = $this->getMarcSubfield($field, 'e'); $item = $tmpl; $item['availability'] = strtolower($avail) === 'available'; - $item['location'] = $field->getSubfield('m')->getData(); - $url = $field->getSubfield('u')->getData(); + $item['location'] = $this->getMarcSubfield($field, 'm'); + $url = $this->getMarcSubfield($field, 'u'); if (preg_match('/^https?:\/\//', $url)) { $item['locationhref'] = $url; } - $item['status'] = $field->getSubfield('s')->getData(); + $item['status'] = $this->getMarcSubfield($field, 's'); $status[] = $item; } // Digital @@ -1652,11 +1651,11 @@ class Alma extends AbstractBase implements \VuFindHttp\HttpServiceAwareInterface $item = $tmpl; unset($item['callnumber']); $item['availability'] = true; - $item['location'] = $field->getSubfield('e')->getData(); + $item['location'] = $this->getMarcSubfield($field, 'e'); if ($deliveryUrl) { $item['locationhref'] = str_replace( '%%id%%', - $field->getSubfield('b')->getData(), + $this->getMarcSubfield($field, 'b'), $deliveryUrl ); } @@ -1693,6 +1692,20 @@ class Alma extends AbstractBase implements \VuFindHttp\HttpServiceAwareInterface return null; } + /** + * Get a MARC subfield from a MARC field + * + * @param \File_MARC_Subfield $field MARC Field + * @param string $subfield Subfield code + * + * @return string + */ + protected function getMarcSubfield($field, $subfield) + { + $subfield = $field->getSubfield($subfield); + return false === $subfield ? '' : $subfield->getData(); + } + // @codingStandardsIgnoreStart /** -- GitLab