You are here

function views_plugin_style_summary_taxonomy::render in Views Hacks 6

Same name and namespace in other branches
  1. 7 views_summary_taxonomy/views_plugin_style_summary_taxonomy.inc \views_plugin_style_summary_taxonomy::render()

File

views_summary_taxonomy/views_plugin_style_summary_taxonomy.inc, line 58

Class

views_plugin_style_summary_taxonomy

Code

function render() {
  $argument = $this->view->argument[$this->view->build_info['summary_level']];
  $this->terms = array();
  foreach ($this->view->result as $row) {
    $this->terms[$row->{$argument->base_alias}] = $row;
  }

  // Get the taxonomy tree. We're going to heavily modify it...
  $tree = taxonomy_get_tree($this->options['taxonomy']);

  // Reverse sort it: children at the front.
  usort($tree, array(
    $this,
    'term_depth_compare',
  ));

  // Add the tid as key.
  $tree = array_combine(array_map(array(
    $this,
    'term_tid',
  ), $tree), $tree);

  // Initialize counts as copied from view results.
  array_walk($tree, array(
    $this,
    'term_count',
  ), $argument);

  // Accumulate children counts.
  // This works without recursion because the array is sorted in reverse.
  foreach ($tree as $tid => $term) {
    foreach ($term->parents as $pid) {
      if (!$pid) {
        continue;
      }

      // parent tid = 0 means no parent
      $tree[$pid]->aggregate_count += $term->aggregate_count;
    }
  }

  // Now we're ready to render it!
  $url_options = array();
  if (!empty($this->view->exposed_raw_input)) {
    $url_options['query'] = $this->view->exposed_raw_input;
  }
  $item_list = array();
  $children = array();
  foreach ($tree as $tid => $term) {
    if (!$term->aggregate_count && $this->options['hide_zero']) {
      continue;
    }
    $args = $this->view->args;
    $args[$argument->position] = $argument
      ->summary_argument($this->terms[$tid]);
    $item = array();
    $path = $this->view
      ->get_url($args);
    if (!empty($this->options['path']) && module_exists('token')) {
      $path = drupal_strtolower(token_replace($this->options['path'], 'taxonomy', $term));
    }
    $item['data'] = l($term->name, $path, $url_options);
    if (!empty($this->options['count'])) {
      $count = !empty($argument->definition['accept depth modifier']) && empty($this->options['count_no_aggregate']) ? $term->aggregate_count : $term->count;
      $item['data'] .= ' (' . $count . ')';
    }
    $item['weight'] = $term->weight;
    if (isset($children[$tid])) {
      usort($children[$tid], array(
        $this,
        'item_weight_compare',
      ));
      $item['children'] = $children[$tid];
    }
    foreach ($term->parents as $pid) {
      if (!$pid) {
        $item_list[] = $item;
      }
      else {
        $children[$pid][] = $item;
      }
    }
  }
  usort($item_list, array(
    $this,
    'item_weight_compare',
  ));
  return theme('item_list', $item_list);
}