Alma get live holdings availability for vufind
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
protected function curlMultiRequest($urls) { | |
$ch = array(); | |
$results = array(); | |
$mh = curl_multi_init(); | |
foreach($urls as $key => $val) { | |
$ch[$key] = curl_init(); | |
curl_setopt($ch[$key],CURLOPT_RETURNTRANSFER,1); | |
curl_setopt($ch[$key], CURLOPT_URL, $val); | |
//curl_setopt ($ch[$key], CURLOPT_FAILONERROR,1); | |
// follow line enables https | |
curl_setopt($ch[$key], CURLOPT_SSL_VERIFYPEER, false); | |
curl_multi_add_handle($mh, $ch[$key]); | |
} | |
$running = null; | |
do { | |
$status = curl_multi_exec($mh, $running); | |
$info = curl_multi_info_read($mh); | |
if ( $info['result'] != 0 ) { | |
//print_r($info); | |
} | |
} | |
while ($running > 0); | |
// Get content and remove handles. | |
foreach ($ch as $key => $val) { | |
$results[$key] = curl_multi_getcontent($val); | |
curl_multi_remove_handle($mh, $val); | |
} | |
curl_multi_close($mh); | |
return $results; | |
} | |
////////////////////////// | |
public function getHolding($id) { | |
$mmsid = $id; | |
$apikey = urlencode('xxxxxxxxxxxxxx'); | |
$baseurl = 'https://api-na.hosted.exlibrisgroup.com/almaws/v1/bibs/'; | |
$count=0; | |
$holdinglist = array(); // for holding the holdings | |
$items = array(); // what we will return | |
$urllist = array(); | |
// prepare loans url | |
$paramurl = '?apikey=' . $apikey; | |
$urllist['loans'] = $baseurl . urlencode($mmsid) . '/loans' . $paramurl; | |
// prepare holdings url | |
$suffixurl = '/holdings?apikey=' . $apikey; | |
$urllist['holdings'] = $baseurl . urlencode($mmsid) . $suffixurl; | |
// get loans and holdings from api | |
// returns an array, keys are loans/holdings. | |
// values are the xml responses | |
$results2 = $this->curlMultiRequest($urllist); | |
$loaninfo = array(); | |
// loans xml | |
$record = new SimpleXMLElement($results2["loans"]); | |
// process loans xml creating array with barcode as key | |
$loans = array(); | |
// if no loans there will be no item_loan | |
if ($record) { | |
foreach ($record->item_loan as $itemloan) { | |
$duedate = $itemloan->due_date; | |
$barcode = $itemloan->item_barcode; | |
$loans["$barcode"] = $duedate; | |
} | |
} | |
// now get each holdings id number | |
$record = new SimpleXMLElement($results2["holdings"]); | |
$holdinglist = array(); | |
$datafields = $record->xpath('/holdings/holding/holding_id'); | |
foreach ($datafields as $hid) { | |
$holdinglist[] = $hid; | |
} | |
// for each holdings, prepare urls | |
// GET /almaws/v1/bibs/{mms_id}/holdings/{holding_id}/items | |
$urllist = array(); | |
$paramurl = '/items?apikey=' . $apikey . '&limit=90'; | |
foreach ($holdinglist as $hid) { | |
$holdingsurl = '/holdings/' . urlencode($hid); | |
$urllist["$hid"] = $baseurl . urlencode($mmsid) . $holdingsurl . $paramurl; | |
} | |
// call each of the holdings urls at the same time | |
$results3 = $this->curlMultiRequest($urllist); | |
// for each holding id, get its items | |
$items = array(); | |
foreach ($holdinglist as $hid) { | |
//create xml object based on this holdings xml | |
$record = new SimpleXMLElement($results3["$hid"]); | |
$datafields = $record->xpath('/items/item'); | |
// for each item within this holding | |
foreach ($datafields as $item) { | |
$duedate = ""; | |
$barcode = (string) $item->item_data->barcode; | |
$items["$count"] = array(); | |
$items["$count"]["id"] = $mmsid; | |
$items["$count"]["barcode"] = $barcode; | |
$items["$count"]["number"] = $count; | |
$items["$count"]["item_id"] = $barcode; | |
$items["$count"]["availability"] = (string) $item->item_data->base_status; | |
if ($items["$count"]["availability"]) { | |
$items["$count"]["status"] = "Available"; | |
} else { | |
$items["$count"]["status"] = "Not Available"; | |
} | |
$items["$count"]["location"] = $item->item_data->library['desc'] . " - " . (string) $item->item_data->location['desc']; | |
$items["$count"]["callnumber"] = (string) $item->holding_data->call_number; | |
$items["$count"]["reserve"] = "0"; | |
if (isset($loans["$barcode"])) { | |
$duedate = (string) $loans["$barcode"]; | |
} | |
if ($duedate) { | |
// ISO 8601 | |
$items["$count"]["duedate"] = date('l jS F Y', strtotime($duedate)); | |
} | |
$count++; | |
} | |
} | |
return $items; | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment