Views по таксономии, не могу настроить чтобы корректно работало к деревом терминов

Главные вкладки

Аватар пользователя ex 2-425 ex 2-425 29 апреля 2009 в 17:49

Пусть у нас есть таксономия, скажем, departments, которая отражает структуру предприятия. Она имеет вид, в скобках указаны ноды имеющие данные термины:

departments
|
|---IT (About IT)
|    |
|    |---Managers (Lena, Petya)
|    |---Programmers (Nataly)
|    |---Admins (Vasily)
|---Research (About Research)
     |---Managers (Sergey)
     |---Scientists (Max, Vitaly)

Ноды могут иметь термины любого уровня вложенности, то есть есть, например ноды с термином IT и есть IT/Admins

Pathauto настроен таким образом, что для каждой ноды генерится путь вида IT/Admins/Vasily, тут всё в порядке.

Мне хотелось бы чтобы view выводил все ноды, имеющий термин указанный в аргументе и только его, без терминов ниже по иерархии.
Например, при аргументе Research должна выводится только нода About Research, при аргументе IT/Managers выводились бы ноды Lena и Petya. Аргументы Managers и IT/Scientists должны выдавать ошибку, потому что ломают структуру.

Пример который идёт вместе с views выдаёт все ноды ниже по иерархии, если в нём убрать Taxonomy: Term ID depth modifier, то теряется возможность использовать вложенность.

Вопрос, скорее всего ламерский, но не смог я на него найти ответа Sad

Заранее спасибо за помощь.

Комментарии

Аватар пользователя ivlis@drupal.org ivlis@drupal.org 5 мая 2009 в 21:48

Решение оказалось не особо тривиальным Smile Нужно создать views с аргументом TermID, поставить валидацию php и вставить такой код:

<?php
$result=TRUE;
$parent=0;
$term_ok=-1;
foreach($view->args as $arg){
$terms=taxonomy_get_term_by_name($arg);
if (empty($terms)){ //Test if term exists
$result=FALSE;
break;
}else{
foreach ($terms as $term) {
$cur_parents = taxonomy_get_parents($term->tid);
if ( (empty($cur_parents)) && ($parent===0) ){
$parent=$term->tid;
$term_ok=$term;
break;
}else{
foreach($cur_parents as $cur_parent){
if ($cur_parent->tid===$parent){
$parent=$term->tid;
$term_ok=$term;
break 2;
}
}
$result=FALSE;
break 2;
}
}
}
}
$handler->argument=$term_ok->tid;
return $result;
?>