drupal taxonomy term depth(深度)计算

Submitted by admin on Wed, 06/24/2015 - 16:58

Drupal并没有提供API来获得term的dpeth;但是我们仍然有方法获得。本文分享两种方法,供有需要读者自行选择。

1:自行构造函数,通过数据库查询方式来获得。

function get_term_depth($tid) {
 $limit = 9;
 $depth = 1;
 while($parent = db_query('SELECT parent FROM {taxonomy_term_hierarchy} WHERE tid = :tid', array(':tid' => $tid))->fetchField()) {
    $depth++;
    $tid = $parent;
    if($depth > $limit) {
      break;
    }
  }
  return $depth;
}

2:利用ctools

ctools有个子模块,叫做term_depth,估计大部分人都没注意过这个模块。这个模块提供一个隐藏的函数_term_depth,也可以用来计算term的depth。

经过一番摸索,下面提供可以调用该函数的方法。

ctools_plugin_load_function('ctools', 'access', 'term_depth', '_term_depth');
$tid = 2;
echo _term_depth($tid);

如下是ctools提供的_term_depth函数原型;用到了静态变量与递归函数,兼顾通用性与性能之间的平衡,值得借鉴。

function _term_depth($tid) {
  static $depths = array();

  if (!isset($depths[$tid])) {
    $parent = db_select('taxonomy_term_hierarchy', 'th')
      ->fields('th', array('parent'))
      ->condition('tid', $tid)
      ->execute()->fetchField();

    if ($parent == 0) {
      $depths[$tid] = 1;
    }
    else {
      $depths[$tid] = 1 + _term_depth($parent);
    }
  }

  return $depths[$tid];
}

完成此文后,经过调查,发现还有第三种方式获得term的深度,堪称神来之笔;不罗嗦了,代码如下:

count(taxonomy_get_parents_all($tid));

同时也发现相关讨论,链接如下,供参考。

https://www.drupal.org/node/886526


总结下,实现同一个目的,使用Drupal的话,一般情况下都至少有两种以上方案供选择。这样对初学者来说是很大的挑战;但是一旦完成这个挑战,则会完成自身华丽丽的提升。