nid.",";
}
}
else {
// No node search result. Make sure we find nothing, too. Node -1 does not exist.
$node_list = '-1';
}
// Store as SESSION filter or argument list.
// When called as function argument it takes only one parameter, i.e.
// biblio_db_search('search', 'bla blu') and we must insert the node
// list inbetween.
if ($search !== FALSE) {
array_splice($arg_list,$search+1,0,$node_list);
}
else {
$_SESSION['biblio_filter'] = array(array('search',rtrim($node_list,','),$keys));
}
}
}
$inline = in_array('inline', $arg_list);
$inline = in_array('profile',$arg_list)?'profile':$inline;
$query_info = biblio_build_query($arg_list);
if ($query_info['rss']['feed']){
biblio_filter_feed($query_info['query'], $query_info['query_terms'], $query_info['rss']);
}else{
//$count = db_result(db_query($query_info['count_query'],$query_info['query_terms']));
$result = pager_query($query_info['query'], variable_get('biblio_rowsperpage', 25),0,$query_info['count_query'],$query_info['query_terms']);
return biblio_show_results($result, $query_info['sort_attrib'], $query_info['args'],$inline);
}
}
/*
* biblio_db_search builds the SQL query which will be used to
* select and order "biblio" type nodes. The query results are
* then passed to biblio_show_results for output
*
*
*/
function biblio_build_query($arg_list) {
global $user, $db_type;
static $bcc; //biblio_contributor (bc) count , increase for every invocation
if ( !isset( $bcc ) ) $bcc = 0;
$inline = $rss_info['feed'] = false;
$join = array();
$join[] = "left join {biblio} b on n.vid=b.vid ";
$join[] = "inner join {biblio_types} bt on b.biblio_type=bt.tid ";
$pgsql_additions ='';
$limit = '';
if (variable_get('biblio_view_only_own', 0) ) {
$limit .= " AND n.uid = $user->uid ";
}
$sort_attrib = array("sort" => variable_get('biblio_sort', 'year'), 'order' => variable_get('biblio_order', 'DESC'));
$limits = null;
if (isset($_GET['order'])) {
$sort_attrib['order'] = ($_GET['order'] == 'desc') ? 'desc' : 'asc';
}
if (isset($_GET['sort'])) {
$sort_attrib['sort'] = check_plain($_GET['sort']);
}
switch ($sort_attrib['sort']) {
case 'type':
if ($db_type == 'pgsql') $pgsql_additions = ', SUBSTR(n.title,1,3) ';
$sortby = "ORDER BY b.biblio_type %s, SUBSTR(n.title,1,3) ASC ";
break;
case 'title':
//$sortby = "ORDER BY SUBSTRING(n.title,1,3) %s, b.biblio_year DESC ";
if ($db_type == 'pgsql') {
$pgsql_additions = ", CASE
WHEN SUBSTR(n.title,1,1)='\"' THEN SUBSTR(n.title,2)
WHEN SUBSTR(n.title,1,1)='\'' THEN SUBSTR(n.title,2)
WHEN SUBSTR(n.title,1,2)='A ' THEN SUBSTR(n.title,3)
WHEN SUBSTR(n.title,1,3)='An ' THEN SUBSTR(n.title,4)
WHEN SUBSTR(n.title,1,4)='The ' THEN SUBSTR(n.title,5)
ELSE title
END ";
}
$sortby = "ORDER BY
CASE
WHEN SUBSTR(n.title,1,1)='\"' THEN SUBSTR(n.title,2)
WHEN SUBSTR(n.title,1,1)='\'' THEN SUBSTR(n.title,2)
WHEN SUBSTR(n.title,1,2)='A ' THEN SUBSTR(n.title,3)
WHEN SUBSTR(n.title,1,3)='An ' THEN SUBSTR(n.title,4)
WHEN SUBSTR(n.title,1,4)='The ' THEN SUBSTR(n.title,5)
ELSE title
END %s";
break;
case 'author':
if ($db_type == 'pgsql') $pgsql_additions = ', bcd.lastname ';
$sortby = "ORDER BY bcd.lastname %s ";
//$where['bc-rank'] = "bc.rank=0";
//$where[] = "bc.ctid=1";
$join['bc'] = ' JOIN {biblio_contributor} as bc on b.vid = bc.vid ';
$join['bcd'] = ' JOIN {biblio_contributor_data} as bcd on bc.cid = bcd.cid ';
break;
case 'keyword': // added msh 070808
if ($db_type == 'pgsql') $pgsql_additions = ', SUBSTR(LTRIM(b.biblio_keywords),1,4)';
$sortby = "ORDER BY SUBSTR(LTRIM(b.biblio_keywords),1,4) %s ";
break;
case 'year':
default:
if ($db_type == 'pgsql') $pgsql_additions = ', SUBSTR(n.title,1,3) ';
$sortby = "ORDER BY b.biblio_year %s, b.biblio_date %s, SUBSTR(n.title,1,3) ASC ";
} //end switch
if (!isset($_SESSION['biblio_filter']) || !is_array($_SESSION['biblio_filter'])) {
$_SESSION['biblio_filter'] = array();
}
$session = &$_SESSION['biblio_filter'];
if (!in_array('no_filters', $arg_list)) {
foreach ($session as $filter) {
$arg_list = array_merge($arg_list, $filter);
}
}
if (count($arg_list) ) {
$args = array();
while ($arg_list) {
$type = $arg_list[0];
array_shift($arg_list);
$operator = ($operator)?$operator:" AND "; //defaults to AND
switch ($type) {
case 'no_filters':
break;
case 'and':
$operator = " AND ";
break;
case 'or':
$operator = " OR ";
break;
case 'inline':
$inline = true;
break;
case 'rss.xml':
$rss_info['feed'] = true;
break;
case 'profile':
$inline = "profile";
break;
case 'cid':
case 'aid':
$bcc++;
$term = explode("?",array_shift($arg_list));
$join[] = "inner join {biblio_contributor} as bc". $bcc ." on n.vid = bc". $bcc .".vid";
$where[] = "bc". $bcc .".cid = '%d' ";
$terms[] = db_escape_string($term[0]);
array_push($args, $type, $term[0]);
break;
case 'term':
case 'term_id':
$term = explode("?",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 'tg':
$term = explode("?",array_shift($arg_list));
$where[] = ' CASE
WHEN LEFT(n.title,1)="\"" THEN SUBSTRING(n.title,2,1)
WHEN LEFT(n.title,1)="\'" THEN SUBSTRING(n.title,2,1)
WHEN LEFT(n.title,2)="A " THEN SUBSTRING(n.title,3,1)
WHEN LEFT(n.title,3)="An " THEN SUBSTRING(n.title,4,1)
WHEN LEFT(n.title,4)="The " THEN SUBSTRING(n.title,5,1)
ELSE SUBSTRING(n.title,1,1)
END
RLIKE "%s" ';
$terms[] = db_escape_string($term[0]);
array_push($args, $type, $term[0]);
$operator = NULL;
break;
case 'ag': //selects entries whoose authors firstname starts with the letter provided
$term = explode("?",array_shift($arg_list));
$where[] = ' UCASE(substring(bcd.lastname,1,1)) = "%s" ';
$join['bc'] = ' INNER JOIN {biblio_contributor} as bc on b.vid = bc.vid ';
$join['bcd'] = ' JOIN {biblio_contributor_data} as bcd on bc.cid = bcd.cid ';
$terms[] = db_escape_string(strtoupper($term[0]));
array_push($args, $type, $term[0]);
$operator = NULL;
break;
case 'author':
$bcc++;
$term = explode("?",array_shift($arg_list));
if (is_numeric($term[0])){
$join[] = "inner join {biblio_contributor} as bc". $bcc ." on n.vid = bc". $bcc .".vid";
$where[] = "bc". $bcc .".cid = '%d' ";
$terms[] = db_escape_string($term[0]);
}else{
$where[] = " bcd". $bcc .'.name RLIKE "[[:<:]]%s[[:>:]]" ';
$join[] = " JOIN {biblio_contributor} as bc". $bcc ." on b.vid = bc". $bcc .".vid ";
$join[] = " JOIN {biblio_contributor_data} as bcd". $bcc ." on bc". $bcc .".cid = bcd".$bcc .".cid ";
$terms[] = db_escape_string($term[0]);
$operator = NULL;
$rss_info['title'] = t("Publications by " . $term[0]);
$rss_info['description'] = t("These publications by %author are part of the works listed at %sitename", array('%author' => $term[0], '%sitename' => variable_get('site_name', 'Drupal')));
$rss_info['link'] = '/author/' . $term[0];
}
array_push($args, $type, $term[0]);
break;
case 'publisher':
$term = explode("?",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(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(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("?",array_shift($arg_list));
// $where[] = "b.biblio_keywords RLIKE '%s' ";
$terms[] = db_escape_string($term[0]);
$join[] = "inner join {biblio_keyword} as bk on n.vid = bk.vid";
//$join[] = "inner join {biblio_keyword_data} as bkd on bk.kid= bkd.kid";
$where[] = "bk.kid = %d ";
array_push($args, $type, $term[0]);
$operator = NULL;
break;
case 'type':
$term = db_escape_string(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(array_shift($arg_list)) == 'desc')?'desc':'asc';
$sort_attrib['order'] = $term;
array_push($args, $type, $term);
break;
case 'sort':
$term = db_escape_string(array_shift($arg_list));
$sort_attrib['sort'] = $term;
array_push($args, $type, $term);
switch ($term) {
case 'type':
if ($db_type == 'pgsql') $pgsql_additions = ', SUBSTR(n.title,1,3) ';
$sortby = "ORDER BY b.biblio_type %s, b.biblio_year DESC, SUBSTR(n.title,1,3) ASC ";
break;
case 'title':
if ($db_type == 'pgsql') $pgsql_additions = ', SUBSTR(n.title,1,3) ';
$sortby = "ORDER BY SUBSTRING(n.title,1,3) %s, b.biblio_year DESC ";
break;
case 'year':
default:
if ($db_type == 'pgsql') $pgsql_additions = ', SUBSTR(n.title,1,3) ';
$sortby = "ORDER BY b.biblio_year %s, b.biblio_date %s,SUBSTR(n.title,1,3) ASC, b.biblio_type ASC ";
} //end switch
break;
case 'search':
$term = explode("?",array_shift($arg_list));
$result_nids = split(',', $term[0]);
$where[] = "n.nid in (".db_placeholders($result_nids).")";
foreach ($result_nids as $result_nid) {
$terms[] = db_escape_string($result_nid);
array_push($args, $type, $result_nid);
}
// Save search keyword to show in the filter list.
$term = array_shift($arg_list);
array_push($args, $type, $term);
$operator = NULL;
break;
default:
$fields = biblio_get_db_fields();
$term = explode("?",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 $pgsql_additions FROM {node} n $joins WHERE $where_clause $limit $sortby ");
$count_query = db_rewrite_sql("SELECT COUNT(DISTINCT(n.nid)) FROM {node} n $joins WHERE $where_clause $limit ");
$_SESSION['last_biblio_query'] = $query;
$terms[] = $sort_attrib['order']; // this is either asc or desc to be inserted into the first term of the ORDER clause
if($sort_attrib['sort'] == 'year') $terms[] = $sort_attrib['order']; // we need any extra order term when sorting by year since there are to date terms biblio_year and biblio_date
$_SESSION['last_biblio_query_terms'] = $terms;
return (array('query' => $query,
'query_terms' => $terms,
'count_query' => $count_query,
'args' => $args,
'sort_attrib' => $sort_attrib,
'rss' => $rss_info
));
}
/**
* 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
*
* @param $result
* @param $count
* @param $attrib
* @param $args
* @param $inline
* @return unknown_type
*/
function biblio_show_results($result, $attrib = array("sort" => 'year', 'order' => 'DESC'), $args = null,$inline=false) {
global $pager_total_items;
module_load_include('inc','biblio','biblio.contributors');
$base = variable_get('biblio_base', 'biblio');
$style = variable_get('biblio_style', 'cse');
if ($inline === 'profile') {
$profile = true;
$inline = false;
}
if (module_exists('popups')){
popups_add_popups();
}
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 && !$profile) {
// Search box. Has same permissions as the filter tab.
if (variable_get('biblio_search',0) && user_access('show filter tab')) {
$content .= drupal_get_form('biblio_search_form');
}
// 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("CSV","$base/export/csv").']['.l("BibTex","$base/export/bibtex").']
';
$content .= ''.t('Export @count results', array('@count' => $pager_total_items[0])).':' . theme('biblio_export_links'). '
';
}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)) {
$i = 0;
while ($args) {
$type = $args[0];
array_shift($args);
$value = db_escape_string($args[0]);
if ($type == 'search') {
$search_content = ''. array_shift($args).' ';
continue;
}
if ($type == 'term_id') {
$term = taxonomy_get_term($value);
$value = $term->name;
$type = t("Taxonomy Term");
}
if ($type == 'keyword') {
require_once(drupal_get_path('module', 'biblio') .'/biblio.keywords.inc');
$term = biblio_get_keyword_by_id($value);
$value = $term->word;
$type = t("Keyword");
}
if ($type == 'uid' ) {
$user = user_load($value);
$value = $user->name;
$type = t("Drupal User");
}
if ($type == 'aid' || ($type == 'author' && is_numeric($value))) {
$author = biblio_get_contributor($value);
$value = $author->name;
$type = t("Author");
}
if ($type == 'ag' ) {
$type = t("First letter of last name");
}
if ($type == 'tg' ) {
$type = t("First letter of title");
}
if ($type == 'type') $value = $pub_type["$value"];
array_shift($args);
$params = array('%a' => $type , '%b' => $value );
$filtercontent .= ($i++ ? t(' and %a is %b ', $params) : t('%a is %b ', $params)) ;
}
if ($search_content) {
$content .= ''.t('Search results for ').' ';
$content .= $search_content;
if ($filtercontent) {
$content .= '
'.t('Filters').': ';
}
}
else {
$content .= '
'.t('Filters').': ';
}
$content .= $filtercontent;
$link_options = array();
if (isset($_GET['sort'])) {
$link_options['query'] .= "sort=" . $_GET['sort'];
}
if (isset($_GET['order'])) {
$link_options['query'] .= $options['query'] ? "&" : "" ;
$link_options['query'] .= "order=" . $_GET['order'];
}
if ($search_content) {
$content .= ' '.l('['.t('Reset Search').']',"$base/filter/clear", $link_options);
} else {
$content .= ' '.l('['.t('Clear All Filters').']',"$base/filter/clear", $link_options);
}
$content .= '
';
}
}
if ($inline === true) print '
';
if ($_GET['sort'] == 'title' || $_GET['sort'] == 'author'){
$content .= theme(biblio_alpha_line,$_GET['sort'],$value);
}
$_char = $_type = $_year = $name = ""; $count = 0;
while ($node = db_fetch_object($result)) {
$count++;
$node->biblio_contributors = biblio_load_contributors($node->vid);
if ( module_exists("upload") ) {
$node->files = upload_load($node);
}
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':
$first = drupal_substr(drupal_ucfirst(ltrim($node->title)), 0, 1);
if (drupal_substr(drupal_ucfirst(ltrim($node->title)), 0, 1) == '"' ) $first = drupal_ucfirst(drupal_substr(ltrim($node->title), 1, 1));
if (drupal_substr(drupal_ucfirst(ltrim($node->title)), 0, 1) == "'" ) $first = drupal_ucfirst(drupal_substr(ltrim($node->title), 1, 1));
if (drupal_substr(drupal_ucfirst(ltrim($node->title)), 0, 2) == "A " ) $first = drupal_ucfirst(drupal_substr(ltrim($node->title), 2, 1));
if (drupal_substr(drupal_ucfirst(ltrim($node->title)), 0, 3) == "An " ) $first = drupal_ucfirst(drupal_substr(ltrim($node->title), 3, 1));
if (drupal_substr(drupal_ucfirst(ltrim($node->title)), 0, 4) == "The " ) $first = drupal_ucfirst(drupal_substr(ltrim($node->title), 4, 1));
if ( $first != $_char) {
$_char = $first ;
$content .= '
' . $_char . "
\n";
}
break;
case 'author':
if ( drupal_substr(drupal_ucfirst(ltrim($node->biblio_contributors[1][0]['lastname'])), 0, 1) != $_char) {
$_char = drupal_substr(drupal_ucfirst(ltrim($node->biblio_contributors[1][0]['lastname'])), 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
$inline_links = ($inline && variable_get('inlinemode_in_links',0)) ? true : false;
$content .= theme('biblio_entry', $node,$base,$style,$inline);
} //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 ($profile === true) return $content;
if ($inline === true) print $content . "
";
if ($inline === false) print theme('page', $content);
}
/**
* Add a search field on the main biblio page.
*/
/**
* @param $form_state
* @return unknown_type
*/
function biblio_search_form(&$form_state) {
$form['biblio_search'] = array(
'#prefix' => '
',
'#suffix' => '
',
);
$form['biblio_search']['keys'] = array(
'#type' => 'textfield',
'#title' => '',
'#default_value' => '',
'#size' => 25,
'#maxlength' => 255,
);
$button_text = strlen(variable_get('biblio_search_button_text', ''))?variable_get('biblio_search_button_text', t('Biblio search')):t('Biblio search');
$form['biblio_search']['submit'] = array('#type' => 'submit', '#value' => $button_text);
return $form;
}
/**
* We must validate the keyword length before calling node_search. Otherwise
* we would store a keyword of e.g. length 1, but do_search would complain about
* it later and resend us to the input form. But since the keyword was stored already
* we could never again display the page without errors
* @param $form
* @param $form_state
* @return unknown_type
*/
function biblio_search_form_validate($form, &$form_state) {
// Empty searchbox finds everything.
$keys = $form_state['values']['keys'];
if ($keys != '') {
$query = search_parse_query($form_state['values']['keys']);
if ($query[2] == '') {
form_set_error('keys', t('You must include at least one positive keyword with @count characters or more.', array('@count' => variable_get('minimum_word_size', 3))));
}
}
}
/**
* When we submit a search, we revoke all current filters since search
* and filtering are considered two different concepts things* conceptually.
*
* But we store the results as a filter (which is just a list of node ids that
* matched the search request) so that we can reorder or export the search
* results like with any other filter. The filter has three components:
* ('search',
,).
* The second component, the filter value, is empty when submitting keywords.
* In biblio_db_search we fill the second component with the list of nids
* matching our keywords, as returned by node_search. We store the keywords
* only for showing them in "Search results for ".
*/
/**
* @param $form
* @param $form_state
* @return unknown_type
*/
function biblio_search_form_submit($form, &$form_state) {
$keys = $form_state['values']['keys'];
if ($keys != '') {
$_SESSION['biblio_filter'] = array(array('search','',$keys));
$base = variable_get('biblio_base', 'biblio');
$form_state['redirect'] = $base;
}
else {
// No keywords. Remove former search keys if any. Leaves other filters intact.
if (_get_biblio_search_filter()){
$_SESSION['biblio_filter'] = array();
}
}
}
/**
* @param $arg
* @return unknown_type
*/
function _get_biblio_search_filter($arg = 'keys') {
if (variable_get('biblio_search',0) &&
is_array($_SESSION['biblio_filter']) &&
is_array($_SESSION['biblio_filter'][0]) &&
in_array('search',$_SESSION['biblio_filter'][0])
){
switch ($arg) {
case 'keys': return $_SESSION['biblio_filter'][0][2]; break;
case 'nodelist': return $_SESSION['biblio_filter'][0][1]; break;
}
}
}
function _get_biblio_filters() {
$fields = " b.biblio_year, 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");
$authors = db_query("SELECT firstname, initials, lastname, cid FROM {biblio_contributor_data} ORDER BY lastname ASC");
$keywords = db_query("SELECT word, kid FROM {biblio_keyword_data} ORDER BY word ASC");
$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;
}
while($auth = db_fetch_object($authors)) {
$pub_authors[$auth->cid] = $auth->lastname .((!empty($auth->firstname) || !empty($auth->initials))?', '.$auth->firstname.' '.$auth->initials :'');
}
while($keyword = db_fetch_object($keywords)) {
$pub_keywords[$keyword->kid] = $keyword->word;
}
while ($tax = db_fetch_object($taxoresult)) {
$pub_taxo["$tax->taxid"] = "$tax->vocab_name - $tax->termname";
}
$author_select = isset($pub_authors) ? array('title' => t('Author'), 'options' => $pub_authors) : null;
$years_select = isset($pub_years) ? array('title' => t('Year'), 'options' => array_unique($pub_years)) : null;
$type_select = isset($pub_type) ? array('title' => t('Type'), 'options' => array_unique($pub_type)) : null;
$tax_select = isset($pub_taxo) ? array('title' => t('Term'),'options' => array_unique($pub_taxo)) : null;
$keyword_select = isset($pub_keywords) ? array('title' => t('Keyword'), 'options' => $pub_keywords) : null;
$filters = array(
'author' => $author_select,
'type' => $type_select,
'term_id' => $tax_select,
'year' => $years_select,
'keyword' => $keyword_select,
);
return $filters;
}
/**
* @return unknown_type
*/
function biblio_form_filter() {
// No longer use &$_SESSION so that we can alter $session in case of the search 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;
// Don't show the search filter. Reset $session because of the $count(session) below.
if ($type == 'search') {
$session = array ();
break;
}
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 {
$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']['filter'] = array('#type' => 'radios', '#options' => $names, '#default_value' => 'author');
$form['filters']['buttons']['submit'] = array('#type' => 'submit', '#value' => (count($session) ? t('Refine') : t('Filter')));
if (count($session) && $type != 'search') {
$form['filters']['buttons']['undo'] = array('#type' => 'submit', '#value' => t('Undo'));
$form['filters']['buttons']['reset'] = array('#type' => 'submit', '#value' => t('Reset'));
}
return $form;
}
/**
* @param $form
* @param $form_state
* @return unknown_type
*/
function biblio_form_filter_submit($form, &$form_state) {
// If the search filter was set, remove it now.
if(_get_biblio_search_filter()){
$_SESSION['biblio_filter'] = array ();
}
$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]]) ) {
$_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;
}
}
/**
* @param $user
* @param $profile
* @return unknown_type
*/
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);
}
*/
if (isset($user->biblio_contributor_id) && $user->biblio_contributor_id > 0 ){
$pubs = biblio_db_search('author', $user->biblio_contributor_id, $profile);
}else{
$pubs = biblio_db_search('uid', $user->uid, $profile);
}
return $pubs;
}
/**
* @param $node
* @return unknown_type
*/
function biblio_view_inline(&$node) {
$style = variable_get('biblio_style', 'classic');
$base = variable_get('biblio_base', 'biblio');
$layout = variable_get('biblio_node_layout', 'tabular');
$theme = ($layout == 'tabular') ? 'biblio_tabular' : 'biblio_long';
$output = '';
$output .= theme($theme, $node, $base, $style);
$output .= '
';
return $output;
}
/**
* @return unknown_type
*/
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));
}
}
/**
* @param $author
* @param $aid
* @param $base
* @param $inline
* @return unknown_type
*/
function _biblio_author_link($author, $aid, $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 = l(trim($author), "$base/author/$aid".$inline,$options );
return $html;
}
/**
* @param $keywords
* @param $base
* @return unknown_type
*/
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($keywords as $keyword ) {
$html .= (empty($html))? "" : "$sep ";
$html .= l(trim($keyword->word), "$base/keyword/$keyword->kid" , $options);
}
return $html;
}
function biblio_author_page($filter = NULL) {
$base = variable_get('biblio_base', 'biblio');
$menu = menu_get_active_title();
if ($menu == 'Authors') $path = $base.'/authors/';
if ($menu == 'Biblio settings') $path = 'admin/settings/biblio/author/list/';
if ($filter) {
$filter = strtoupper($filter);
$query_ext = ' AND UPPER(SUBSTRING(lastname,1,1)) = "%s" ';
$header_ext = t(' (whose last name starts with the letter "@letter") ',array('@letter' => $filter ));
}
else {
$query_ext = NULL;
$header_ext = NULL;
}
$db_result = db_query('SELECT bd.*, COUNT(*) AS cnt FROM {biblio_contributor} b, {biblio_contributor_data} bd WHERE bd.cid=b.cid '. $query_ext.' GROUP BY b.cid HAVING cnt > 0 ORDER BY lastname ASC, SUBSTRING(firstname,1,1) ASC, initials ASC',$filter);
while ($author = db_fetch_array($db_result)){
$authors[] = $author;
}
$rows[] = array(array('data' => theme(biblio_alpha_line, 'authors', $filter, $path), 'colspan' => 3));
for ($i=0; $i < count($authors); $i+=3) {
$rows[] = array( array('data' => _biblio_format_author($authors[$i], $path) ),
array('data' => isset($authors[$i+1])?_biblio_format_author($authors[$i+1], $path):'' ),
array('data' => isset($authors[$i+2])?_biblio_format_author($authors[$i+2], $path):'' ));
}
$header = array(array('data' => t('There are a total of @count authors !header_ext in the database',array('@count' => count($authors), '!header_ext' => $header_ext)), 'align' =>'center', 'colspan' => 3));
$output .= theme('table', $header, $rows);
return $output;
}
function _biblio_format_author($author, $path) {
$format = $author['prefix'] . ' ' . $author['lastname'] ;
$firstname = !empty ($author['firstname']) ? drupal_substr($author['firstname'], 0, 1) : '';
$initials = !empty ($author['initials']) ? str_replace(' ', '', $author['initials']) : '';
$base = variable_get('biblio_base', 'biblio');
$format .= (!empty($firstname) || !empty($initials)) ? ', '.$firstname.' '.$initials : '';
$format = _biblio_author_link($format, $author['cid'], $base, $inline);
$format .= ' ('. $author['cnt'] . ') '. ((user_access('administer biblio'))?_biblio_author_edit_links($author, $path):'');
return $format;
}
function _biblio_author_edit_links($author, $path) {
$base = variable_get('biblio_base', 'biblio');
return l(' ['.t('edit').']', "$path" . $author['cid'] ."/edit/" );
}
function biblio_keyword_page($filter = NULL) {
if ($filter) {
$filter = strtoupper($filter);
$query_ext = ' AND UPPER(SUBSTRING(word,1,1)) = "%s" ';
$header_ext = t(' (which start with the letter "@letter") ',array('@letter' => $filter ));
}
else {
$query_ext = NULL;
$header_ext = NULL;
}
$db_result = db_query('SELECT bkd.*, COUNT(*) AS cnt FROM {biblio_keyword} bk, {biblio_keyword_data} bkd WHERE bkd.kid=bk.kid '. $query_ext.' GROUP BY bk.kid HAVING cnt > 0 ORDER BY word ASC', $filter);
while ($keyword = db_fetch_object($db_result)){
$keywords[] = $keyword;
}
$rows[] = array(array('data' => theme(biblio_alpha_line, 'keywords', $filter), 'colspan' => 3));
for ($i=0; $i < count($keywords); $i+=3) {
$rows[] = array( array('data' => _biblio_format_keyword($keywords[$i]) ),
array('data' => isset($keywords[$i+1])?_biblio_format_keyword($keywords[$i+1]):'' ),
array('data' => isset($keywords[$i+2])?_biblio_format_keyword($keywords[$i+2]):'' ));
}
$header = array(array('data' => t('There are a total of @count keywords !header_ext in the database',array('@count' => count($keywords), '!header_ext' => $header_ext)), 'align' =>'center', 'colspan' => 3));
$output .= theme('table', $header, $rows);
return $output;
}
function _biblio_format_keyword($keyword) {
$base = variable_get('biblio_base', 'biblio');
$format = l(trim($keyword->word), "$base/keyword/$keyword->kid" );
$format .= ' ('. $keyword->cnt . ') ' ;
$edit_link = ' ['.l(t('edit'), "$base/keyword/$keyword->kid/edit/" ).'] ';
$format .= (user_access('administer biblio')) ? $edit_link: '';
return $format;
}