Do you want to print a hierarchical list of taxonomy terms with corresponding feeds in Drupal 7?
If so, then put the following code in a module:
<?php
/**
* Implements hook_menu().
*/
function YOUR_MODULE_menu() {
$items['termlisting'] = array(
'title' => 'Term listing',
'page callback' => '_YOUR_MODULE_kategorieliste',
'page arguments' => array('1'),
'access arguments' => array('access content'),
'type' => MENU_CALLBACK, // no automatic menu entry
);
return $items;
}
/**
* Builds a nested list of taxonomy terms for a vocabulary.
* Very simple, could be optimized.
* Algorithm from http://drupal.org/node/223675#comment-900999
*/
function _YOUR_MODULE_vocabulary_tree($vid) {
$depth = 0;
$num_at_depth = 0;
$tree = taxonomy_get_tree($vid);
$markup = "<ul class=\"termlist\">\n<li class=\"clearfix\">";
foreach ($tree as $term) {
$diffdepth=0;
if ($term->depth > $depth) {
$markup .= "\n<ul>\n<li class=\"clearfix\">";
$depth = $term->depth;
$num_at_depth = 0;
}
if ($term->depth < $depth) {
$diffdepth= $depth -$term->depth;
while ($diffdepth > 0){
$markup .= "</li>\n</ul>\n";
$diffdepth--;
}
$depth = $term->depth;
}
if (($term->depth == $depth) && ($num_at_depth > 0)) {
$markup .= "</li>\n<li class=\"clearfix\">";
}
$markup .= _YOUR_MODULE_build_term_with_feed($term->name, array($term->tid));
$num_at_depth++;
}
$markup .= "</li>\n</ul>\n";
return $markup;
}
/**
* Builds a page which prints hierarchically the kategory taxonomy terms.
*/
function _YOUR_MODULE_kategorieliste($vid = 2) {
$markup = '<p>Introduction text</p>';
$markup .= _YOUR_MODULE_vocabulary_tree($vid);
$markup .= "<h2>Combinations</h2>\n";
$markup .= "<ul class=\"termlist\">\n";
$markup .= "<li>" . _YOUR_MODULE_build_term_with_feed('Terms X+Y', array(19, 20)) . "</li>\n";
$markup .= "<li>" . _YOUR_MODULE_build_term_with_feed('Terms X+Y+ ...', array(14, 15, 18, 19, 20, 21, 16, 17)) . "</li>\n";
$markup .= "</ul>\n";
$build = array();
$build['terms'] = array(
'#weight' => -5,
'#prefix' => '<div class="term-listing">',
'#markup' => $markup,
'#suffix' => '</div>',
);
return $build;
}
/**
* Builds a link with parameter name with (count) and the corresponding feed.
* @param $name
* Name of the link
* @param $tids
* Array of tids
* @return
* A link with parameter name with (count) and the corresponding feed.
*/
function _YOUR_MODULE_build_term_with_feed($name, $tids) {
$count = db_query("SELECT COUNT(nid) FROM {taxonomy_index} WHERE tid IN (:tids) ", array(':tids' => implode(',', $tids)))->fetchField();
$markup = l($name . ' (' . $count . ')', 'taxonomy/term/'. implode('+', $tids), array('attributes' => (array('class' => array('termtext')))));
$markup .= ' ' . YOUR_MODULE_feed_icon(array('url' => 'taxonomy/term/' . implode('+', $tids) . '/all/feed', 'title' => $name));
return $markup;
}
/**
* Copy of theme_feed_icon which avoids double encoding of &
* due to issue http://drupal.org/node/1211668.
* Uses !feed-title instead of @feed-title for t().
*/
function YOUR_MODULE_feed_icon($variables) {
$text = t('Subscribe to !feed-title', array('!feed-title' => $variables['title']));
if ($image = theme('image', array('path' => 'misc/feed.png', 'width' => 16, 'height' => 16, 'alt' => $text))) {
return l($image, $variables['url'], array('html' => TRUE, 'attributes' => array('class' => array('feed-icon'), 'title' => $text)));
}
}
?>
This code is based on http://drupal.org/node/223675#comment-900999.
Some styling:
.term-listing {
margin-top: 14px;
}
.termlist .termtext {
margin-right: 18px;
}
#page .term-listing a.feed-icon {
bottom: -2px;
border-bottom: none;
}
#block-block-1 a.feed-icon img {
position: relative;
bottom: -3px;
border-bottom: none;
}