уже 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) - решение я так и не смог найти.
В общем прошу помощи.
Комментарии
чо????
Не исключаю, что я мог ошибиться. Если вы знаете сниппет, который решит мою проблему именно в D7 - то прошу вас, скиньте его сюда.
taxonomy menu
установил, в настройках словаря включил, пробовал создавать меню и в сайдбарах и в топе - везде мой словарь, а точнее его иерархия, отображается не правильно(расположение терминов перепутано, некоторые вообще отсутствуют). в чём может быть причина?
http://xandeadx.ru/blog/drupal/18
а как вывести иерархией я не знаю
Наконец-то я решил эту проблему!
Во первых я глубоко заблуждался насчёт vid - в d7 его можно узнать в базе, в таблице "taxonomy_vocabulary" . Во вторых это дело спокойно выводится сниппетом для drupal6 в который добавлена лишь одна функция.
В общем вот готовый сниппет, который в Drupal7 выводит термины словаря с иерархией и количеством нод:
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>";
?>
Супер спасибо! А не подскажите как сделать чтоб этот сниппет показывал иерархию словаря выше второго уровня?
Попробуйте вот этот сниппет:
<?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>";
}
$list[1] != $depth) {while (
if ($list[1] > $depth) {
$depth++;
echo "\n<ul>";
}
$list[1] < $depth) {if (
$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>";
}
}
?>
В отличие от предыдущего - он выводит иерархию всех уровней словаря. А так же, делает неактивными(без ссылки) те термины, в которых нету нод.
Спасибо!
Нужно вывести грид из терминов словаря во вьюшке чтобы когда на термин кликаю, открывалась страничка вложенных в него подтерминов. Такая вот иерархия. Поставил taxonomy menu но такого не происходит - пробовал делать разные настройки не помогает - можно немного подробнее как с taxonomy menu работать чтобы получить указанный выше результат. Заранее спасибо
А как такое сделать через вьювс не подскажите?
Все таки 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
это группировка а не иерархия
Возможно, это больше вопрос терминологии.
Но получается именно то, что хотят пользователи
Авто
- Жигули
- Москвич
- Мерседес
Самолет
- Ил
- Ту
- Боинг
Настройка группировка по род. термину в views используется как доп. настройка для удобства отображения.
а теперь выведите трёхуровневый словарь
Хм. Согласен, возможно, с трехуровневым словарем этот прием не сработает.
Но у большинства человечества - двухуровневые идеи Третья нога, как правило, лишняя.
SELECT внутри FOREACH при количестве 200-300 замечательное решение проблемы
Ну и количества считаются только для последнего уровня...
а как в этом коде ещё вывести список принадлежащих материалов каждому термину ?