uid "; } $pager_attrib = array("sort" => variable_get('biblio_sort', 'year'), 'order' => variable_get('biblio_order', 'DESC')); $limits = null; if (isset($_GET['order'])) { $pager_attrib['order'] = ($_GET['order'] == 'desc') ? 'desc' : 'asc'; } if (isset($_GET['sort'])) { $pager_attrib['sort'] = check_plain($_GET['sort']); } switch ($pager_attrib['sort']) { case 'type': $sortby = "ORDER BY b.biblio_type %s, b.biblio_year DESC, SUBSTRING(n.title,1,1) ASC "; break; case 'title': $sortby = "ORDER BY SUBSTRING(n.title,1,1) %s, b.biblio_year DESC "; break; case 'author': /*$join[] = "inner join {biblio_has_author} as ha on a.aid = ha.aid"; $join[] = "inner join {biblio_author_index} as a on b.nid= ha.nid"; $sortby = " ORDER BY a.author %s "; $where[] = "ha.rank = 1 "; */ $sortby = "ORDER BY SUBSTRING(LTRIM(b.biblio_authors),1,1) %s, b.biblio_year DESC "; break; case 'keyword': // added msh 070808 $sortby = "ORDER BY SUBSTRING(LTRIM(b.biblio_keywords),1,4) %s, b.biblio_keywords ASC "; break; case 'year': default: $sortby = "ORDER BY b.biblio_year %s, b.biblio_date DESC, SUBSTRING(n.title,1,1) ASC, b.biblio_type ASC "; } //end switch if (!isset($_SESSION['biblio_filter']) || !is_array($_SESSION['biblio_filter'])) { $_SESSION['biblio_filter'] = array(); } $session = &$_SESSION['biblio_filter']; $numargs = func_num_args(); $arg_list = func_get_args(); foreach ($session as $filter) { $arg_list = array_merge($arg_list, $filter); } if (count($arg_list) >= 2) { $args = array(); while ($arg_list) { $type = $arg_list[0]; array_shift($arg_list); $operator = ($operator)?$operator:" AND "; //defaults to AND switch ($type) { case 'and': $operator = " AND "; break; case 'or': $operator = " OR "; break; case 'inline': $inline = true; break; case 'profile': $inline = "profile"; break; case 'term': case 'term_id': $term = explode("?",$arg_list[0]); array_shift($arg_list); $join[] = "inner join {term_node} as tn on n.vid = tn.vid"; if ($type == 'term') { $join[] = "inner join {term_data} as td on tn.tid= td.tid"; $where[] = "td.name = '%s' "; }elseif ($type == 'term_id') { $where[] = "tn.tid = '%d' "; } $terms[] = db_escape_string($term[0]); array_push($args, $type, $term[0]); break; case 'author': $term = explode("?",$arg_list[0]); array_shift($arg_list); $where[] = 'b.biblio_authors RLIKE "[[:<:]]%s[[:>:]]" '; $terms[] = db_escape_string($term[0]); array_push($args, $type, $term[0]); $operator = NULL; break; case 'publisher': $term = explode("?",$arg_list[0]); array_shift($arg_list); $where[] = "b.biblio_publisher RLIKE '%s' "; $terms[] = db_escape_string($term[0]); array_push($args, $type, $term[0]); $operator = NULL; break; case 'year': $term = db_escape_string($arg_list[0]); array_shift($arg_list); $where[] = "b.biblio_year=%d "; //$limit .= " AND b.biblio_year=%d "; $terms[] = (int)$term; array_push($args, $type, (int)$term); $operator = NULL; break; case 'uid': $term = db_escape_string($arg_list[0]); array_shift($arg_list); $where[] = "n.uid=%d "; //$limit .= " AND b.biblio_year=%d "; $terms[] = (int)$term; array_push($args, $type, (int)$term); $operator = NULL; break; case 'keyword': $term = explode("?",$arg_list[0]); array_shift($arg_list); $where[] = "b.biblio_keywords RLIKE '%s' "; $terms[] = db_escape_string($term[0]); array_push($args, $type, $term[0]); $operator = NULL; break; case 'type': $term = db_escape_string($arg_list[0]); array_shift($arg_list); $limit .= $operator. "b.biblio_type=%d "; $terms[] = (int)$term; array_push($args, $type, (int)$term); $operator = NULL; break; case 'order': $term = (db_escape_string($arg_list[0]) == 'desc')?'desc':'asc'; array_shift($arg_list); $pager_attrib['order'] = $term; array_push($args, $type, $term); break; case 'sort': $term = db_escape_string($arg_list[0]); array_shift($arg_list); $pager_attrib['sort'] = $term; array_push($args, $type, $term); switch ($term) { case 'type': $sortby = "ORDER BY b.biblio_type %s, b.biblio_year DESC, SUBSTRING(n.title,1,1) ASC "; break; case 'title': $sortby = "ORDER BY SUBSTRING(n.title,1,1) %s, b.biblio_year DESC "; break; case 'year': default: $sortby = "ORDER BY b.biblio_year %s, SUBSTRING(n.title,1,1) ASC, b.biblio_type ASC "; } //end switch break; default: $fields = biblio_get_db_fields(); $term = explode("?",$arg_list[0]); array_shift($arg_list); if (in_array("biblio_$type",$fields)) { $where[] = "b.biblio_$type RLIKE '%s' "; $terms[] = db_escape_string($term[0]); array_push($args, $type, $term[0]); $operator = NULL; } break; } } } $where[] = "n.type='biblio' "; if ($user->uid != 1 ) { $where[] = 'n.status = 1 '; }//show only published entries to everyone except admin $joins = implode(' ', $join); $where_clause = count($where) > 1 ? '('. implode(') AND (', $where) .')': $where[0]; $query = db_rewrite_sql("SELECT DISTINCT n.*, b.*, bt.name as biblio_type_name FROM {node} n $joins WHERE $where_clause $published $limit $sortby "); $count_query = db_rewrite_sql("SELECT DISTINCT COUNT(*) FROM {node} n $joins WHERE $where_clause $published $limit "); $_SESSION['last_biblio_query'] = $query; $terms[] = $pager_attrib['order']; $_SESSION['last_biblio_query_terms'] = $terms; $count = db_result(db_query($count_query,$terms)); $result = pager_query($query, variable_get('biblio_rowsperpage', 25),0,$count_query,$terms); return biblio_show_results($result, $count, $pager_attrib, $args,$inline); } /* * biblio_show_results takes the query results from biblio_db_search and * adds some controls to the page then loops through the results applying * the selected style to each entry * */ function biblio_show_results($result, $count = 0, $attrib = array("sort" => 'year', 'order' => 'DESC'), $args = null,$inline=false) { global $pager_total_items; $base = variable_get('biblio_base', 'biblio'); $style = variable_get('biblio_style', 'classic'); theme('biblio_add_css'); if (variable_get('biblio_rss', 0)) { drupal_set_html_head(''); } $pub_types = db_query('SELECT t.* FROM {biblio_types} as t WHERE t.tid>0'); while ($option = db_fetch_object($pub_types)) { $pub_type["$option->tid"] = $option->name; } if (!$inline) { // Add some links to the top of the page to change the sorting/ordering... $order = ($attrib['order'] == "desc" || $attrib['order'] == "DESC")?"asc":"desc"; if ( biblio_access('export')) { $content .= '
'.t('Export @count results', array('@count' => $pager_total_items[0])).':['.l("Tagged","$base/export/tagged"). ']['.l("XML","$base/export/xml"). ']['.l("BibTex","$base/export/bib").']
'; }else{ $content .= '
'.t('Found @count results', array('@count' => $pager_total_items[0])) .'

