2007-07-30 20:33:48 +00:00
< ? php
// $Id$
/**
* @ file
2007-11-04 15:10:09 +00:00
* Page callbacks for the taxonomy module .
2007-07-30 20:33:48 +00:00
*/
/**
* Menu callback ; displays all nodes associated with a term .
*/
function taxonomy_term_page ( $str_tids = '' , $depth = 0 , $op = 'page' ) {
$terms = taxonomy_terms_parse_string ( $str_tids );
if ( $terms [ 'operator' ] != 'and' && $terms [ 'operator' ] != 'or' ) {
drupal_not_found ();
}
if ( $terms [ 'tids' ]) {
2008-04-14 17:48:46 +00:00
$result = db_query ( db_rewrite_sql ( 'SELECT t.tid, t.name FROM {term_data} t WHERE t.tid IN (' . db_placeholders ( $terms [ 'tids' ]) . ')' , 't' , 'tid' ), $terms [ 'tids' ]);
2007-07-30 20:33:48 +00:00
$tids = array (); // we rebuild the $tids-array so it only contains terms the user has access to.
$names = array ();
while ( $term = db_fetch_object ( $result )) {
$tids [] = $term -> tid ;
$names [] = $term -> name ;
}
if ( $names ) {
$title = check_plain ( implode ( ', ' , $names ));
drupal_set_title ( $title );
switch ( $op ) {
case 'page' :
// Build breadcrumb based on first hierarchy of first term:
$current -> tid = $tids [ 0 ];
2007-10-25 08:24:43 +00:00
$breadcrumb = array ();
2007-07-30 20:33:48 +00:00
while ( $parents = taxonomy_get_parents ( $current -> tid )) {
$current = array_shift ( $parents );
2008-04-14 17:48:46 +00:00
$breadcrumb [] = l ( $current -> name , 'taxonomy/term/' . $current -> tid );
2007-07-30 20:33:48 +00:00
}
2007-10-25 08:24:43 +00:00
$breadcrumb [] = l ( t ( 'Home' ), NULL );
$breadcrumb = array_reverse ( $breadcrumb );
drupal_set_breadcrumb ( $breadcrumb );
2007-07-30 20:33:48 +00:00
2007-11-04 15:10:09 +00:00
$output = theme ( 'taxonomy_term_page' , $tids , taxonomy_select_nodes ( $tids , $terms [ 'operator' ], $depth , TRUE ));
2008-04-14 17:48:46 +00:00
drupal_add_feed ( url ( 'taxonomy/term/' . $str_tids . '/' . $depth . '/feed' ), 'RSS - ' . $title );
2007-07-30 20:33:48 +00:00
return $output ;
break ;
case 'feed' :
2008-04-14 17:48:46 +00:00
$channel [ 'link' ] = url ( 'taxonomy/term/' . $str_tids . '/' . $depth , array ( 'absolute' => TRUE ));
$channel [ 'title' ] = variable_get ( 'site_name' , 'Drupal' ) . ' - ' . $title ;
2007-11-04 15:10:09 +00:00
// Only display the description if we have a single term, to avoid clutter and confusion.
if ( count ( $tids ) == 1 ) {
$term = taxonomy_get_term ( $tids [ 0 ]);
// HTML will be removed from feed description, so no need to filter here.
$channel [ 'description' ] = $term -> description ;
}
2007-07-30 20:33:48 +00:00
$result = taxonomy_select_nodes ( $tids , $terms [ 'operator' ], $depth , FALSE );
2008-02-06 19:38:28 +00:00
$items = array ();
2007-07-30 20:33:48 +00:00
while ( $row = db_fetch_object ( $result )) {
$items [] = $row -> nid ;
}
node_feed ( $items , $channel );
break ;
2007-11-04 15:10:09 +00:00
2007-07-30 20:33:48 +00:00
default :
drupal_not_found ();
}
}
else {
drupal_not_found ();
}
}
}
2007-11-04 15:10:09 +00:00
/**
* Render a taxonomy term page HTML output .
2007-11-11 06:56:44 +00:00
*
2007-11-04 15:10:09 +00:00
* @ param $tids
* An array of term ids .
* @ param $result
* A pager_query () result , such as that performed by taxonomy_select_nodes () .
2007-12-06 09:58:34 +00:00
*
* @ ingroup themeable
2007-11-04 15:10:09 +00:00
*/
function theme_taxonomy_term_page ( $tids , $result ) {
2008-04-14 17:48:46 +00:00
drupal_add_css ( drupal_get_path ( 'module' , 'taxonomy' ) . '/taxonomy.css' );
2008-01-18 16:23:57 +00:00
2007-11-04 15:10:09 +00:00
$output = '' ;
2007-11-11 06:56:44 +00:00
2007-11-04 15:10:09 +00:00
// Only display the description if we have a single term, to avoid clutter and confusion.
if ( count ( $tids ) == 1 ) {
$term = taxonomy_get_term ( $tids [ 0 ]);
2008-01-17 19:36:37 +00:00
$description = $term -> description ;
// Check that a description is set.
if ( ! empty ( $description )) {
$output .= '<div class="taxonomy-term-description">' ;
$output .= filter_xss_admin ( $description );
$output .= '</div>' ;
}
2007-11-04 15:10:09 +00:00
}
2007-11-11 06:56:44 +00:00
2007-11-04 15:10:09 +00:00
$output .= taxonomy_render_nodes ( $result );
2007-11-11 06:56:44 +00:00
2007-11-04 15:10:09 +00:00
return $output ;
}
2007-07-30 20:33:48 +00:00
/**
* Helper function for autocompletion
*/
function taxonomy_autocomplete ( $vid , $string = '' ) {
// The user enters a comma-separated list of tags. We only autocomplete the last tag.
$array = drupal_explode_tags ( $string );
// Fetch last tag
$last_string = trim ( array_pop ( $array ));
$matches = array ();
if ( $last_string != '' ) {
$result = db_query_range ( db_rewrite_sql ( " SELECT t.tid, t.name FROM { term_data} t WHERE t.vid = %d AND LOWER(t.name) LIKE LOWER('%%%s%%') " , 't' , 'tid' ), $vid , $last_string , 0 , 10 );
2008-04-14 17:48:46 +00:00
$prefix = count ( $array ) ? implode ( ', ' , $array ) . ', ' : '' ;
2007-07-30 20:33:48 +00:00
while ( $tag = db_fetch_object ( $result )) {
$n = $tag -> name ;
// Commas and quotes in terms are special cases, so encode 'em.
if ( strpos ( $tag -> name , ',' ) !== FALSE || strpos ( $tag -> name , '"' ) !== FALSE ) {
2008-04-14 17:48:46 +00:00
$n = '"' . str_replace ( '"' , '""' , $tag -> name ) . '"' ;
2007-07-30 20:33:48 +00:00
}
$matches [ $prefix . $n ] = check_plain ( $tag -> name );
}
}
drupal_json ( $matches );
}