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 .
*/
2008-09-19 20:25:03 +00:00
function taxonomy_term_page ( $terms , $depth = 0 , $op = 'page' ) {
2007-07-30 20:33:48 +00:00
if ( $terms [ 'operator' ] != 'and' && $terms [ 'operator' ] != 'or' ) {
drupal_not_found ();
}
2008-09-19 20:25:03 +00:00
$str_tids = $terms [ 'str_tids' ];
2007-07-30 20:33:48 +00:00
if ( $terms [ 'tids' ]) {
2009-01-14 21:16:21 +00:00
$result = db_query ( db_rewrite_sql ( 'SELECT t.tid, t.name FROM {taxonomy_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:
2008-12-19 03:55:23 +00:00
$current = ( object ) array (
'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-09-19 02:43:40 +00:00
$breadcrumb [] = l ( $current -> name , taxonomy_term_path ( $current ));
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 );
2008-04-14 17:48:46 +00:00
drupal_add_feed ( url ( 'taxonomy/term/' . $str_tids . '/' . $depth . '/feed' ), 'RSS - ' . $title );
2009-01-27 00:22:27 +00:00
drupal_add_css ( drupal_get_path ( 'module' , 'taxonomy' ) . '/taxonomy.css' );
$build = array ();
// Only display the description if we have a single term, to avoid clutter and confusion.
if ( count ( $tids ) == 1 ) {
$term = taxonomy_term_load ( $tids [ 0 ]);
if ( ! empty ( $term -> description )) {
$build [ 'term_description' ] = array (
'#markup' => filter_xss_admin ( $term -> description ),
'#weight' => - 1 ,
'#prefix' => '<div class="taxonomy-term-description">' ,
'#suffix' => '</div>' ,
);
}
}
if ( $nids = taxonomy_select_nodes ( $tids , $terms [ 'operator' ], $depth , TRUE )) {
$nodes = node_load_multiple ( $nids );
$build += node_build_multiple ( $nodes );
$build [ 'pager' ] = array (
'#markup' => theme ( 'pager' , NULL , variable_get ( 'default_nodes_main' , 10 )),
'#weight' => 5 ,
);
}
else {
$build [ 'no_content' ] = array (
'#prefix' => '<p>' ,
'#markup' => t ( 'There are currently no posts in this category.' ),
'#suffix' => '</p>' ,
);
}
return drupal_get_page ( $build );
2007-07-30 20:33:48 +00:00
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 ) {
2008-09-19 20:25:03 +00:00
$term = taxonomy_term_load ( $tids [ 0 ]);
2007-11-04 15:10:09 +00:00
// 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
2009-01-27 00:22:27 +00:00
$nids = taxonomy_select_nodes ( $tids , $terms [ 'operator' ], $depth , FALSE );
2007-07-30 20:33:48 +00:00
2009-01-27 00:22:27 +00:00
node_feed ( $nids , $channel );
2007-07-30 20:33:48 +00:00
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 ();
}
}
}
2008-09-19 20:25:03 +00:00
/**
* Page to edit a vocabulary term .
*/
function taxonomy_term_edit ( $term ) {
if ( isset ( $term )) {
2008-10-13 00:33:05 +00:00
drupal_set_title ( $term -> name );
2008-09-19 20:25:03 +00:00
return drupal_get_form ( 'taxonomy_form_term' , taxonomy_vocabulary_load ( $term -> vid ), ( array ) $term );
}
return drupal_not_found ();
}
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 != '' ) {
2009-01-14 21:16:21 +00:00
$result = db_query_range ( db_rewrite_sql ( " SELECT t.tid, t.name FROM { taxonomy_term_data} t WHERE t.vid = :vid AND LOWER(t.name) LIKE LOWER(:last_string) " , 't' , 'tid' ), array (
2008-09-15 20:48:10 +00:00
':vid' => $vid ,
2008-08-21 19:36:39 +00:00
':last_string' => '%' . $last_string . '%' ,
), 0 , 10 );
2007-07-30 20:33:48 +00:00
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 );
}