Esempio n. 1
0
 static function getLibraryForLocation($locationId)
 {
     if (isset($locationId)) {
         $libLookup = new Library();
         require_once ROOT_DIR . '/Drivers/marmot_inc/Location.php';
         $libLookup->whereAdd('libraryId = (SELECT libraryId FROM location WHERE locationId = ' . $libLookup->escape($locationId) . ')');
         $libLookup->find();
         if ($libLookup->N > 0) {
             $libLookup->fetch();
             return clone $libLookup;
         }
     }
     return null;
 }
Esempio n. 2
0
/**
 * Update the configuration array as needed based on scoping rules defined
 * by the subdomain.
 *
 * @param array $configArray the existing main configuration options.
 *
 * @return array the configuration options adjusted based on the scoping rules.
 */
function updateConfigForScoping($configArray)
{
    global $timer;
    //Get the subdomain for the request
    global $serverName;
    //split the servername based on
    global $subdomain;
    $subdomain = null;
    if (strpos($_SERVER['SERVER_NAME'], '.')) {
        $serverComponents = explode('.', $_SERVER['SERVER_NAME']);
        if (count($serverComponents) >= 3) {
            //URL is probably of the form subdomain.marmot.org or subdomain.opac.marmot.org
            $subdomain = $serverComponents[0];
        } else {
            if (count($serverComponents) == 2) {
                //URL could be either subdomain.localhost or marmot.org. Only use the subdomain
                //If the second component is localhost.
                if (strcasecmp($serverComponents[1], 'localhost') == 0) {
                    $subdomain = $serverComponents[0];
                }
            }
        }
        //Trim off test indicator when doing lookups for library/location
        if (substr($subdomain, -1) == '2' || substr($subdomain, -1) == '3') {
            $subdomain = substr($subdomain, 0, -1);
        }
    }
    $timer->logTime('got subdomain');
    //Load the library system information
    global $library;
    global $locationSingleton;
    if (isset($_SESSION['library']) && isset($_SESSION['location'])) {
        $library = $_SESSION['library'];
        $locationSingleton = $_SESSION['library'];
    } else {
        $Library = new Library();
        $Library->whereAdd("subdomain = '{$subdomain}'");
        $Library->find();
        if ($Library->N == 1) {
            $Library->fetch();
            //Make the library information global so we can work with it later.
            $library = $Library;
        } else {
            //The subdomain can also indicate a location.
            $Location = new Location();
            $Location->whereAdd("code = '{$subdomain}'");
            $Location->find();
            if ($Location->N == 1) {
                $Location->fetch();
                //We found a location for the subdomain, get the library.
                /** @var Library $librarySingleton */
                global $librarySingleton;
                $library = $librarySingleton->getLibraryForLocation($Location->locationId);
                $locationSingleton->setActiveLocation(clone $Location);
            } else {
                //Check to see if there is only one library in the system
                $Library = new Library();
                $Library->find();
                if ($Library->N == 1) {
                    $Library->fetch();
                    $library = $Library;
                }
            }
        }
    }
    if (isset($library) && $library != null) {
        //Update the title
        $configArray['Site']['theme'] = $library->themeName . ',' . $configArray['Site']['theme'] . ',default';
        $configArray['Site']['title'] = $library->displayName;
        $location = $locationSingleton->getActiveLocation();
        //Add an extra css file for the location if it exists.
        $themes = explode(',', $library->themeName);
        foreach ($themes as $themeName) {
            if ($location != null && file_exists('./interface/themes/' . $themeName . '/images/' . $location->code . '_logo_responsive.png')) {
                $configArray['Site']['responsiveLogo'] = '/interface/themes/' . $themeName . '/images/' . $location->code . '_logo_responsive.png';
            }
            if ($subdomain != null && file_exists('./interface/themes/' . $themeName . '/images/' . $subdomain . '_logo_responsive.png')) {
                $configArray['Site']['responsiveLogo'] = '/interface/themes/' . $themeName . '/images/' . $subdomain . '_logo_responsive.png';
            }
            if ($location != null && file_exists('./interface/themes/' . $themeName . '/images/' . $location->code . '_logo_small.png')) {
                $configArray['Site']['smallLogo'] = '/interface/themes/' . $themeName . '/images/' . $location->code . '_logo_small.png';
            }
            if ($location != null && file_exists('./interface/themes/' . $themeName . '/images/' . $location->code . '_logo_large.png')) {
                $configArray['Site']['largeLogo'] = '/interface/themes/' . $themeName . '/images/' . $location->code . '_logo_large.png';
            }
        }
    }
    $timer->logTime('finished update config for scoping');
    return $configArray;
}
 public function getItemsFast()
 {
     global $configArray;
     if ($this->fastItems == null) {
         $searchLibrary = Library::getSearchLibrary();
         if ($searchLibrary) {
             $libraryLocationCode = $searchLibrary->ilsCode;
         }
         $searchLocation = Location::getSearchLocation();
         if ($searchLocation) {
             $homeLocationCode = $searchLocation->code;
         } else {
             $homeLocation = Location::getUserHomeLocation();
             if ($homeLocation) {
                 $homeLocationCode = $homeLocation->code;
             }
         }
         $this->fastItems = array();
         if ($this->itemsFromIndex) {
             $this->fastItems = array();
             foreach ($this->itemsFromIndex as $itemData) {
                 $isLocalItem = false;
                 $isLibraryItem = false;
                 if (array_key_exists('item', $itemData)) {
                     $itemId = $itemData['item'][0];
                     $locationCode = $itemData['item'][1];
                     $shelfLocation = mapValue('shelf_location', $locationCode);
                     $sharing = $itemData['item'][3];
                     $source = $itemData['item'][4];
                     $fileOrUrl = '';
                     if (count($itemData['item']) > 5) {
                         $fileOrUrl = $itemData['item'][5];
                     }
                     if (array_key_exists('scope', $itemData)) {
                         $isLocalItem = $itemData['scope'][1] == 'true';
                         $isLibraryItem = $itemData['scope'][2] == 'true';
                     }
                 } else {
                     $itemId = $itemData[1];
                     $locationCode = $itemData[2];
                     $shelfLocation = mapValue('shelf_location', $itemData[2]);
                     $sharing = $itemData[4];
                     $source = $itemData[5];
                     $fileOrUrl = '';
                     if (count($itemData) > 6) {
                         $fileOrUrl = $itemData[6];
                     }
                     $isLocalItem = isset($libraryLocationCode) && strlen($libraryLocationCode) > 0 && strpos($locationCode, $libraryLocationCode) === 0;
                     $isLibraryItem = isset($homeLocationCode) && strlen($homeLocationCode) > 0 && strpos($locationCode, $homeLocationCode) === 0;
                 }
                 $actions = $this->getActionsForItem($itemId, $fileOrUrl, null);
                 $libraryLabelObj = new Library();
                 $libraryLabelObj->whereAdd("'{$locationCode}' LIKE CONCAT(ilsCode, '%') and ilsCode <> ''");
                 $libraryLabelObj->selectAdd();
                 $libraryLabelObj->selectAdd('displayName');
                 if ($libraryLabelObj->find(true)) {
                     $libraryLabel = $libraryLabelObj->displayName;
                 } else {
                     $libraryLabel = $locationCode . ' Online';
                 }
                 //TODO: Get the correct number of available copies
                 $totalCopies = 1;
                 $this->fastItems[] = array('itemId' => $itemId, 'location' => $locationCode, 'callnumber' => '', 'availability' => $this->isItemAvailable($itemId, $totalCopies), 'holdable' => $this->isEContentHoldable($locationCode, $itemData), 'inLibraryUseOnly' => false, 'isLocalItem' => $isLocalItem, 'isLibraryItem' => $isLibraryItem, 'locationLabel' => 'Online', 'libraryLabel' => $libraryLabel, 'shelfLocation' => $shelfLocation, 'source' => 'Online ' . $source, 'sharing' => $sharing, 'actions' => $actions);
             }
         } else {
             /** @var File_MARC_Data_Field[] $itemFields */
             $itemFields = $this->getMarcRecord()->getFields('989');
             foreach ($itemFields as $itemField) {
                 $locationCode = trim($itemField->getSubfield('d') != null ? $itemField->getSubfield('d')->getData() : '');
                 //Each item can have multiple item fields
                 /** @var File_MARC_Subfield[] $eContentFields */
                 $eContentFields = $itemField->getSubfields('w');
                 $itemId = $itemField->getSubfield('1')->getData();
                 $iType = $itemField->getSubfield($configArray['Reindex']['iTypeSubfield'])->getData();
                 foreach ($eContentFields as $eContentField) {
                     $eContentData = trim($eContentField->getData() != null ? $eContentField->getData() : '');
                     if ($eContentData && strpos($eContentData, ':') > 0) {
                         $eContentFieldData = explode(':', $eContentData);
                         $source = trim($eContentFieldData[0]);
                         $protectionType = strtolower(trim($eContentFieldData[1]));
                         $totalCopies = 1;
                         if ($this->isValidProtectionType($protectionType)) {
                             if ($this->isValidForUser($locationCode, $eContentFieldData)) {
                                 $libraryLabelObj = new Library();
                                 $libraryLabelObj->whereAdd("'{$locationCode}' LIKE CONCAT(ilsCode, '%') and ilsCode <> ''");
                                 $libraryLabelObj->selectAdd();
                                 $libraryLabelObj->selectAdd('displayName');
                                 if ($libraryLabelObj->find(true)) {
                                     $libraryLabel = $libraryLabelObj->displayName;
                                 } else {
                                     $libraryLabel = $locationCode . ' Online';
                                 }
                                 $locationLabelObj = new Location();
                                 $locationLabelObj->whereAdd("'{$locationCode}' LIKE CONCAT(code, '%') and code <> ''");
                                 if ($locationLabelObj->find(true)) {
                                     $locationLabel = $locationLabelObj->displayName;
                                 } else {
                                     $locationLabel = $locationCode . ' Online';
                                 }
                                 //Get the file or url that is related to this item.
                                 $fileOrUrl = '';
                                 $acsId = null;
                                 if ($protectionType == 'external') {
                                     $urlSubfield = $itemField->getSubfield('u');
                                     if ($urlSubfield != null) {
                                         $fileOrUrl = $urlSubfield->getData();
                                     } else {
                                         //Get from the 856 field
                                         /** @var File_MARC_Data_Field[] $linkFields */
                                         $linkFields = $this->getMarcRecord()->getFields('856');
                                         foreach ($linkFields as $link) {
                                             $urlSubfield = $link->getSubfield('u');
                                             if ($urlSubfield != null) {
                                                 $fileOrUrl = $urlSubfield->getData();
                                             }
                                         }
                                     }
                                 } else {
                                     if (count($eContentFieldData) > 3) {
                                         $fileOrUrl = trim($eContentFieldData[3]);
                                     }
                                     if (count($eContentFieldData) > 4) {
                                         $acsId = trim($eContentFieldData[4]);
                                     }
                                     if (count($eContentFieldData) > 5) {
                                         $totalCopies = trim($eContentFieldData[5]);
                                     }
                                 }
                                 $fileOrUrl = trim($fileOrUrl);
                                 $actions = $this->getActionsForItem($itemId, $fileOrUrl, $acsId);
                                 $format = $this->getEContentFormat($fileOrUrl, $iType);
                                 $sharing = $this->getSharing($locationCode, $eContentFieldData);
                                 //Add an item
                                 $item = array('itemId' => $itemId, 'location' => $locationCode, 'locationLabel' => $locationLabel, 'libraryLabel' => $libraryLabel, 'callnumber' => '', 'availability' => $this->isItemAvailable($itemId, $totalCopies), 'holdable' => $this->isEContentHoldable($locationCode, $eContentFieldData), 'isLocalItem' => $this->isLocalItem($locationCode, $eContentFieldData), 'isLibraryItem' => $this->isLibraryItem($locationCode, $eContentFieldData), 'shelfLocation' => 'Online ' . $source, 'source' => $source, 'sharing' => $sharing, 'fileOrUrl' => $fileOrUrl, 'format' => $format, 'helpText' => $this->getHelpText($fileOrUrl), 'usageNotes' => $this->getUsageRestrictions($sharing, $libraryLabel, $locationLabel), 'formatNotes' => $this->getFormatNotes($fileOrUrl), 'size' => $this->getFileSize($fileOrUrl), 'actions' => $actions);
                                 $this->fastItems[] = $item;
                             }
                         }
                     }
                 }
             }
         }
     }
     return $this->fastItems;
 }
