1. Главная
  2. Форумы
  3. Техподдержка Drupal
  4. Решение проблем

Вывод словаря(с иерархией) в 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>";
?>

Аватар пользователя 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 Третья нога, как правило, лишняя.

Логотип drupal.ru

Содержимое сайта публикуется на условиях CreativeCommons Attribution-ShareAlike 3.0 или более поздней версии. Программные коды в тексте статей — на условиях GNU GPL v2 или более поздней версии.

Документация по совместной работе с репозиторием drupal.ru – https://docs.drupal.ru/code

Drupal – торговая марка Дриса Бёйтарта

12+

AltStyle によって変換されたページ (->オリジナル) /