Вывод словаря(с иерархией) в Drupal7.

Аватар пользователя GENbl4 GENbl4 29 сентября 2011 в 15:40

уже 3 дня мучаюсь с этим вопросом. поиск так и не дал результатов, поэтому прошу помощи.

Задача стоит следующая: сделать удобную навигацию по терминам словаря.

Значит имеем словарь с иерархической структурой:

Продаю
- Бытовая техника
-- Аудио-Видео
Куплю
- Бытовая техника
-- Аудио-Видео
Меняю
- Бытовая техника
-- Аудио-Видео

Мне нужно вывести его в в точно таком же виде + указать количество нод:

Продаю(кол-во нод)
- Бытовая техника(кол-во нод)
-- Аудио-Видео(кол-во нод)

Куплю(кол-во нод)
- Бытовая техника(кол-во нод)
-- Аудио-Видео(кол-во нод)

Меняю(кол-во нод)
- Бытовая техника(кол-во нод)
-- Аудио-Видео(кол-во нод)

Насколько я понял(благодаря поиску):
- Views умеет считать ноды, но не умеет отображать иерархии и это не лечится.
- Все возможные сниппеты, которые я находил, пригодны лишь для 6 версии друпала (из за того, что в семёрке отсутствует vid)

А теперь, что вы посоветуете ? Если это сделать нереально - предложите свои варианты организации навигации по терминам словаря.

По поводу альтернативных вариантов навигации:
Я, например, пробовал сделать выпадающее меню с Expose filter - всё получилось, но навигация ужасно неудобная(в словаре большое кол-во терминов).
Почти такое же меню я пробовал сделать с помощью "Hierarchical Select Taxonomy Views" - но он на отрез отказался работать (ошибка Fatal error: Call to undefined function _hierarchical_select_setup_js() in hs_taxonomy_views_handler_filter_term_node_tid.inc on line 26) - решение я так и не смог найти.

В общем прошу помощи.

Комментарии

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 29 сентября 2011 в 15:59

"GENbl4" wrote:

- Все возможные сниппеты, которые я находил, пригодны лишь для 6 версии друпала (из за того, что в семёрке отсутствует vid)

чо????

Аватар пользователя GENbl4 GENbl4 29 сентября 2011 в 16:23

RxB wrote:
"GENbl4" wrote:

- Все возможные сниппеты, которые я находил, пригодны лишь для 6 версии друпала (из за того, что в семёрке отсутствует vid)

чо????

Не исключаю, что я мог ошибиться. Если вы знаете сниппет, который решит мою проблему именно в D7 - то прошу вас, скиньте его сюда.

Аватар пользователя GENbl4 GENbl4 29 сентября 2011 в 18:04

xxandeadxx wrote:
taxonomy menu

установил, в настройках словаря включил, пробовал создавать меню и в сайдбарах и в топе - везде мой словарь, а точнее его иерархия, отображается не правильно(расположение терминов перепутано, некоторые вообще отсутствуют). в чём может быть причина?

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 29 сентября 2011 в 16:24

"GENbl4" wrote:

Не исключаю, что я мог ошибиться. Если вы знаете сниппет, который решит мою проблему именно в D7 - то прошу вас, скиньте его сюда.


"xxandeadxx" wrote:
taxonomy menu

Аватар пользователя GENbl4 GENbl4 29 сентября 2011 в 21:57

Наконец-то я решил эту проблему!
Во первых я глубоко заблуждался насчёт vid - в d7 его можно узнать в базе, в таблице "taxonomy_vocabulary" . Во вторых это дело спокойно выводится сниппетом для drupal6 в который добавлена лишь одна функция.

В общем вот готовый сниппет, который в Drupal7 выводит термины словаря с иерархией и количеством нод:

<?php

function d7_taxonomy_term_count_nodes($tid){
    $query = db_select('taxonomy_term_data', 't');
    $query->join('taxonomy_index', 'i', 'i.tid = t.tid');
    $query->addField('i', 'nid');
    $query->condition('t.tid', $tid);
    $query->addTag('node_access');
    $tids = $query->execute()->fetchCol();
    return count($tids);
}

$vid = 31; /* <---- вставляем vid словаря */
$terms = taxonomy_get_tree($vid);
print "<ul>";
foreach ( $terms as $term ) {
$tcount = d7_taxonomy_term_count_nodes($term->tid);
$children_terms = taxonomy_get_children($term->tid);
if ($term->depth == 0) {
print "<li>";
print l($term->name." (".$tcount.")",'taxonomy/term/'
.$term->tid, array('title' => $tcount." posts in "
.$term->name));
if ($children_terms) {
print "<ul>";
foreach ( $children_terms as $children_term ) {
$t_children_count =
d7_taxonomy_term_count_nodes($children_term->tid);
print "<li>";
print l($children_term->name." (".$t_children_count.")",
'taxonomy/term/'.$children_term->tid, array('title' =>
 $t_children_count." posts in ".$children_term->name));
print "</li>";
}/* end foreach children */
print "</ul>";
}
print "</li>";
}
} /* end foreach */
print "</ul>";
?>

