/** * Protected method for vufind (i.e. User) defined holds * * @param string $id A Bib ID * @param string $type The holds mode to be applied from: * (disabled, always, availability, driver) * @param array $patron Patron * * @return mixed A url on success, boolean false on failure */ protected function generateHold($id, $type, $patron) { $any_available = false; $addlink = false; $data = ['id' => $id, 'level' => 'title']; // Are holds allows? $checkHolds = $this->catalog->checkFunction('Holds', compact('id', 'patron')); if ($checkHolds != false) { if ($type == 'always') { $addlink = true; } elseif ($type == 'availability') { $holdings = $this->getHoldings($id); foreach ($holdings as $holding) { if ($holding['availability'] && !in_array($holding['location'], $this->hideHoldings)) { $any_available = true; } } $addlink = !$any_available; } if ($addlink) { if ($checkHolds['function'] == 'getHoldLink') { // Return opac link return $this->catalog->getHoldLink($id, $data); } else { // Return non-opac link return $this->getHoldDetails($data, $checkHolds['HMACKeys']); } } } return false; }
/** * Protected method for vufind (i.e. User) defined holdings * * @param array $result A result set returned from a driver * @param string $type The holds mode to be applied from: * (all, holds, recalls, availability) * @param array $holdConfig Hold configuration from driver * * @return array A sorted results set */ protected function generateHoldings($result, $type, $holdConfig) { $holdings = []; $any_available = false; $holds_override = isset($this->config->Catalog->allow_holds_override) ? $this->config->Catalog->allow_holds_override : false; if (count($result)) { foreach ($result as $copy) { $show = !in_array($copy['location'], $this->hideHoldings); if ($show) { $groupKey = $this->getHoldingsGroupKey($copy); $holdings[$groupKey][] = $copy; // Are any copies available? if ($copy['availability'] == true) { $any_available = true; } } } if ($holdConfig && is_array($holdings)) { // Generate Links // Loop through each holding foreach ($holdings as $location_key => $location) { foreach ($location as $copy_key => $copy) { // Override the default hold behavior with a value from // the ILS driver if allowed and applicable: $currentType = $holds_override && isset($copy['holdOverride']) ? $copy['holdOverride'] : $type; switch ($currentType) { case "all": $addlink = true; // always provide link break; case "holds": $addlink = $copy['availability']; break; case "recalls": $addlink = !$copy['availability']; break; case "availability": $addlink = !$copy['availability'] && $any_available == false; break; default: $addlink = false; break; } // If a valid holdable status has been set, use it to // determine if a hold link is created $addlink = isset($copy['is_holdable']) ? $addlink && $copy['is_holdable'] : $addlink; if ($addlink) { if ($holdConfig['function'] == "getHoldLink") { /* Build opac link */ $holdings[$location_key][$copy_key]['link'] = $this->catalog->getHoldLink($copy['id'], $copy); } else { /* Build non-opac link */ $holdings[$location_key][$copy_key]['link'] = $this->getRequestDetails($copy, $holdConfig['HMACKeys'], 'Hold'); } } } } } } return $holdings; }