Выводим список связанных(родственных) терминов

С помощью данного кода при открытии страницы какого-либо термина можно отобразить все другие термины, связанные с ним.

<?php
if (arg(0) == 'taxonomy' && arg(1) == 'term' && is_numeric(arg(2)) && is_null(arg(3))) {
  $tid = (int)arg(2);
  $result = db_query(db_rewrite_sql('SELECT tid, name FROM {term_relation} INNER JOIN {term_data} ON (tid1 = tid OR tid2 = tid) WHERE (tid1 = %d OR tid2 = %d) AND tid != %d ORDER BY weight, name', '{term_relation}', 'tid'), $tid, $tid, $tid);
  $output = '';
  while ($term = db_fetch_object($result))
  {
    $output .= ((!empty($output)) ? ', '/* <- В этом месте(в одинарных кавычках) вписываем символ или тег, которым будут разделяться выводимые термины( в примере это запятая. Можно, к примеру, заменить запятую HTML-тегом <br />, что-бы вывести список «столбиком».)*/ : '') . l($term->name, "taxonomy/term/$term->tid");
  }
  return $output;
}
?>

Dalay

Комментарии

Здравствуйте.

Как сделать вывод на странице термина вывод его дочерних терминов?

Я переопределяла вывод термина через адрес во views. В соответствующую view в шапку вставляла этот код. И в блок вставляла, который отображается на странице термина. Все равно не отображается.

Этот код работает для терминов из других словарей, связанных с текущим?

Заранее спасибо!

Похоже проблема была в том, что термин был переопределен. Сделала без переопределения - все заработало. А как этот этот вывод еще профильтровать по определенному словарю?

На кой Вам, Лера, сниппеты, если на сайте используется Views? В этом нет никакого смысла.

Кстати, паршивый код. Походу, я его когда-то с d.org скопипастил, не вникая. Как минимум для тех же целей есть готовое taxonomy_get_related() в API.

Да я даже уже и не знаю, чем делать. Перепробовала все возможные варианты.

Сделала каталог по статье "Простой каталог" в druit.

Все было прекрасно, пока не потребовалось сделать этот список связанных терминов.

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

Создала views - термин
Блок

Поля
(Related term) Таксономия: Термин

Relationships
Таксономия: Связанные термины

А в аргументах не могу разобраться.
Наиболее очевидное

Аргументы
Do not use relationship

Action to take if argument is not present: Provide default argument
Load default argument from term page
Load default argument from node page, thats good for related taxonomy blocks
Limit terms by vocabulary
Vocabulary: каталог товаров

Validator: Термин таксономии
Словари Каталог товаров

Argument type: Term name or synonym
Action to take if argument does not validate: Display all values

И в итоге показываются вообще все связанные термины, независимо от текущего.

Как только переделала путь для термина, сразу возникла проблема в поиске аргумента. Путь изменен через Taxonomy Redirect. Выводится как catalog/!tid.

И я не понимаю в аргументах, какие выставлять параметры, чтобы сделать текущий термин аргументом.

Спасибо Вам за отзывчивость.

) Текущий термин(по определенному адресу) и есть аргумент для адреса taxonomy/term/%(или синонима этого адреса, неважно).

Аргументы, при их использовании работают, так же, как и фильтры в Views. Разница в том, что значение не указывается напрямую(как в фильтрах), а берется из текущего адреса страницы. Возможно, это поможет Вам лучше понять свои действия. И... точно ли понятно, что есть такое Related term, не перевод а "по сути"?

А вот теперь после Вашего комментария я уже не уверена в том, что верно понимаю суть Related term ...

На странице редактирования термина в разделе допнастроек селект под "родителями".

А, Вы в этом смысле. Связки-то я уже сделала. Я могу выводить связанные термины. Но не получается установить зависимость от текущего термина. В аргументе вопрос.

Argument type: Term name or synonym - тут косяк. Вам ID термина нужен.

С ID тоже не работает.

Пробовала вставить не отдельным блоком, а вложением.

Аргумент

Action to take if argument is not present:
Display all values

Validator: Термин тасономии
Каталог товаров

Argument type: Term ID

Опять не зацепляет.

Вот почему с тем же аргументом, ноды он выводит только свои, а термины если пытаться вывести через вложение - не хочет. Не понимаю.

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

Я сейчас попробую буржуйское решение. Проблема блока встроенного в блок, который переопределяет вывод термина в том, что он выводит значение, завязанное на наличие нод, которые связывают два этих словаря таксономии. Если есть эти ноды - то термины будут. Если нет - то терминов не будет. И еще - я все таки вывела связанные термины, но их как раз было столько, сколько связанных нод. Убрать дубликаты не удалось.
А плюс сниппета был в том, что в нем отображались связанные термины вне зависимости от существующих товаров. А у меня заказчица непредсказуемая. То есть непонятно, будут ли еще все ноды во всех этих категориях. А связь просто через связанные термины словарей, минуя привязку к нодам - была оптимальной. Но как только я переопределяла страницу taxonomy_term_path($term). Например catalog/stroimaterialy/plitka или fabrika/granitifiandre - то аргумент пропадал. Он же ориентировался ID. А у меня в адресе его не было.

Вы переопределили taxonomy_term_path()? ))

Да,
я сделала перенаправление в Taxonomy redirect на fabrika/!tid
Pathauto fabrika/[catpath-raw]
и сделала отображение термина по адресу fabrika/%

в том-то все и дело...

Я не могла оставить taxonomy/term/%. У меня там разделы в каталоге и разные шаблоны оформления для облициовчных материалов, для мебели для дома, для электротоваров... Тогда пришлось бы переписывать каждую page.tpl для каждого номера :) А там терминов 200 в словаре.

Жесть. Вам уже слышны проклятия из будущего в свой адрес от заказчицы и того, кого наймут заниматься сайтом после?

Я сделала этот сайт 2 года назад. Был сайт визитка. Теперь решили сделать магазин. Я не думаю, что будет кто-то другой после. Скорее всего это буду тоже я.
Я вообще-то его бесплатно делаю по знакомству. Не думаю, что кто-то на такое решится вместо меня :)

Дизайн, кстати не я делала. Мне прислали от дизайнера. Сама бы я на такие дизайнерские изыски не пошла. Отговаривала от такого дизайна. Без вариантов.

В общем, все прекрасно работает, если оставлять адрес типа taxonomy/term/433. Получилось в таком адресе вывести и сниппет в блоке от Вас с родственными терминами. И такой же блок views - term. Но если менять что-то в адресе, даже если оставлять tid например делать такой адрес factory/agape/433 - связь с терминов исчезает.

)Конечно не работает, учитывая, что сниппет внутри условия с проверкой на конкретные arg(0) == 'taxonomy' и arg(1) == 'term' относительно "внутреннего" пути.

Попробую договориться как-то без перенаправлений...
Спасибо Вам.

Имелось ввиду, что раз уж внутренние пути переопределены, то и в условия впишите соответствующие фрагменты адреса. Функция arg() ничего сверхъестественного не делает. Есть и другие у друпала замечательные функции для обработки путей.

И не нужно новых видов делать, делайте новый блок в дефолтовом admin/build/views/edit/taxonomy_term.