'; } if (user_access('show sort links')) { $options = array('attributes'=>array("title"=>t("Click a second time to reverse the sort order"))); $sort_links = variable_get('biblio_sort_tabs', array('author'=>'author','title'=>'title','type'=>'type','year'=>'year')); $content .= '
'; foreach($sort_links as $key => $link) { if ($key === $link) { $content .= t('Sort by').':'; break; } } if ($sort_links['year']) { $options['query'] = "sort=year&order=$order"; $content .= "[".l(t("Year"),$_GET['q'],$options)."]"; } if ($sort_links['title']) { $options['query'] = "sort=title&order=$order"; $content .= "[".l(t("Title"),$_GET['q'],$options)."]"; } if ($sort_links['type']) { $options['query'] = "sort=type&order=$order"; $content .= "[".l(t("Type"),$_GET['q'],$options)."]"; } if ($sort_links['author']) { $options['query'] = "sort=author&order=$order"; $content .= "[".l(t("Author"),$_GET['q'],$options)."]"; } if ($sort_links['keyword']) { $options['query'] = "sort=keyword&order=$order"; $content .= "[".l(t("Keyword"),$_GET['q'],$options)."]"; } $content .= "
"; } $session = &$_SESSION['biblio_filter']; // if there are any filters in place, print them at the top of the list if (count($args)) { $content .= ''.t('Filters').': '; $i = 0; while ($args) { $type = $args[0]; array_shift($args); $value = db_escape_string($args[0]); if ($type == 'term_id') { $term_result = db_query('SELECT name FROM {term_data} as td WHERE td.tid = %d',$value); $term = db_fetch_object($term_result); $value = $term->name; $type = t("Taxonomy Term"); } if ($type == 'type') $value = $pub_type["$value"]; array_shift($args); $params = array('%a' => $type , '%b' => $value ); $content .= ($i++ ? t(' and %a is %b', $params) : t('%a is %b', $params)) ; } $content .= '  '.l('['.t('Clear All Filters').']',"$base/filter/clear"); } } if ($inline === true) print '
'; $_char = $_type = $_year = $name = ""; while ($node = db_fetch_object($result)) { if (isset($node->biblio_year) && ($node->biblio_year == 9998)) $node->biblio_year = t("In Press") ; if (isset($node->biblio_year) && ($node->biblio_year == 9999)) $node->biblio_year = t("Submitted") ; switch ($attrib['sort']) { case 'title': if ( drupal_substr(drupal_ucfirst(ltrim($node->title)), 0, 1) != $_char) { $_char = drupal_substr(drupal_ucfirst(ltrim($node->title)), 0, 1) ; $content .= '
' . $_char . "
\n"; } break; case 'author': if ( drupal_substr(drupal_ucfirst(ltrim($node->biblio_authors)), 0, 1) != $_char) { $_char = drupal_substr(drupal_ucfirst(ltrim($node->biblio_authors)), 0, 1) ; $content .= '
' . $_char . "
\n"; } break; case 'type': if ($node->biblio_type_name != $_type) { $_type = $node->biblio_type_name; // $name = db_result(db_query("SELECT name FROM {biblio_types} as t where t.tid=%d", $node->biblio_type)) ; $content .= '
' . $_type . "
\n"; } break; case 'keyword': // added msh 08 aug 07 $tok = drupal_ucfirst(strtok($node->biblio_keywords, variable_get('biblio_keyword_sep', ','))); if (empty($tok)) { $tok = t("No Keywords"); } if ($tok != $name) { $name = $tok; if ($name != '') { $content .= '
' . $name . "
\n"; } } break; case 'year': default: if ($node->biblio_year != $_year) { $_year = $node->biblio_year; $content .= '
' .$_year. "
\n"; } } //end switch $content .= '
' . "\n"; $inline_links = ($inline && variable_get('inlinemode_in_links',0)) ? true : false; $content .= theme('biblio_list', $node,$base,$style,$inline_links); $content .= "
\n"; } //end while $content .= theme('pager', 0, variable_get('biblio_rowsperpage', 25)); if ($count == 0) { $content .= "

".t("No items found")."

"; if (strstr($content, "Filters:")) { $content .= t('!modify_link or !remove_link your filters and try again.', array('!modify_link' => l(t('Modify'),"$base/filter"), '!remove_link' => l(t('remove'),"$base/filter/clear"))); } } if (!$inline) { print theme('page', $content); }elseif ($inline == 'profile'){ return $content ; }else{ print $content . "
"; } } function _get_biblio_filters() { $fields = " b.biblio_year, b.biblio_authors, t.name , t.tid "; $order = " b.biblio_year DESC"; $taxo_fields = "td.name as termname,td.tid as taxid, v.name as vocab_name"; $taxo_order = "vocab_name ASC, termname ASC"; $table = "{node} as n inner join {biblio} as b on n.vid=b.vid "; $join = "left join {biblio_types} as t on b.biblio_type = t.tid"; $taxo_join = array("inner join {term_node} as tn on n.vid = tn.vid", "left join {term_data} as td on tn.tid= td.tid", "left join {vocabulary} as v on v.vid= td.vid"); $taxo_joins = implode(' ',$taxo_join); $result = db_query("SELECT $fields FROM $table $join ORDER BY $order"); $taxoresult = db_query("SELECT $taxo_fields FROM $table $taxo_joins ORDER BY $taxo_order"); while ($option = db_fetch_object($result)) { if ($option->biblio_year == 9998) { $option->biblio_year = t("In Press"); } if ($option->biblio_year == 9999) { $option->biblio_year = t("Submitted"); } $pub_years["$option->biblio_year"] = $option->biblio_year; $pub_type["$option->tid"] = $option->name; $author_array = explode(";", $option->biblio_authors); foreach($author_array as $auth) { if (strstr($auth, ",")) { $parts = split(",", $auth); $lastname = trim($parts[0]); } else { $parts = split(" ", $auth); $lastname = trim(end($parts)); } if ($lastname) $pub_authors["$lastname"] = $lastname; } } while ($tax = db_fetch_object($taxoresult)) { $pub_taxo["$tax->taxid"] = "$tax->vocab_name - $tax->termname"; } $pub_years = array_unique($pub_years); $pub_type = array_unique($pub_type); if (!empty($pub_taxo))$pub_taxo = array_unique($pub_taxo); if (!empty($pub_taxo)) { $tax_select = array('title' => t('Term'),'options' => $pub_taxo); }else{$tax_select = null; } ksort($pub_authors); $filters = array( 'author' => array('title' => t('Author'),'options' => $pub_authors), 'type' => array('title' => t('Type'),'options' => $pub_type), 'term_id' => $tax_select, 'year' => array('title' => t('Year'),'options' => $pub_years) ); return $filters; } function biblio_form_filter() { $session = &$_SESSION['biblio_filter']; $session = is_array($session) ? $session : array(); $filters = _get_biblio_filters(); $i = 0; $form['filters'] = array('#type' => 'fieldset', '#title' => t('Show only items where'), '#theme' => 'biblio_filters', ); foreach ($session as $filter) { list($type, $value) = $filter; if ($type == 'category') { // Load term name from DB rather than search and parse options array. $value = module_invoke('taxonomy', 'get_term', $value); $value = $value->name; }else if ($type == 'keyword') { $filters[$type]['title'] = 'Keyword'; }else { $value = $filters[$type]['options'][$value]; } $string = ($i++ ? 'and where %a is %b' : '%a is %b'); $form['filters']['current'][] = array('#value' => t($string, array('%a' => $filters[$type]['title'] , '%b' => $value))); } foreach ($filters as $key => $filter) { if (count ($filter['options'])) { $names[$key] = $filter['title']; $form['filters']['status'][$key] = array('#type' => 'select', '#options' => $filter['options']); } } $form['filters']['status']['keyword']=array('#type' => 'textfield','#size' => 25, '#maxlength' => 255); $names['keyword'] = "Keyword"; $form['filters']['filter'] = array('#type' => 'radios', '#options' => $names, '#default_value' => 'status'); $form['filters']['buttons']['submit'] = array('#type' => 'submit', '#value' => (count($session) ? t('Refine') : t('Filter'))); if (count($session)) { $form['filters']['buttons']['undo'] = array('#type' => 'submit', '#value' => t('Undo')); $form['filters']['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset')); } return $form; } function biblio_form_filter_submit($form, &$form_state) { $op = $form_state['values']['op']; $filters = _get_biblio_filters(); switch ($op) { case t('Filter'): case t('Refine'): if (isset($form_state['values']['filter'])) { $filter = $form_state['values']['filter']; // Flatten the options array to accommodate hierarchical/nested options. if (isset($filters[$filter]['options'])) { $flat_options = form_options_flatten($filters[$filter]['options']); } if (isset($flat_options[$form_state['values'][$filter]]) || $filter == 'keyword') { $_SESSION['biblio_filter'][] = array($filter, $form_state['values'][$filter]); $base = variable_get('biblio_base', 'biblio'); drupal_goto($base); } } break; case t('Undo'): array_pop($_SESSION['biblio_filter']); break; case t('Reset'): $_SESSION['biblio_filter'] = array(); break; } } function biblio_get_user_pubs($user,$profile=''){ switch ((isset($user->biblio_profile_uid) ) ? $user->biblio_profile_uid : variable_get('biblio_profile_uid', 'uid')){ case 'lastname': $pubs = biblio_db_search('author', $user->biblio_lastname, $profile); break; case 'uid_lastname': $pubs = biblio_db_search('uid', $user->uid, 'author', $user->biblio_lastname, $profile); break; case 'uid': default: $pubs = biblio_db_search('uid', $user->uid, $profile); } return $pubs; } function biblio_view_inline(&$node) { $style = variable_get('biblio_style', 'classic'); $base = variable_get('biblio_base', 'biblio'); $output = '
'; $output .= theme('biblio_long', $node, $base, $style); $output .= '
'; print $output; } function biblio_citekey_view() { $citekey = arg(2); $nid = db_fetch_object(db_query("SELECT nid FROM {biblio} WHERE biblio_citekey = '%s' ORDER BY vid DESC", $citekey)); if ($nid->nid > 0) { $node = node_load($nid->nid); return node_page_view($node); } else { return t("Sorry, citekey @cite not found", array('@cite'=>$citekey)); } } function _biblio_author_links($author, $base='biblio', $inline = FALSE) { $options = array(); $inline = $inline ? "/inline" : ""; if (isset($_GET['sort'])) { $options['query'] .= "sort=" . $_GET['sort']; } if (isset($_GET['order'])) { $options['query'] .= $options['query'] ? "&" : "" ; $options['query'] .= "order=" . $_GET['order']; } $html = ""; $author_array = explode(";", $author); foreach($author_array as $auth) { $html .= (empty($html))? "" : "; "; if (strstr($auth, ",")) { $parts = split(",", $auth); $lastname = $parts[0]; } else { $parts = split(" ", $auth); $lastname = end($parts); } // list($lastname, $init) = split(",", $auth); $html .= l(trim($auth), "$base/author/" . trim($lastname) . $inline,$options ); } return $html; } function _biblio_keyword_links($keywords,$base='biblio') { $options = array(); if (isset($_GET['sort'])) { $options['query'] .= "sort=" . $_GET['sort']; } if (isset($_GET['order'])) { $options['query'] .= $options['query'] ? "&" : ""; $options['query'] .= "order=" . $_GET['order']; } $html = ""; $sep = variable_get('biblio_keyword_sep', ','); $keyword_array = explode($sep, $keywords); foreach($keyword_array as $kw) { $html .= (empty($html))? "" : "; "; $html .= l(trim($kw), "$base/keyword/" . trim($kw) , $options); } return $html; } function _biblio_parse_authors($authors) { $and = array(" and ", " And ", " AND "); $authors = str_replace($and, ", ", $authors); // change the word "and" to a comma $authors = str_replace(" ,", ",", $authors); // fix some potential typos $authors = str_replace(",,", ",", $authors); // ditto // $authors = str_replace(";",",",$authors); $chunks = explode(";", $authors); // split the authors on the semicolon $num_chunks = count($chunks); for($i = 0; $i < count($chunks); $i++) { $suffix = _biblio_get_suffix($chunks[$i]); // get and strip out the suffix $prefix = _biblio_get_prefix($chunks[$i]); // get and strip out the prefix if (strstr($chunks[$i], ",")) { // we probably have lastname first $subchunks = explode(",", trim($chunks[$i])); $lastname = $subchunks[0]; $subchunks = explode(" ", trim($subchunks[1])); $initials = ""; for ($j = 0; $j < count($subchunks) ; $j++) { if (substr_count($subchunks[$j], '.')) { $initials .= $subchunks[$j]; } else { $initials .= drupal_substr($subchunks[$j], 0, 1) . "."; } } } else { // we have some form of firstname first (Fistname I. Lastname) $subchunks = explode(" ", trim($chunks[$i])); $lastname = end($subchunks); $initials = ""; for ($j = 0; $j < count($subchunks) - 1 ; $j++) { if (substr_count($subchunks[$j], '.')) { $initials .= $subchunks[$j]; } else { $initials .= drupal_substr($subchunks[$j], 0, 1) . "."; } } } $chunks[$i] = trim($prefix . $lastname . ', ' . $initials . ' ' . $suffix); } return implode("; ", $chunks); } function _biblio_get_suffix(&$name) { $suffix = null; if (preg_match("/[, \.]+(Jr|Sr|Snr)\.?\s*$/", $name, $match)) { $suffix = $match[0]; $Text = str_replace($suffix, "", $name); } elseif (preg_match("/([, \.]+)(Jr|Sr|Snr)[. ]/", $name, $match)) { $suffix = $match[1]; $name = str_replace($suffix, "", $name); } return $suffix; } function _biblio_get_prefix(&$name) { $prefix = null; $name = " " . $name; $prefs = array(" Van ", " van ", " von ", " den ", " der ", " de ", " De ", " ter ", " Ter ", "Vander "); if (strstr($name, " Van ")) $prefix .= "Van "; if (strstr($name, " van ")) $prefix .= "van "; if (strstr($name, " Vander ")) $prefix .= "Vander "; if (strstr($name, " von ")) $prefix .= "von "; if (strstr($name, " de ")) $prefix .= "de "; if (strstr($name, " De ")) $prefix .= "De "; if (strstr($name, " den ")) $prefix .= "den "; if (strstr($name, " der ")) $prefix .= "der "; if (strstr($name, " ter ")) $prefix .= "ter "; if (strstr($name, " Ter ")) $prefix .= "Ter "; if (strlen($prefix)) $name = str_replace($prefs, "", $name); $name = trim($name); return $prefix; }