Аватар пользователя sozdatel sozdatel 30 сентября 2011 в 18:35

Супер спасибо! А не подскажите как сделать чтоб этот сниппет показывал иерархию словаря выше второго уровня?

Аватар пользователя GENbl4 GENbl4 30 сентября 2011 в 22:26

sozdatel wrote:
Супер спасибо! А не подскажите как сделать чтоб этот сниппет показывал иерархию словаря выше второго уровня?

Попробуйте вот этот сниппет:


<?php

function d7_taxonomy_term_count_nodes($tid){
    
$query db_select('taxonomy_term_data''t');
    
$query->join('taxonomy_index''i''i.tid = t.tid');
    
$query->addField('i''nid');
    
$query->condition('t.tid'$tid);
    
$query->addTag('node_access');
    
$tids $query->execute()->fetchCol();
    return 
count($tids);
}

$vid 33;  // Номер словаря
$pole = array();
$items = array();
$terms taxonomy_get_tree($vid);
//var_dump($terms);

foreach ( $terms as $term ) {
  
$count d7_taxonomy_term_count_nodes($term->tid);
  
$pole[]=Array ((($count) ? l($term->name"taxonomy/term/$term->tid")." (".$count.")" $term->name), $term->depth$count$term->tid);
}
$depth =-1;
foreach (
$pole as $list) {
  
//$depth- глубина предыдущего уровня
  //$list[1] - глубина текущего элемента
  
if ($list[1] == $depth) {
    echo 
"</li>";

  }
  while (

$list[1] != $depth) {
    if (
$list[1] > $depth) {
      
$depth++;
      echo 
"\n<ul>";

    }
    if (

$list[1] < $depth) {
      
$depth--;
      echo 
"\n</li>\n</ul>";
    }
  }

  echo 

"\n<li>$list[0]";
  
$depth=$list[1];
}

//Закрываем все открытые теги до нулевого уровня:
$depth=0;
while (
$list[1] != $depth) {
  if (
$list[1] > $depth) {
    
$depth++;
    echo 
"</li>\n</ul>";
  }
}
?>

В отличие от предыдущего - он выводит иерархию всех уровней словаря. А так же, делает неактивными(без ссылки) те термины, в которых нету нод.

Аватар пользователя Миша Романов Миша Романов 19 октября 2011 в 10:40

Нужно вывести грид из терминов словаря во вьюшке чтобы когда на термин кликаю, открывалась страничка вложенных в него подтерминов. Такая вот иерархия. Поставил taxonomy menu но такого не происходит - пробовал делать разные настройки не помогает - можно немного подробнее как с taxonomy menu работать чтобы получить указанный выше результат. Заранее спасибо

Аватар пользователя wictdrup wictdrup 29 января 2012 в 20:14

Все таки views может отображать иерархию таксономии.
http://www.phpjavascript.com/drupal-views-taxonomy-parent-term-and-child...
Если коротко:
1. В связях указываем
Add “Relationships”

Select “Taxonomy: Parent Term” (use the default settings)

2. Добавляем поля
Add Fields (родительский термин)

Select “Taxonomy: Term”
Relationship: Parent

Add Fields (подчиненный термин)

Again Select “Taxonomy Terms”
Relationship: Do not use a relationship

3. Дополнительно можно сгруппировать по род. термину и т.д.

И будем вам иерархия терминов в views

Аватар пользователя wictdrup wictdrup 30 января 2012 в 19:54

Возможно, это больше вопрос терминологии.
Но получается именно то, что хотят пользователи
Авто
- Жигули
- Москвич
- Мерседес
Самолет
- Ил
- Ту
- Боинг

Настройка группировка по род. термину в views используется как доп. настройка для удобства отображения.

Аватар пользователя wictdrup wictdrup 1 февраля 2012 в 19:24

Хм. Согласен, возможно, с трехуровневым словарем этот прием не сработает.
Но у большинства человечества - двухуровневые идеи Smile Третья нога, как правило, лишняя.

Аватар пользователя PVasili PVasili 24 апреля 2018 в 12:28

GENbl4 wrote:

Наконец-то я решил эту проблему!


SELECT внутри FOREACH при количестве 200-300 замечательное решение проблемы Smile

Аватар пользователя morgusha morgusha 16 сентября 2021 в 11:33

а как в этом коде ещё вывести список принадлежащих материалов каждому термину ?