Esempio n. 4
0
 /**
  * Retrieve details about a record within prospector
  *
  * @param $record - The full record information from Prospector
  * @return Associative array with the record number in prospector and the list of libraries that own the title in prospector
  */
 function getProspectorDetailsForLocalRecord($record)
 {
     //Disable prospector details for now.
     return false;
     global $logger;
     //Check to see if one of our libraries has a copy in Prospector.
     $shortId = substr($record['id'], 1, -1);
     $library = new Library();
     $institutions = '';
     foreach ($record['institution'] as $institution) {
         if (strlen($institutions) > 0) {
             $institutions .= ', ';
         }
         $institutions .= "'" . mysql_escape_string($institution) . "'";
     }
     $library->whereAdd("facetLabel IN ({$institutions})");
     $library->whereAdd("prospectorCode != ''");
     $library->find();
     $results = array('recordId' => '', 'title' => $record['title'], 'author' => isset($record['author']) ? $record['author'] : null, 'numLibraries' => 0, 'owningLibraries' => array(), 'prospectorClassicUrl' => '', 'prospectorEncoreUrl' => '');
     if ($library->N > 0) {
         while ($library->fetch()) {
             $prospectorCode = $library->prospectorCode;
             //Call the url for the record using a local call number search
             $curl_url = "http://prospector.coalliance.org/search~S0?/z{$prospectorCode}+{$shortId}/z{$prospectorCode}+{$shortId}/1,1,1,B/detlframeset&FF=z{$prospectorCode}+{$shortId}";
             $cookieJar = tempnam("/tmp", "CURLCOOKIE");
             $logger->log('Loading page ' . $curl_url, PEAR_LOG_INFO);
             $curl_connection = curl_init($curl_url);
             curl_setopt($curl_connection, CURLOPT_CONNECTTIMEOUT, 30);
             curl_setopt($curl_connection, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
             curl_setopt($curl_connection, CURLOPT_RETURNTRANSFER, true);
             curl_setopt($curl_connection, CURLOPT_SSL_VERIFYPEER, false);
             curl_setopt($curl_connection, CURLOPT_FOLLOWLOCATION, 1);
             curl_setopt($curl_connection, CURLOPT_UNRESTRICTED_AUTH, true);
             curl_setopt($curl_connection, CURLOPT_COOKIEJAR, $cookieJar);
             curl_setopt($curl_connection, CURLOPT_COOKIESESSION, false);
             $sresult = curl_exec($curl_connection);
             //We are getting bad results from Prospector from some local call number searches
             if (preg_match('/Prehistoric Europe, from stone age man to the early Greeks/', $sresult)) {
                 continue;
             }
             //Parse the page to extract the owning libraries and the record id
             //Record Id can be extracted from the save link
             if (preg_match('/save=(.*?)"/s', $sresult, $matches)) {
                 $results['recordId'] = $matches[1];
             }
             //Owning libraries can be extracted with this regex
             $libraries = array();
             if (preg_match_all('/<tr class="holdings(.*?)"><td><a name="(.*?)"><\\/a>(.*?)<\\/td>/s', $sresult, $matches)) {
                 foreach ($matches[1] as $index => $libraryCode) {
                     $libraries[$libraryCode] = $matches[3][$index];
                 }
             } else {
                 $fineInfo = "";
             }
             $results['numLibraries'] = count($libraries);
             $results['owningLibraries'] = $libraries;
             $prospectorUrl = "http://prospector.coalliance.org/search~S0/.{$results['recordId']}/.{$results['recordId']}/1,1,1,B/frameset~.{$results['recordId']}";
             $results['prospectorClassicUrl'] = $prospectorUrl;
             $prospectorUrl = "http://encore.coalliance.org/iii/encore/record/C__R" . urlencode($results['recordId']) . "?lang=eng&amp;suite=def";
             $results['prospectorEncoreUrl'] = $prospectorUrl;
             $requestUrl = "http://encore.coalliance.org/iii/encore/InnreachRequestPage.external?lang=eng&sp=S" . urlencode($results['recordId']) . "&suite=def";
             $results['requestUrl'] = $requestUrl;
             break;
         }
     }
     return $results;
 }