10, 20 => 20, 30 => 30, 40 => 40, 50 => 50, ); /** * Sort options * global array. */ private static $sort_options = array( 'relevance' => 'Relevance', 'date_desc' => 'Date Descending', 'date_asc' => 'Date Ascending', ); /** * Amount options * global array. */ private static $amount_options = array( 'detailed' => 'Detailed', 'brief' => 'Brief', 'title' => 'Title Only', ); /** * Bool options * global array. */ private static $bool_options = array( 'AND' => 'All terms', 'OR' => 'Any terms', 'NOT' => 'No terms', ); /** * Search mode options * global array. */ private static $mode_options = array( 'all' => 'All search terms', 'bool' => 'Boolean / Phrase', 'any' => 'Any search terms', 'smart' => 'SmartText Searching', ); /** * Basic search type options * global array. */ private static $basic_search_type_options = array( 'AllFields' => 'All Text', 'Title' => 'Title', 'Author' => 'Author', 'Subject' => 'Subject terms', 'Source' => 'Source', 'Abstract' => 'Abstract', ); /** * Advanced search type options * global array. */ private static $advanced_search_type_options = array( 'AllFields' => 'All Text', 'Title' => 'Title', 'Author' => 'Author', 'Subject' => 'Subject terms', 'Source' => 'Journal Title/Source', 'Abstract' => 'Abstract', 'ISBN' => 'ISBN', 'ISSN' => 'ISSN', ); private $local_ips = ""; /** * Constructor. * * @param array $data * Raw data from the EBSCO search representing the record. */ public function __construct($params = NULL) { $this->eds = new EBSCOAPI(array( 'password' => variable_get('ebsco_password'), 'user' => variable_get('ebsco_user'), 'profile' => variable_get('ebsco_profile'), 'interface' => variable_get('ebsco_interface'), 'organization' => variable_get('ebsco_organization'), 'local_ip_address' => variable_get('ebsco_local_ips'), 'guest' => variable_get('ebsco_guest'), 'log' => variable_get('ebsco_log'), )); $this->params = $params ? $params : $_REQUEST; $this->limit = variable_get('ebsco_default_limit') ? variable_get('ebsco_default_limit') : $this->limit; $this->amount = variable_get('ebsco_default_amount') ? variable_get('ebsco_default_amount') : $this->amount; } /** * Perform the API Info call. * * @return array */ public function info() { $this->info = $this->eds->apiInfo(); return $this->info; } /** * Perform the API Retrieve call. * * @return array */ public function retrieve() { list($an, $db) = isset($this->params['id']) ? explode('|', $this->params['id'], 2) : array(NULL, NULL); $this->result = $this->eds->apiRetrieve($an, $db); return $this->result; } /** * Perform the API Search call. * * @return array */ public function search() { $search = array(); if (isset($this->params['lookfor']) && isset($this->params['type'])) { $search = array( 'lookfor' => $this->params['lookfor'], 'index' => $this->params['type'], ); } elseif (isset($this->params['group'])) { $search = $this->params; } else { return array(); } $filter = isset($this->params['filter']) ? $this->params['filter'] : array(); $page = isset($this->params['page']) ? $this->params['page'] + 1 : 1; $limit = $this->limit; $sort = isset($this->params['sort']) ? $this->params['sort'] : 'relevance'; $amount = isset($this->params['amount']) ? $this->params['amount'] : 'brief'; $mode = isset($this->params['mode']) ? $this->params['mode'] : 'all'; // Check if research starters , EMP are active. $info = $this->info(); $rs = FALSE; $emp = FALSE; if ($info["relatedContent"]) { foreach ($info["relatedContent"] as $related) { if (($related["Type"] == "rs") and ($related["DefaultOn"] == "y")) { $rs = TRUE; } if (($related["Type"] == "emp") and ($related["DefaultOn"] == "y")) { $emp = TRUE; } } } $autosug = FALSE; if ($info["didYouMean"]) { if ($info["didYouMean"][0]["DefaultOn"] == "y") { $autosug = TRUE; } } $this->results = $this->eds->apiSearch($search, $filter, $page, $limit, $sort, $amount, $mode, $rs, $emp, $autosug); return $this->results; } /** * Get the EBSCORecord model for the result. * * * @return array. */ public function record() { if (empty($this->record) && !(empty($this->result))) { $this->record = new EBSCORecord($this->result); } return $this->record; } /** * Get the EBSCORecord models array from results array. * * * @return array. */ public function records() { if ($this->record instanceof EBSCOException) { return NULL; } if ($this->results instanceof EBSCOException) { return NULL; } if (empty($this->records) && !(empty($this->results))) { foreach ($this->results['documents'] as $result) { $this->records[] = new EBSCORecord($result); } } return $this->records; } /** * */ public function relatedContent() { if ($this->results instanceof EBSCOException) { return NULL; } $this->relatedContent = isset($this->results['relatedContent']) ? $this->results['relatedContent'] : array(); return $this->relatedContent; } /** * */ public function autoSuggestTerms() { $this->autoSuggestTerms = isset($this->results['autoSuggestTerms']) ? $this->results['autoSuggestTerms'] : NULL; return $this->autoSuggestTerms; } /** * Get the pagination HTML string. * * * @return HTML string. */ public function pager() { $pager = NULL; try { if ($this->has_records()) { pager_default_initialize($this->record_count() / $this->limit, 1); $pager = theme('pager', array('tags' => NULL, 'quantity' => self::$page_links)); $pager = preg_replace('/
  • (.*)<\/li>/', '', $pager); } } catch (Exception $e) { } return $pager; } /******************************************************** * * Getters (class methods) * ********************************************************/ /** * Getter for sort options. * * @return array */ public static function limit_options() { return self::$limit_options; } /** * Getter for sort options. * * @return array */ public static function sort_options() { return self::$sort_options; } /** * Getter for amount options. * * @return array */ public static function amount_options() { return self::$amount_options; } /** * Getter for boolean options. * * @return array */ public static function bool_options() { return self::$bool_options; } /** * Getter for search mode options. * * @return array */ public static function mode_options() { return self::$mode_options; } /** * Getter for Basic search type options. * * @return array */ public static function basic_search_type_options() { return self::$basic_search_type_options; } /** * Getter for Advanced search type options. * * @return array */ public static function advanced_search_type_options() { return self::$advanced_search_type_options; } /******************************************************** * * Helper methods * ********************************************************/ /** * Get the expanders. * * @return array */ public function expanders() { $expanders = array(); try { if ($this->info instanceof EBSCOException) { return $expanders; } $actions = array(); $filters = $this->filters(); foreach ($filters as $filter) { $actions[] = $filter['action']; } $expanders = isset($this->info['expanders']) ? $this->info['expanders'] : array(); foreach ($expanders as $key => $expander) { if (in_array($expander['Action'], $actions)) { $expanders[$key]['selected'] = TRUE; } } } catch (Exception $e) { } return $expanders; } /** * Get the facets. * * @return array */ public function facets() { if ($this->results instanceof EBSCOException) { return array(); } $actions = array(); foreach ($this->filters as $filter) { $actions[] = $filter['action']; } $facets = isset($this->results['facets']) ? $this->results['facets'] : array(); foreach ($facets as $key => $cluster) { foreach ($cluster['Values'] as $k => $facet) { $is_applied = FALSE; if (in_array($facet['Action'], $actions)) { $is_applied = TRUE; } $facets[$key]['Values'][$k]['applied'] = $is_applied; } } return $facets; } /** * Get the filters. * * @return array */ public function filters() { if (!empty($_REQUEST['filter'])) { $labels = array(); foreach ($this->info['limiters'] as $limiter) { $labels[$limiter['Id']] = $limiter['Label']; } $this->filters = array(); foreach ($_REQUEST['filter'] as $filter) { if (!empty($filter)) { $temp = str_replace(array('addfacetfilter(', 'addlimiter(', 'addexpander('), array('', '', ''), $filter); if (substr($temp, -1, 1) == ')') { $temp = substr($temp, 0, -1); } // Do not display addfacetfilter, addlimiter or addexpander strings. if (preg_match('/\:/', $filter)) { list($field, $value) = explode(':', $temp, 2); $displayField = isset($labels[$field]) ? $labels[$field] : $field; $displayValue = $value == 'y' ? 'yes' : $value; } elseif (preg_match('/addexpander/', $filter)) { $field = $temp; $value = 'y'; $displayField = isset($labels[$field]) ? $labels[$field] : $field; $displayValue = 'yes'; } else { $field = $value = $displayField = $displayValue = $filter; } $this->filters[] = array( 'field' => $field, 'value' => $value, 'action' => $filter, 'displayField' => $displayField, 'displayValue' => $displayValue, ); } } } return $this->filters; } /** * Get the limiters. * * @return array */ public function limiters() { $actions = array(); $ids = array(); if ($this->info instanceof EBSCOException) { return array(); } $filters = $this->filters(); foreach ($filters as $filter) { $actions[] = $filter['action']; $ids[] = $filter['field']; } $limiters = isset($this->info['limiters']) ? $this->info['limiters'] : array(); foreach ($limiters as $key => $cluster) { // Multi select limiter. if (!empty($cluster['Values'])) { foreach ($cluster['Values'] as $limiter) { $action = $limiter['Action']; if (in_array($action, $actions)) { $limiters[$key]['selected'][] = $limiter['Action']; } } // Date limiter. } elseif ($cluster['Type'] == 'ymrange') { $id = $cluster['Id']; if (($k = array_search($id, $ids)) !== FALSE) { $limiters[$key]['selected'] = $filters[$k]['action']; } // Other limiters. } else { $action = str_replace('value', 'y', $cluster['Action']); if (in_array($action, $actions)) { $limiters[$key]['selected'] = TRUE; } } } return $limiters; } /** * Get the total number of records. * * @return int */ public function record_count() { if ($this->results instanceof EBSCOException) { return 0; } return !empty($this->results) ? $this->results['recordCount'] : 0; } /** * Get the number of end record. * * @return int */ public function record_end() { if ($this->results instanceof EBSCOException) { return -1; } $count = !empty($this->results) ? count($this->results['documents']) : 0; $start = !empty($this->results) ? $this->results['start'] : 0; return $start + $count; } /** * Get the number of start record. * * @return int */ public function record_start() { if ($this->results instanceof EBSCOException) { return NULL; } return !empty($this->results) ? $this->results['start'] + 1 : 0; } /** * Get the search time. * * @return decimal number */ public function search_time() { if ($this->results instanceof EBSCOException) { return 0; } return !empty($this->results) && isset($this->results['searchTime']) ? $this->results['searchTime'] : 0; } /** * Get the search view : basic or advanced. * * @return string */ public function search_view() { if (isset($_REQUEST['group'])) { return 'advanced'; } else { return 'basic'; } } /** * Hidden params used by UpdateForm. * * @return array */ public function search_params() { $params = $this->link_search_params(); // Filter the params that have same values as sidebar checkboxes, otherwise they will produce duplicates. $not_allowed_values = array( 'addexpander(thesaurus)', 'addexpander(fulltext)', 'addlimiter(FT:y)', 'addlimiter(RV:y)', 'addlimiter(SO:y)', ); $params = $this->array_filter_recursive($params, function ($item) use ($not_allowed_values) { return !($item && in_array($item, $not_allowed_values)); }); return array_filter($params); } /** * Hidden params used by UpdateForm. * * @return array */ public function link_search_params() { // Filter the page parameter. $not_allowed_keys = array('page', 'ui', 'has_js', 'op', 'submit', 'form_id', 'form_build_id'); $query = ""; if (isset($_SERVER['QUERY_STRING'])) { $query = urldecode($_SERVER['QUERY_STRING']); } parse_str($query, $params); $params = $this->array_unset_recursive($params, $not_allowed_keys); return $params; } /** * Check if there are records in results array. * * * @return boolean. */ public function has_records() { if ($this->results instanceof EBSCOException) { return FALSE; } return !empty($this->results) && !empty($this->results['documents']); } /** * Create the last search data. * * @return void */ public function search_create($query = NULL) { if ($this->results instanceof EBSCOException) { return array(); } $last_search = array(); if (!empty($this->results)) { $results_identifiers = array(); foreach ($this->results['documents'] as $result) { $results_identifiers[] = $result['id']; } $last_search['query'] = $query ? $query : $_SERVER['QUERY_STRING']; $last_search['records'] = serialize($results_identifiers); $last_search['count'] = $this->record_count(); } return $last_search; } /** * Save last search data in session. * * @return void */ public function search_write($query = NULL) { $_SESSION['EBSCO']['last-search'] = $this->search_create($query); } /** * Load last search data from session. * * @return array */ public function search_read($id = NULL, $op = NULL) { $params = array(); $lastSearch = $_SESSION['EBSCO']['last-search']; if ($lastSearch) { $lastSearch['records'] = unserialize($lastSearch['records']); if ($id) { parse_str($lastSearch['query'], $params); $params['page'] = (int) (isset($params['page']) ? $params['page'] : 0); $index = array_search($id, $lastSearch['records']); // If this is not the first scroll and if this is not a page refresh. if (isset($lastSearch['current']) && $lastSearch['current'] != $id) { // If we change page. if (($op == 'Next' && $index % $this->limit === 0) || ($op == 'Previous' && $index % $this->limit === 9)) { $params['page'] = ($op == 'Next') ? $params['page'] + 1 : $params['page'] - 1; $query = drupal_http_build_query($params); $lastSearch['query'] = $_SESSION['EBSCO']['last-search']['query'] = $query; } } $start = $params['page']; if (count($lastSearch['records']) > 10) { $records = array_slice($lastSearch['records'], $index - $index % $this->limit, $this->limit); } else { $records = $lastSearch['records']; } if (!isset($lastSearch['records'][$index + 1])) { $params['page'] += 1; $driver = new EBSCODocument($params); $driver->search(); $query = drupal_http_build_query($params); $newSearch = $driver->search_create($query); $newSearch['records'] = unserialize($newSearch['records']); $lastSearch['records'] = array_merge($lastSearch['records'], $newSearch['records']); $_SESSION['EBSCO']['last-search']['records'] = serialize($lastSearch['records']); if ($op == 'Next') { $lastSearch['previous'] = isset($records[8]) ? $records[8] : ''; } $lastSearch['next'] = isset($newSearch['records'][0]) ? $newSearch['records'][0] : ''; } else { $lastSearch['next'] = $lastSearch['records'][$index + 1]; } if (!isset($lastSearch['records'][$index - 1])) { if ($params['page'] > 0) { $params['page'] -= 1; $driver = new EBSCODocument($params); $driver->search(); $query = drupal_http_build_query($params); $newSearch = $driver->search_create($query); $newSearch['records'] = unserialize($newSearch['records']); $lastSearch['records'] = array_merge($lastSearch['records'], $newSearch['records']); $_SESSION['EBSCO']['last-search']['records'] = serialize($lastSearch['records']); $lastSearch['previous'] = isset($newSearch['records'][9]) ? $newSearch['records'][9] : ''; if ($op == 'Previous') { $lastSearch['next'] = isset($records[1]) ? $records[1] : ''; } } else { $lastSearch['previous'] = ''; } } else { $lastSearch['previous'] = $lastSearch['records'][$index - 1]; } $lastSearch['current_index'] = $start * $this->limit + $index % $this->limit + 1; $lastSearch['current'] = $id; } } $_SESSION['EBSCO']['last-search']['current'] = $id; return $lastSearch; } /** * A recursive array_filter. * * @return array */ private function array_filter_recursive($input, $callback = NULL) { foreach ($input as &$value) { if (is_array($value)) { $value = $this->array_filter_recursive($value, $callback); } } return array_filter($input, $callback); } /** * Recursive filter an array using the given $keys. * * @return array */ private function array_unset_recursive($input, $keys) { foreach ($keys as $key) { if (isset($input[$key])) { unset($input[$key]); } } if (is_array($input)) { foreach ($input as $key => $value) { $input[$key] = is_array($value) ? $this->array_unset_recursive($value, $keys) : $value; } } return array_filter($input); } }