diff --git a/module/AvailabilityPlus/languages/de.ini b/module/AvailabilityPlus/languages/de.ini index 0a3107c02..949dc3094 100644 --- a/module/AvailabilityPlus/languages/de.ini +++ b/module/AvailabilityPlus/languages/de.ini @@ -1,7 +1,7 @@ ;AvailabilityPlus department = "Standort/Signatur:" FreeAccess = "Freier Volltextzugang (Direktlink)" -Go to parent work (local holding) = "Zum übergeordneten Werk (Bestand)" +Go to parent work = "Zum übergeordneten Werk (Bestand)" GBVILL = "Fernleihbestellbarkeit prüfen" PubPharmProxy = "Volltextzugang (via PubPharm Proxy)" reserve = "vormerken" @@ -54,5 +54,5 @@ reason = "Grund" created by = "Erstellt durch" date = "Datum" link to more details = "Link zu weiteren Details" -Checked rule(s) = "Geprüfte Regel(n)" -no TestCases defined = "Keine Testfälle definiert" \ No newline at end of file +Checked rules = "Geprüfte Regel(n)" +no TestCases defined = "Keine Testfälle definiert" diff --git a/module/AvailabilityPlus/languages/en.ini b/module/AvailabilityPlus/languages/en.ini index 01c3df614..4928ef2f8 100644 --- a/module/AvailabilityPlus/languages/en.ini +++ b/module/AvailabilityPlus/languages/en.ini @@ -1,7 +1,7 @@ ;AvailabilityPlus department = "Location/Call Number:" FreeAccess = "Free Full Text Access (direct link)" -Go to parent work (local holding) = "Check Parent Work (local holding)" +Go to parent work = "Check Parent Work (local holding)" GBVILL = "Check Interlibrary Loan Availability" PubPharmProxy = "Full Text Access (via PubPharm Proxy)" reserve = "recall" @@ -54,5 +54,5 @@ reason = "Reason" created by = "Created by" date = "Date" link to more details = "Link to more details" -Checked rule(s) = "Checke rule(s)" -no TestCases defined = "No Test Cases defined" \ No newline at end of file +Checked rules = "Checked rule(s)" +no TestCases defined = "No Test Cases defined" diff --git a/module/AvailabilityPlus/src/AvailabilityPlus/AjaxHandler/GetItemStatuses.php b/module/AvailabilityPlus/src/AvailabilityPlus/AjaxHandler/GetItemStatuses.php index f138a914a..877db8ae9 100644 --- a/module/AvailabilityPlus/src/AvailabilityPlus/AjaxHandler/GetItemStatuses.php +++ b/module/AvailabilityPlus/src/AvailabilityPlus/AjaxHandler/GetItemStatuses.php @@ -120,7 +120,7 @@ public function handleRequest(Params $params) $results = $this->performAvailabilityCheck($check); foreach($results as $result) { if(!empty($result)) { - if(!empty($result['html'])) $check_mode = $this->current_mode; + if(isset($result['html']) && !empty($result['html'])) $check_mode = $this->current_mode; if($this->debug) { $result['html'] = $this->applyTemplate('ajax/debug.phtml', [ 'debug' => $result ]); } @@ -153,15 +153,16 @@ public function handleRequest(Params $params) } if($this->debug) { - $debug_info = []; - $debug_info['check'] = 'Debug Info'; - $debug_info['mediatype'] = $mediatype; - $debug_info['AvailabilityPlusConfig'] = 'availabilityplus.ini'; - $debug_info['SolrMarcYml'] = 'solrmarc.yml'; - $debug_info['SolrMarcYmlAvailabilityPlus'] = $this->config->toArray['General']['availabilityplus_yaml']; - $debug_info['checkRoute_in_AvailabilityPlusConfig'] = $this->checkRoute; - $debug_info['checks'] = $this->checks; - $responses[0][0]['html'] = $this->applyTemplate('ajax/debug.phtml', [ 'debug' => $debug_info ]).$responses[0][0]['html']; + $debug_info = [ + 'check' => 'Debug Info', + 'mediatype' => $mediatype, + 'AvailabilityPlusConfig' => 'availabilityplus.ini', + 'SolrMarcYml' => 'solrmarc.yml', + 'SolrMarcYmlAvailabilityPlus' => $this->config->toArray()['General']['availabilityplus_yaml'] ?? '', + 'checkRoute_in_AvailabilityPlusConfig' => $this->checkRoute, + 'checks' => $this->checks + ]; + $responses[0][0]['html'] = $this->applyTemplate('ajax/debug.phtml', [ 'debug' => $debug_info ]).($responses[0][0]['html'] ?? ''); } return $this->formatResponse(['statuses' => $responses]); @@ -171,14 +172,14 @@ private function setChecks($mediatype = '') { $list = $this->list; $mediatype = str_replace(array(' ', '+'),array('',''), $mediatype); $checks = 'RecordView'; - if($list) $checks = 'ResultList'; - if(!empty($this->config->toArray()[$this->source.$checks.'-'.$mediatype])) { + if(!empty($list)) $checks = 'ResultList'; + if(isset($this->config->toArray()[$this->source.$checks.'-'.$mediatype])) { $this->checks = $this->config->toArray()[$this->source.$checks.'-'.$mediatype]; $this->checkRoute = $this->source.$checks.'-'.$mediatype; - } else if(!empty($this->config->toArray()[$checks.'-'.$mediatype])) { + } else if(isset($this->config->toArray()[$checks.'-'.$mediatype])) { $this->checks = $this->config->toArray()[$checks.'-'.$mediatype]; $this->checkRoute = $checks.'-'.$mediatype; - } else if(!empty($this->config->toArray()[$this->source.$checks])) { + } else if(isset($this->config->toArray()[$this->source.$checks])) { $this->checks = $this->config->toArray()[$this->source.$checks]; $this->checkRoute =$this->source.$checks; } else { @@ -233,10 +234,10 @@ private function checkSolrMarcData($solrMarcKeys, $check) { $break = false; foreach ($solrMarcKeys as $solrMarcKey) { $data = $this->driver->getMarcData($solrMarcKey); - $level = $this->getLevel($data[0], $check, $solrMarcKey); - $label = $this->getLabel($data[0], $check); + $level = $this->getLevel($data[0] ?? [], $check, $solrMarcKey); + $label = $this->getLabel($data[0] ?? [], $check); + $template = $this->getTemplate($data); if(!empty($data) && $this->checkConditions($data)) { - $template = $this->getTemplate($data); foreach ($data as $date) { if (!empty($date['url']['data'][0])) { foreach ($date['url']['data'] as $url) { @@ -267,7 +268,7 @@ private function checkSolrMarcData($solrMarcKeys, $check) { } } } else { - $response = $this->generateResponse($check, $solrMarcKey, $level, $label, $template, $data, $url, false, $check_type); + $response = $this->generateResponse($check, $solrMarcKey, $level, $label, $template, $data, '', false, $check_type); $responses[] = $response; } if($break) break; @@ -281,17 +282,19 @@ private function checkConditions($data){ $numberofconditions = 0; foreach($data as $date) { - if(!empty($date['requirednumberofconditions']['data'][0])) { + if(isset($date['requirednumberofconditions']['data'][0])) { $requirednumberofconditions = $date['requirednumberofconditions']['data'][0]; } } foreach($data as $date) { - if(!empty($date['condition_true']['data'][0])) { - if($date['condition_true']['data'][0] != 'true') $check = false; + if(isset($date['condition_true']['data'][0]) && $date['condition_true']['data'][0] != 'true') { + $check = false; $numberofconditions += 1; - } elseif(!empty($date['condition_false']['data'][0])) { - if($date['condition_false']['data'][0] != 'false') $check = false; + } elseif(isset($date['condition_false']['data'][0]) && $date['condition_false']['data'][0] != 'false') { + $check = false; + $numberofconditions += 1; + } elseif(isset($date['condition_true']['data'][0]) || isset($date['condition_false']['data'][0])) { $numberofconditions += 1; } } @@ -303,13 +306,11 @@ private function checkConditions($data){ private function getLevel($date, $level, $solrMarcKey) { if($level != $solrMarcKey) $level = $level.' '.$solrMarcKey; - if(!empty($date['level']['data'][0])) $level = $date['level']['data'][0]; - return $level; + return $date['level']['data'][0] ?? $level; } private function getLabel($date, $label) { - if(!empty($date['label']['data'][0])) $label = $date['label']['data'][0]; - return $label; + return $date['label']['data'][0] ?? $label; } private function generateResponse($check, $solrMarcKey, $level, $label, $template, $data, $url, $status_bool, $check_type){ @@ -351,9 +352,7 @@ private function generateResponse($check, $solrMarcKey, $level, $label, $templat * @return string */ private function getTemplate($data) { - $template = $this->default_template; - if(!empty($data['view-method'])) $template = $data['view-method']; - return $template; + return $data['view-method'] ?? $this->default_template; } /** @@ -379,9 +378,11 @@ private function checkParentWorkILNSolr() { $template = 'ajax/link-parent.phtml'; $responses = []; $parentData = $this->driver->getMarcData('ArticleParentId'); + $parentId = ''; + $url = ''; $response = $this->generateResponse($check, 'ArticleParentId', '', '', $template, '', '', false, $check_type); foreach ($parentData as $parentDate) { - if (!empty(($parentDate['id']['data'][0]))) { + if (isset($parentDate['id']['data'][0]) && !empty($parentDate['id']['data'][0])) { $parentId = $parentDate['id']['data'][0]; break; } @@ -398,7 +399,7 @@ private function checkParentWorkILNSolr() { $ilnMatch = $this->driver->getMarcData('ILN'); } - if (!empty($ilnMatch[0]['iln']['data'][0])) { + if (isset($ilnMatch[0]['iln']['data'][0]) && !empty($ilnMatch[0]['iln']['data'][0])) { $url = '/vufind/Record/' . $parentId; } } catch (\Exception $e) { @@ -407,12 +408,12 @@ private function checkParentWorkILNSolr() { } if (!empty($url)) { $level = 'ParentWorkILNSolr'; - $label = 'Go to parent work (local holding)'; + $label = 'Go to parent work'; $response = $this->generateResponse($check, 'ArticleParentId', $level, $label, $template, $parentData, $url, true, $check_type); $response['html'] = $this->renderer->render($template , $response); } - $response['ilnMarcSpecs'] = $ilnMarcSpecs; - $response['ilnMatch'] = $ilnMatch; + $response['ilnMarcSpecs'] = $ilnMarcSpecs ?? []; + $response['ilnMatch'] = $ilnMatch ?? []; $responses[] = $response; return $responses; } @@ -435,8 +436,8 @@ private function getResolverResponse($resolver) { if(!empty($resolver_url) && !empty($marc_data)) { try { $resolver_data = $resolverHandler->fetchLinks($params); - $response = $this->generateResponse($resolver, $resolver, $resolver, $resolver, $template, $resolver_data['parsed_data'], $resolver_url, true, $check_type); - $response['resolverConfig'] = $this->resolverConfig[$resolver]; + $response = $this->generateResponse($resolver, $resolver, $resolver, $resolver, $template, $resolver_data['parsed_data'] ?? [], $resolver_url, true, $check_type); + $response['resolverConfig'] = $this->resolverConfig[$resolver] ?? []; $response['html'] = $this->applyTemplate($template, $response); if(empty($response['html'])) { $response['status']['level'] = 'unsuccessful_check'; @@ -446,7 +447,7 @@ private function getResolverResponse($resolver) { $response['resolver_rule_file'] = $resolverHandler->getRulesFile(); } catch (\Exception $e) { $template = 'ajax/default.phtml'; - $response = $this->generateResponse($resolver, $resolver, 'resolver_error', 'resolver_error', $template, $resolver_data['parsed_data'], $resolver_url, false, 'Resolver-EXCEPTION'); + $response = $this->generateResponse($resolver, $resolver, 'resolver_error', 'resolver_error', $template, $resolver_data['parsed_data'] ?? [], $resolver_url, false, 'Resolver-EXCEPTION'); $response['status']['label'] = 'EXCEPTION occured during processing'; $response['url'] = ''; $response['html'] = $this->applyTemplate($template, $response); @@ -485,7 +486,7 @@ private function checkMultiVolumeWork() { $url = "/vufind/Record/".$this->id; } } - $response = $this->generateResponse($check, '', $level, $label, $template, $parentData, $url, true, $check_type); + $response = $this->generateResponse($check, '', $level, $label, $template, [], $url ?? '', true, $check_type); $response['html'] = $this->renderer->render($template, $response); $responses[] = $response; } @@ -495,19 +496,17 @@ private function checkMultiVolumeWork() { private function prepareResolverParams($resolverData) { $used_params = []; $params = ''; - if(!empty($resolverData)) { - if(is_array($resolverData)) { - foreach ($resolverData as $resolverDate) { - if (is_array($resolverDate)) { - foreach ($resolverDate as $key => $value) { - if (!in_array($key, $used_params)) { - if (empty($params)) { - $params .= '?' . $key . '=' . urlencode($value['data'][0]); - } else { - $params .= '&' . $key . '=' . urlencode($value['data'][0]); - } - $used_params[] = $key; + if(!empty($resolverData) && is_array($resolverData)) { + foreach ($resolverData as $resolverDate) { + if (is_array($resolverDate)) { + foreach ($resolverDate as $key => $value) { + if (!in_array($key, $used_params)) { + if (empty($params)) { + $params .= '?' . $key . '=' . urlencode($value['data'][0] ?? ''); + } else { + $params .= '&' . $key . '=' . urlencode($value['data'][0] ?? ''); } + $used_params[] = $key; } } } @@ -515,4 +514,4 @@ private function prepareResolverParams($resolverData) { } return $params; } -} \ No newline at end of file +} diff --git a/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/AvailabilityPlusResolver.php b/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/AvailabilityPlusResolver.php index e131f9f87..e873e06f2 100644 --- a/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/AvailabilityPlusResolver.php +++ b/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/AvailabilityPlusResolver.php @@ -107,7 +107,7 @@ public function getRulesFile() { protected function applyCustomChanges() { $specsReader = new SearchSpecsReader(); - $rules = $specsReader->get($this->rules); + $rules = $specsReader->get($this->rules) ?? []; foreach($this->parsed_data as $key => $item) { $rules_applied = []; foreach($rules as $rule_key => $rule) { diff --git a/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/DAIA.php b/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/DAIA.php index c3a1a7df9..7a975379e 100644 --- a/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/DAIA.php +++ b/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/DAIA.php @@ -22,8 +22,7 @@ public function fetchLinks($openUrl) $url = $this->getResolverUrl($openUrl); $headers = $this->httpClient->getRequest()->getHeaders(); $headers->addHeaderLine('Accept-Language', $this->language); - $feed = $this->httpClient->setUri($url)->send()->getBody(); - return $feed; + return $this->httpClient->setUri($url)->send()->getBody(); } /** @@ -42,195 +41,174 @@ public function parseLinks($data_org) $data = json_decode($data_org); $this->parsed_data = $data; + if (isset($data->document[0]->item) && is_iterable($data->document[0]->item)) { + foreach($data->document[0]->item as $key => $item) { - foreach($data->document[0]->item as $key => $item) { + $item_services['available']['openaccess'] = []; + $item_services['available']['remote'] = []; + $item_services['available']['loan'] = []; + $item_services['available']['presentation'] = []; + $item_services['available']['fallback'][] = 'fallback'; - $item_services['available']['openaccess'] = []; - $item_services['available']['remote'] = []; - $item_services['available']['loan'] = []; - $item_services['available']['presentation'] = []; - $item_services['available']['fallback'][] = 'fallback'; - - foreach($item->available as $service) { - $item_services['available'][$service->service][] = $service; - $item_services['available']['fallback'] = []; - } - - foreach($item->unavailable as $service) { - if(count(get_object_vars($service)) > 1) { - $item_services['available'][$service->service][] = $service; + if (isset($item->available) && is_iterable($item->available)) { + foreach($item->available as $service) { + if (isset($service->service)) { + $item_services['available'][$service->service][] = $service; + $item_services['available']['fallback'] = []; + } + } } - } - $break = false; - foreach($item_services['available'] as $service_key=>$service_group) { - foreach($service_group as $service_content) { - $record = (object)[]; - if(!empty($service_content)) { - $record->id = $data->document[0]->id; - $record->ppn = substr($data->document[0]->id, strrpos($data->document[0]->id, ":") + 1); - if($item->id && strpos($item->id, "epn:") !== false) { - $record->epn_id = $item->id; - $record->epn = substr($item->id, strrpos($item->id, ":") + 1); - } elseif ($item->{'temporary-hack-do-not-use'}) { - $record->epn = $item->{'temporary-hack-do-not-use'}; - } - if($item->id && strpos($item->id, ":bar:") !== false) { - $record->barcode_id = $item->id; - $record->barcode = substr($item->id, strrpos($item->id, "$") + 1); - } elseif($service_content->href) { - $query = parse_url($service_content->href,PHP_URL_QUERY); - $query_array = array(); - parse_str($query, $query_array); - $record->barcode = $query_array['bar']; + if (isset($item->unavailable) && is_iterable($item->unavailable)) { + foreach($item->unavailable as $service) { + if(count(get_object_vars($service)) > 1 && isset($service->service)) { + $item_services['available'][$service->service][] = $service; } - $record->service = $service_key; - switch($service_key) { - case 'openaccess': - if(!in_array($service_content->href, $urls) || !$this->resolverConfig->hide_url_duplicates) { - if (!isset($record->daia_action)) { - $record->daia_action = new stdClass; - } - $record->daia_action->level = 'FreeAccess link_external'; - if (!empty($service_content->title)) $record->daia_action->title = $service_content->title; - $record->daia_action->label = 'FreeAccess'; - $record->daia_action->url = $service_content->href; - $urls[] = $record->daia_action->url; - if (!empty($item->about)) { - $record->about = $item->about; - } - if (!empty($item->chronology->about)) { - $record->chronology = $item->chronology->about; - } - $record->score = 0; - if (empty($this->parsed_data->document[0]->item[$key]->availabilityplus)) { - $this->parsed_data->document[0]->item[$key]->availabilityplus = $record; - } - $this->parsed_data->document[0]->item[$key]->availabilityplus->daia_action_array[] = $record->daia_action; - } - case 'remote': - if(!in_array($service_content->href, $urls) || !$this->resolverConfig->hide_url_duplicates) { - if (!isset($record->daia_action)) { - $record->daia_action = new stdClass; - } - $record->daia_action->level = 'LicensedAccess link_external'; - if (!empty($service_content->title)) $record->daia_action->title = $service_content->title; - $record->daia_action->label = 'LicensedAccess'; - $record->daia_action->url = $service_content->href; - $urls[] = $record->daia_action->url; - if (!empty($item->about)) { - $record->about = $item->about; - } - if (!empty($item->chronology->about)) { - $record->chronology = $item->chronology->about; - } - $record->score = 10; - if(!empty($service_content->limitation[0]->content)) { - $record->daia_action->limitation = $service_content->limitation[0]->content; - $record->daia_action->limitation_label = str_replace(" ", "", $service_content->limitation[0]->content); - $record->score = 15; - } - if (empty($this->parsed_data->document[0]->item[$key]->availabilityplus)) { - $this->parsed_data->document[0]->item[$key]->availabilityplus = $record; - } - $this->parsed_data->document[0]->item[$key]->availabilityplus->daia_action_array[] = $record->daia_action; - } - case 'loan': - case 'presentation': - if(empty($item_services['available']['openaccess']) && empty($item_services['available']['remote'])) { - if($service_key == 'loan') { - $record->score = 20; - } else { - $record->score = 30; - } - if(!empty($item->storage->href)){ - $this->setStorage($record, 'link_external', $item->storage->content, $item->storage->href); - } elseif(!empty($item->storage->id)){ - $this->setStorage($record, 'link_external', $item->storage->content, $item->storage->id); - } else { - $this->setStorage($record, null, 'unknown_location', null); - } - if(!empty($item->label)) $record->callnumber = $item->label; - if(!empty($service_content->limitation[0]->id)) { - $limitation = str_replace(' ','', substr($service_content->limitation[0]->id, strpos($service_content->limitation[0]->id, "#") + 1)); - $this->setDaiaHint($record, $limitation, $service_content->service.$limitation, null); - $record->score += 5; - } elseif(!empty($service_content->limitation[0]->content)) { - $limitation = str_replace(' ','',$service_content->limitation[0]->content); - $this->setDaiaHint($record, $limitation, $service_content->service.$limitation, null); - $record->score += 5; - } elseif(!empty($service_content->expected)) { - $date = date_create($service_content->expected); - $this->setDaiaHint($record, "daia_orange", 'on_loan_until', date_format($date,"d.m.Y")); - $record->score += 20; - } elseif(isset($service_content->queue)) { - $this->setDaiaHint($record, "daia_orange", 'on_loan', null); - $record->score += 20; - } else { - $this->setDaiaHint($record, "daia_green", $service_content->service, null); - } - if (!isset($record->daia_action)) { - $record->daia_action = new stdClass; - } - if(!empty($service_content->href)) { - $record->daia_action->level = 'internal_link'; - $url_components = parse_url($service_content->href); - parse_str($url_components['query'], $params); - $action = $params['action']; - if ($action == 'reserve') $action = 'recall'; - $record->daia_action->label = $action; - $record->daia_action->url = $this->generateOrderLink($action, $data->document[0]->id, $item->id, $item->storage->id); - } else { - $record->daia_action->label = $service_content->service.'_default_action'.$limitation; + } + } + + $break = false; + foreach($item_services['available'] as $service_key => $service_group) { + foreach($service_group as $service_content) { + $record = (object)[]; + if(!empty($service_content)) { + $record->id = $data->document[0]->id ?? ''; + $record->ppn = substr($record->id, strrpos($record->id, ":") + 1); + if(isset($item->id) && str_contains($item->id, "epn:")) { + $record->epn_id = $item->id; + $record->epn = substr($item->id, strrpos($item->id, ":") + 1); + } elseif (isset($item->{'temporary-hack-do-not-use'})) { + $record->epn = $item->{'temporary-hack-do-not-use'}; + } + if(isset($item->id) && str_contains($item->id, ":bar:")) { + $record->barcode_id = $item->id; + $record->barcode = substr($item->id, strrpos($item->id, "$") + 1); + } elseif(isset($service_content->href)) { + $query = parse_url($service_content->href, PHP_URL_QUERY); + $query_array = []; + parse_str($query, $query_array); + $record->barcode = $query_array['bar'] ?? ''; + } + $record->service = $service_key; + if (!isset($record->daia_action)) { + $record->daia_action = new stdClass; + } + switch($service_key) { + case 'openaccess': + case 'remote': + if((isset($service_content->href) && !in_array($service_content->href, $urls)) || (isset($this->resolverConfig->hide_url_duplicates) && !$this->resolverConfig->hide_url_duplicates)) { + $record->daia_action->level = ($service_key === 'openaccess' ? 'FreeAccess link_external' : 'LicensedAccess link_external'); + if (isset($service_content->title) && !empty($service_content->title)) $record->daia_action->title = $service_content->title; + $record->daia_action->label = ($service_key === 'openaccess' ? 'FreeAccess' : 'LicensedAccess'); + $record->daia_action->url = $service_content->href ?? ''; + $urls[] = $record->daia_action->url; + if (isset($item->about) && !empty($item->about)) { + $record->about = $item->about; + } + if (isset($item->chronology->about) && !empty($item->chronology->about)) { + $record->chronology = $item->chronology->about; + } + $record->score = ($service_key === 'openaccess' ? 0 : 10); + if ($service_key === 'remote') { + if(isset($service_content->limitation[0]->content) && !empty($service_content->limitation[0]->content)) { + $record->daia_action->limitation = $service_content->limitation[0]->content; + $record->daia_action->limitation_label = str_replace(" ", "", $service_content->limitation[0]->content); + $record->score = 15; + } + } + if (!isset($this->parsed_data->document[0]->item[$key]->availabilityplus) || empty($this->parsed_data->document[0]->item[$key]->availabilityplus)) { + $this->parsed_data->document[0]->item[$key]->availabilityplus = $record; + } + $this->parsed_data->document[0]->item[$key]->availabilityplus->daia_action_array[] = $record->daia_action; } - if(isset($service_content->queue)) { - if (!isset($record->queue)) { - $record->queue = new stdClass; + case 'loan': + case 'presentation': + if(empty($item_services['available']['openaccess']) && empty($item_services['available']['remote'])) { + $record->score = ($service_key === 'loan' ? 20 : 30); + if(isset($item->storage->href) && !empty($item->storage->href)){ + $this->setStorage($record, 'link_external', $item->storage->content ?? '', $item->storage->href); + } elseif(isset($item->storage->id) && !empty($item->storage->id)){ + $this->setStorage($record, 'link_external', $item->storage->content ?? '', $item->storage->id); + } else { + $this->setStorage($record, null, 'unknown_location', null); } - $record->queue->length = $service_content->queue; - if($service_content->queue == 1) { - $record->queue->label .= 'Recall'; + if(isset($item->label) && !empty($item->label)) $record->callnumber = $item->label; + if(isset($service_content->limitation[0]->id) && !empty($service_content->limitation[0]->id)) { + $limitation = str_replace(' ', '', substr($service_content->limitation[0]->id, strpos($service_content->limitation[0]->id, "#") + 1)); + $this->setDaiaHint($record, $limitation, ($service_content->service ?? '').$limitation, null); + $record->score += 5; + } elseif(isset($service_content->limitation[0]->content) && !empty($service_content->limitation[0]->content)) { + $limitation = str_replace(' ', '', $service_content->limitation[0]->content); + $this->setDaiaHint($record, $limitation, ($service_content->service ?? '').$limitation, null); + $record->score += 5; + } elseif(isset($service_content->expected) && !empty($service_content->expected)) { + $date = date_create($service_content->expected); + $this->setDaiaHint($record, "daia_orange", 'on_loan_until', date_format($date, "d.m.Y")); + $record->score += 20; + } elseif(isset($service_content->queue)) { + $this->setDaiaHint($record, "daia_orange", 'on_loan', null); + $record->score += 20; + } else { + $this->setDaiaHint($record, "daia_green", $service_content->service ?? '', null); + } + if(isset($service_content->href) && !empty($service_content->href)) { + $record->daia_action->level = 'internal_link'; + $url_components = parse_url($service_content->href); + parse_str($url_components['query'] ?? '', $params); + $action = $params['action'] ?? ''; + if ($action == 'reserve') $action = 'recall'; + $record->daia_action->label = $action; + $record->daia_action->url = $this->generateOrderLink($action, $data->document[0]->id ?? '', $item->id ?? '', $item->storage->id ?? ''); } else { - $record->queue->label .= 'Recalls'; + $record->daia_action->label = ($service_content->service ?? '').'_default_action'.($limitation ?? ''); } - $record->score += $service_content->queue; - } - if(!empty($item->about)) { - $record->about = $item->about; - } - if(!empty($item->chronology->about)) { - $record->chronology = $item->chronology->about; - } - $this->parsed_data->document[0]->item[$key]->availabilityplus = $record; - $break = true; - break; - } - case 'fallback': - if(empty($item_services['available']['openaccess']) && empty($item_services['available']['remote']) && empty($item_services['available']['loan']) && empty($item_services['available']['presentation'])) { - if(!empty($item->storage->id)){ - $this->setStorage($record, 'link_external', $item->storage->content, $item->storage->id); - } else { - $this->setStorage($record, null, 'unknown_location', null); - } - if(!empty($item->label)) $record->callnumber = $item->label; - $this->setDaiaHint($record, 'daia_red', 'not_available', null); - if(!empty($item->about)) { - $record->about = $item->about; + if(isset($service_content->queue)) { + if (!isset($record->queue)) { + $record->queue = new stdClass; + } + $record->queue->length = $service_content->queue; + $record->queue->label = 'Recall'; + if($service_content->queue != 1) { + $record->queue->label .= 's'; + } + $record->score += $service_content->queue; + } + if(isset($item->about) && !empty($item->about)) { + $record->about = $item->about; + } + if(isset($item->chronology->about) && !empty($item->chronology->about)) { + $record->chronology = $item->chronology->about; + } + $this->parsed_data->document[0]->item[$key]->availabilityplus = $record; + $break = true; + break; } - if(!empty($item->chronology->about)) { - $record->chronology = $item->chronology->about; + case 'fallback': + if(empty($item_services['available']['openaccess']) && empty($item_services['available']['remote']) && empty($item_services['available']['loan']) && empty($item_services['available']['presentation'])) { + if(isset($item->storage->id) && !empty($item->storage->id)){ + $this->setStorage($record, 'link_external', $item->storage->content ?? '', $item->storage->id); + } else { + $this->setStorage($record, null, 'unknown_location', null); + } + if(isset($item->label) && !empty($item->label)) $record->callnumber = $item->label; + $this->setDaiaHint($record, 'daia_red', 'not_available', null); + if(isset($item->about) && !empty($item->about)) { + $record->about = $item->about; + } + if(isset($item->chronology->about) && !empty($item->chronology->about)) { + $record->chronology = $item->chronology->about; + } + $record->score = 100; + $this->parsed_data->document[0]->item[$key]->availabilityplus = $record; + $break = true; + break; } - $record->score = 100; - $this->parsed_data->document[0]->item[$key]->availabilityplus = $record; - $break = true; - break; - - } + } + if($break) break; } - if($break) break; } + if($break) break; } - if($break) break; } } @@ -306,121 +284,102 @@ protected function applyCustomChanges() { $specsReader = new SearchSpecsReader(); $rules = $specsReader->get($this->rules); - foreach($this->parsed_data->document[0]->item as $key => $item) { - $rules_applied = []; - foreach($rules as $rule_key => $rule) { - $rule_applies = false; - foreach($rule['conditions'] as $condition) { - $match_array = []; - $field_content = $this->getObjectPathValue($item, explode('->',$condition['field'])); - preg_match('|'.$condition['content'].'|',$field_content,$match_array); - if(!empty($match_array)){ - $rule_applies = true; - } else { - $rule_applies = false; - break; + if (isset($this->parsed_data->document[0]->item) && is_iterable($this->parsed_data->document[0]->item)) { + foreach($this->parsed_data->document[0]->item as $key => $item) { + $rules_applied = []; + foreach($rules as $rule_key => $rule) { + $rule_applies = false; + if (array_key_exists('conditions', $rule)) { + foreach($rule['conditions'] as $condition) { + $match_array = []; + $field_content = $this->getObjectPathValue($item, explode('->',$condition['field'])); + preg_match('|'.$condition['content'].'|',$field_content,$match_array); + if(!empty($match_array)){ + $rule_applies = true; + } else { + $rule_applies = false; + break; + } + } } - } - if($rule_applies){ - foreach($rule['actions'] as $action) - { - $content_old = $this->getObjectPathValue($item, explode('->',$action['field'])); - $content_new = $content_old; - if(!empty($action['pattern'])) { - $content_preg = $this->getObjectPathValue($item, explode('->',$action['content_field'])); - $content_new = preg_replace('|'.$action['pattern'].'|', $action['replacement'], $content_preg); - $this->setObjectPathValue($key, explode('->',$action['field'].'_org'), $content_old); - $this->setObjectPathValue($key, explode('->',$action['field']), $content_new); - } else if(isset($action['content'])){ - $content_new = preg_replace('|(.*)|', '$0', $action['content']); - $this->setObjectPathValue($key, explode('->',$action['field'].'_org'), $content_old); - $this->setObjectPathValue($key, explode('->',$action['field']), $content_new); - } else if(!empty($action['function'])) { - switch($action['function']) { - case 'removeItem' : - $this->parsed_data->document[0]->item[$key]->availabilityplus_org = $this->parsed_data->document[0]->item[$key]->availabilityplus; - unset($this->parsed_data->document[0]->item[$key]->availabilityplus); - break; - case 'adjustScore' : - if ($action['score']) { - $this->parsed_data->document[0]->item[$key]->availabilityplus->score_org = $this->parsed_data->document[0]->item[$key]->availabilityplus->score; - $this->parsed_data->document[0]->item[$key]->availabilityplus->score += $action['score']; - } - break; + if($rule_applies){ + foreach($rule['actions'] as $action) + { + $content_old = $this->getObjectPathValue($item, explode('->',$action['field'])); + $content_new = $content_old; + if(isset($action['pattern']) && !empty($action['pattern'])) { + $content_preg = $this->getObjectPathValue($item, explode('->',$action['content_field'])); + $content_new = preg_replace('|'.$action['pattern'].'|', $action['replacement'], $content_preg); + $this->setObjectPathValue($key, explode('->',$action['field'].'_org'), $content_old); + $this->setObjectPathValue($key, explode('->',$action['field']), $content_new); + } else if(isset($action['content'])){ + $content_new = preg_replace('|(.*)|', '$0', $action['content']); + $this->setObjectPathValue($key, explode('->',$action['field'].'_org'), $content_old); + $this->setObjectPathValue($key, explode('->',$action['field']), $content_new); + } else if(isset($action['function']) && !empty($action['function'])) { + switch($action['function']) { + case 'removeItem' : + $this->parsed_data->document[0]->item[$key]->availabilityplus_org = $this->parsed_data->document[0]->item[$key]->availabilityplus ?? null; + unset($this->parsed_data->document[0]->item[$key]->availabilityplus); + break; + case 'adjustScore' : + if (isset($action['score'])) { + $this->parsed_data->document[0]->item[$key]->availabilityplus->score_org = $this->parsed_data->document[0]->item[$key]->availabilityplus->score ?? 0; + $this->parsed_data->document[0]->item[$key]->availabilityplus->score += $action['score']; + } + break; + } } } - } - $rules_applied[$rule_key] = $rule; - } - } - if(!empty($rules_applied)) { - if(!empty($this->parsed_data->document[0]->item[$key]->availabilityplus)) { - $this->parsed_data->document[0]->item[$key]->availabilityplus->rules_applied = $rules_applied; - } else if(!empty($this->parsed_data->document[0]->item[$key]->availabilityplus_org)) { - $this->parsed_data->document[0]->item[$key]->availabilityplus_org->rules_applied = $rules_applied; + $rules_applied[$rule_key] = $rule; + } } + if(!empty($rules_applied)) { + if(isset($this->parsed_data->document[0]->item[$key]->availabilityplus) && !empty($this->parsed_data->document[0]->item[$key]->availabilityplus)) { + $this->parsed_data->document[0]->item[$key]->availabilityplus->rules_applied = $rules_applied; + } else if(isset($this->parsed_data->document[0]->item[$key]->availabilityplus_org) && !empty($this->parsed_data->document[0]->item[$key]->availabilityplus_org)) { + $this->parsed_data->document[0]->item[$key]->availabilityplus_org->rules_applied = $rules_applied; + } + } } } } protected function getObjectPathValue($item, $path) { - $content = ''; - switch(count($path)) { - case 1 : - $content = $item->{$path[0]}; - break; - case 2 : - $content = $item->{$path[0]}->{$path[1]}; - break; - case 3 : - $content = $item->{$path[0]}->{$path[1]}->{$path[2]}; - break; - case 4 : - $content = $item->{$path[0]}->{$path[1]}->{$path[2]}->{$path[3]}; - break; - case 5 : - $content = $item->{$path[0]}->{$path[1]}->{$path[2]}->{$path[3]}->{$path[4]}; - break; + while ($property = array_shift($path)) { + $item = $item->$property ?? null; } - return $content; + return $item ?? ''; } protected function setObjectPathValue($key, $path, $value) { - switch(count($path)) { - case 1 : - $this->parsed_data->document[0]->item[$key]->{$path[0]} = $value; - break; - case 2 : - $this->parsed_data->document[0]->item[$key]->{$path[0]}->{$path[1]} = $value; - break; - case 3 : - $this->parsed_data->document[0]->item[$key]->{$path[0]}->{$path[1]}->{$path[2]} = $value; - break; - case 4 : - $this->parsed_data->document[0]->item[$key]->{$path[0]}->{$path[1]}->{$path[2]}->{$path[3]} = $value; - break; - case 5 : - $this->parsed_data->document[0]->item[$key]->{$path[0]}->{$path[1]}->{$path[2]}->{$path[3]}->{$path[4]} = $value; - break; - case 6 : - $this->parsed_data->document[0]->item[$key]->{$path[0]}->{$path[1]}->{$path[2]}->{$path[3]}->{$path[4]}->{$path[5]} = $value; - break; + $item = $this->parsed_data->document[0]->item[$key]; + while ($property = array_shift($path)) { + if ((!isset($item->$property) || !is_object($item->$property)) && count($path) > 0) { + $item->$property = new stdClass; + } + if (count($path) > 0) { + $item = $item->$property; + } else { + $item->$property = $value; + } } } protected function determineBestItem(){ - foreach($this->parsed_data->document[0]->item as $key => $item) { - if(empty($this->parsed_data->best_item) || (!empty($item->availabilityplus->score) && $item->availabilityplus->score < $this->parsed_data->best_item->availabilityplus->score)) { - $this->parsed_data->best_item = $this->parsed_data->document[0]->item[$key]; + if (isset($this->parsed_data->document[0]->item) && is_iterable($this->parsed_data->document[0]->item)) { + foreach($this->parsed_data->document[0]->item as $key => $item) { + if(empty($this->parsed_data->best_item) || (!empty($item->availabilityplus->score) && $item->availabilityplus->score < $this->parsed_data->best_item->availabilityplus->score)) { + $this->parsed_data->best_item = $this->parsed_data->document[0]->item[$key]; + } } } - } - protected function generateOrderLink ($action, $doc_id, $item_id, $storage_id) { + protected function generateOrderLink($action, $doc_id, $item_id, $storage_id) { $id = substr($doc_id, strrpos($doc_id, ":") + 1); $hmacKeys = explode(':','id:item_id:doc_id'); $hmacPairs = [ @@ -428,7 +387,7 @@ protected function generateOrderLink ($action, $doc_id, $item_id, $storage_id) { 'doc_id' => $doc_id, 'item_id' => $item_id ]; - return '/vufind/Record/'.$id.'/Hold?doc_id='.urlencode($doc_id).'&item_id='.urlencode($item_id).'&type='.$action.'&storage_id='.urlencode($storage_id).'&hashKey='.$this->hmac->generate($hmacKeys,$hmacPairs); + return '/vufind/Record/'.$id.'/Hold?doc_id='.urlencode($doc_id).'&item_id='.urlencode($item_id).'&type='.$action.'&storage_id='.urlencode($storage_id).'&hashKey='.$this->hmac->generate($hmacKeys, $hmacPairs); } } diff --git a/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/JournalsOnlinePrintElectronic.php b/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/JournalsOnlinePrintElectronic.php index a20f7d0c0..127f23b84 100644 --- a/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/JournalsOnlinePrintElectronic.php +++ b/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/JournalsOnlinePrintElectronic.php @@ -19,7 +19,7 @@ public function parseLinks($data_org) $urls = []; // to check for duplicate urls $records = []; // array to return $data = @simplexml_load_string($data_org, "SimpleXMLElement", LIBXML_COMPACT); - foreach($data->Full->ElectronicData->ResultList->Result AS $result) { + foreach($data->Full->ElectronicData->ResultList->Result as $result) { if(!empty($result->AccessURL)) { $level = ''; $label = ''; diff --git a/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/Unpaywall.php b/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/Unpaywall.php index 91718ca26..d7afcac69 100644 --- a/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/Unpaywall.php +++ b/module/AvailabilityPlus/src/AvailabilityPlus/Resolver/Driver/Unpaywall.php @@ -15,9 +15,11 @@ class Unpaywall extends AvailabilityPlusResolver */ public function getResolverUrl($params) { - $doi = str_replace('?doi=','',$params); - if($doi) $url = $this->baseUrl.'/'.$doi.'?is_oa=boolean'.$this->additionalParams; - return $url; + $doi = str_replace('?doi=', '', $params); + if(strlen($doi) > 0) { + $url = $this->baseUrl.'/'.$doi.'?is_oa=boolean'.$this->additionalParams; + } + return $url ?? ''; } /** @@ -32,11 +34,10 @@ public function getResolverUrl($params) */ public function parseLinks($data_org) { - $urls = []; // to check for duplicate urls $links = []; // array to return $data = json_decode($data_org); - if(isset($data->is_oa) && $data->is_oa == true && isset($data->best_oa_location->version) && $data->best_oa_location->version == 'publishedVersion'){ + if (isset($data->is_oa) && $data->is_oa == true && isset($data->best_oa_location->version) && $data->best_oa_location->version == 'publishedVersion') { $links[0]['url'] = $data->best_oa_location->url; $links[0]['label'] = 'FreeAccess'; $links[0]['level'] = 'FreeAccess Unpaywall'; @@ -49,4 +50,3 @@ public function parseLinks($data_org) return $response; } } - diff --git a/themes/availabilityplus/templates/RecordDriver/SolrDefault/availabilityplus-result-list.phtml b/themes/availabilityplus/templates/RecordDriver/SolrDefault/availabilityplus-result-list.phtml index a744cacef..4c5adf37d 100755 --- a/themes/availabilityplus/templates/RecordDriver/SolrDefault/availabilityplus-result-list.phtml +++ b/themes/availabilityplus/templates/RecordDriver/SolrDefault/availabilityplus-result-list.phtml @@ -2,8 +2,8 @@ - +
=$this->transEsc('DebugView')?> - } ?> + diff --git a/themes/availabilityplus/templates/ajax/debug.phtml b/themes/availabilityplus/templates/ajax/debug.phtml index c2ba422c4..8e3a5bf52 100755 --- a/themes/availabilityplus/templates/ajax/debug.phtml +++ b/themes/availabilityplus/templates/ajax/debug.phtml @@ -1,9 +1,9 @@ '; - if($debug['check_type']) echo $debug['check_type'].' - '; - echo $debug['check']; - if(!empty($debug['SolrMarcKey']) && $debug['check'] !== $debug['SolrMarcKey']) echo ' - SorlMarcKey: '.$debug['SolrMarcKey']; - if(!empty($debug['status'])) echo ' - '.$this->transEsc($debug['status']['label']).''; + if(isset($debug['check_type'])) echo $debug['check_type'].' - '; + if(isset($debug['check'])) echo $debug['check']; + if(isset($debug['SolrMarcKey']) && !empty($debug['SolrMarcKey']) && isset($debug['check']) && $debug['check'] !== $debug['SolrMarcKey']) echo ' - SorlMarcKey: '.$debug['SolrMarcKey']; + if(isset($debug['status']) && !empty($debug['status']) && array_key_exists('level', $debug['status']) && array_key_exists('label', $debug['status'])) echo ' - '.$this->transEsc($debug['status']['label']).''; echo ''; echo '