Функция возвращает tid-ы всех дочерних терминов независимо от глубины ребёнка:
Способ 1:
Подходит для словарей с большим количеством терминов — делается несколько запросов, количеством равным уровню вложенности самого глубокого термина
/**
* Return all term child tids.
*/
function helper_get_all_term_child_tids($tid) {
$query = db_select('taxonomy_term_data', 'd');
$query->fields('d', array('tid'));
$query->innerJoin('taxonomy_term_hierarchy', 'h', 'd.tid = h.tid');
$query->condition('h.parent', $tid);
$child_tids = $query->execute()->fetchCol();
if ($child_tids) {
$child_tids = array_merge($child_tids, helper_get_all_term_child_tids($child_tids));
}
return $child_tids;
}
Способ 2:
Подходит для не очень больших словарей — делается один запрос на получение всех терминов и отбираются только дочерние
/**
* Return all term child tids.
*/
function helper_get_all_term_child_tids($tid, $vid) {
$child_tids = array();
foreach (taxonomy_get_tree($vid, $tid) as $terms) {
$child_tids[] = $terms->tid;
}
return $child_tids;
}
Пример использования:
/**
* Tree:
* Term 1
* -- Term 2
* -- Term 3
* ---- Term 4
* Term 5
* -- Term 6
* -- Term 7
* Term 8
*/
helper_get_all_term_child_tids(1); // array(2, 3, 4);
helper_get_all_term_child_tids(3); // array(4);
helper_get_all_term_child_tids(5); // array(6, 7);
Написанное актуально для
Drupal 7
Комментарии
Для Способа 1 - я бы еще добавил сортировку по весу :D
Можно поинтересоваться почему вы всегда настойчиво используете db_select, а не db_query. Мне сложно придумать пример когда в этой функции потребуется вмешательство внешних модулей для изменения запроса. Зачем лишние и ненужные операции?
Denis, почему сразу лишние и ненужные операции?
Как на меня, конструктор запросов имеет заметные преимущества, такие как,
читаемость и гибкость при построение динамических запросов
drupal way
2 Андрей, я ж не говорю про все запросы. Я говорю про конкретно этот.
Просто вот из Community Documentation:
Note: in 90% of select query use cases you will have a static query. If in a critical performance path, you should use db_query() and friends instead of db_select() for performance reasons. Only use dynamic queries if the query parts vary (example: adding WHERE conditions depending on the context) or if they should be alterable (example: node access).
Denis, на счет производительности, тама разницаа не велика.
У xandeadx, где-то была сравнительная статистика
Добавить комментарий