Drupal — показывать дочерние термины текущего термина, только если дочерние элементы существуют — требуется модификация кода

Боровшись с проблемой отображения дочерних терминов для данного термина таксономии в блоке, я, наконец, наткнулся на фрагмент кода, который делает именно то, что я хочу здесь

В соответствии с инструкциями я добавил следующее в свой template.php

function themename_child_terms($vid = 1) {
  if(arg(0) == 'taxonomy' && arg(1) == 'term') {   
    $children = taxonomy_get_children(arg(2), $vid);
      if(!$children) {
        $custom_parent = taxonomy_get_parents(arg(2));
          $parent_tree = array();
          foreach ($custom_parent as $custom_child => $key) {
            $parent_tree = taxonomy_get_tree($vid, $key->tid);
          }
          $children = $parent_tree;
      }

    $output = '<ul>';
    foreach ($children as $term) {
      $output .= '<li>';
      $output .= l($term->name, 'taxonomy/term/' . $term->tid);
      $output .= '</li>';
    }
    $output .= '</ul>';

    return $output;
  }
}

Затем я создал блок и добавил:

<?php // $vid is the vocabulary id.
    print themename_child_terms($vid = 1);
?>

Это отлично показывает дочерние термины текущего термина. Тем не менее, он показывает ВСЕ термины, которые существуют в рамках родительского термина, даже если нет части контента, использующего этот термин.

например просматривая страницу со всеми элементами в термине 1, я получаю

ребенок 1
ребенок 2
ребенок 3

правильно указано в блоке. Но если нет элементов контента, помеченных, например, как «ребенок 3», он все равно будет отображаться в блоке. Это не очень полезно, так как ссылается на пустую страницу терминов. Как бы я изменил код, чтобы показывать только дочерние элементы, с которыми действительно связаны элементы. Таким образом, если нет детей с тегом «Ребенок 3», этот термин не будет отображаться. Это простая модификация?

Большое спасибо за любые решения.

Ник

Работа с Друпал 6.


person NickTr    schedule 29.05.2013    source источник


Ответы (1)


Спасибо пользователю jerdiggity за публикацию следующего ответа на drupal.stackexchange здесь. Работает отлично.


Хм... Я бы попробовал что-то вроде этого:

Измените эту часть кода:

foreach ($children as $term) {
  $output .= '<li>';
  $output .= l($term->name, 'taxonomy/term/' . $term->tid);
  $output .= '</li>';
}

к чему-то вроде этого:

// Avoid unnecessary "Invalid foreach" errors showing up in the log:
if (!empty($children)) {
  // If not empty, run the foreach loop:
  foreach ($children as $term) {
    // Then check to see if any nodes exist for that term id:
    $number_of_nodes = taxonomy_term_count_nodes($term->tid);
    // If there ARE nodes...
    if ($number_of_nodes > 0) {
      // ... then add them to the output:
      $output .= '<li>';
      $output .= l($term->name, 'taxonomy/term/' . $term->tid);
      $output .= '</li>';
    }
  }
}

Надеюсь, это поможет... :)

person NickTr    schedule 03.06.2013