Таксономия (делаем ее немного практичнее).
Прислано: Santa Claus
вт, 31/07/2007 - 22:07
Большинство сайтов, построенных на друпале, используют таксономию, которые хранятся в специальных словарях), что довольно успешно помогает систематизировать материал сайта по определенным признакам.
Каждая страница может содержать в себе сразу по несколько терминов из разных словарей. И, когда таких терминов становится много, наш сайт может превратиться в кашу.
Приведу грубый пример:
Сайт автомобильной тематики, где каждая страница (нода) - это описание конкретной марки автомобиля.
Чтобы по смыслу связать между собой страницы сайта, мы используем термины в нескольких словарях.
Словари (термины):
- Марка автомобиля (мерседес, опель, запорожец и т.д.)
- Объем двигателя [л] (менее 0,5; 0,5-1; 1-1,5 ... 6 и более)
- Тип двигателя (бензин, дизель)
- Потребление топлива [л/100км] (до 6, 6-10, 10-14, более 14)
...автолюбитель, чтобы подробно систематизировать каждую марку автомобиля, таких словарей может понапридумывать огромное количество.
В итоге мы получаем страницу следующего вида:
Заголовок - Мерседес 320SL
Текст - Описание модели
Категории: мерседес, 4-6, бензин, более 14, и т.д. и т.п.
Уже в этих терминах можно немного запутаться, а если словарей будет еще больше и они будут содержать специфическую информацию?..
Чтобы все стало красиво и понятно, нам нужно отбразить названия словарей, из которых берутся соотв. категории.
Заголовок - Мерседес 320SL
Текст - Описание модели
Марка автомобиля: мерседес, Объем двигателя: 4-6, Тип двигателя: бензин, Потребление топлива: более 14, ...
Если я Вас убедил в необходимости подобного отображения терминов, тогда смотрим, как это делается.
1. берем файл темы, которая используется на сайте /themes/current_theme/node.tpl.php
2. находим строки:
<?php if ($taxonomy): ?> <div class="terms"><?php print $terms ?></div> <?php endif;?>
и меняем их на:
<?php if ($terms): ?> <?php $vocabularies = taxonomy_get_vocabularies(); foreach($vocabularies as $vocabulary) { if ($vocabularies) { $terms = taxonomy_node_get_terms_by_vocabulary($node->nid, $vocabulary->vid); if ($terms) { print '<div class="terms"><h1>' . $vocabulary->name . ':</h1> '; foreach ($terms as $term) { print l($term->name, taxonomy_term_path($term->tid), array('title' => $term->description) ) . ' '; } print '</div>'; } } } ?> <?php endif; ?>
Данное решение удалось найти не сразу, оно пряталось тут: http://drupal.org/node/53089
- Santa Claus's blog
- Для комментирования войдите или зарегистрируйтесь
спасибо, как раз остро назрела подобная оптимизация.
очень логичное решение.
- Для комментирования войдите или зарегистрируйтесь
Отличная идея. Действительно то, что нужно!
- Для комментирования войдите или зарегистрируйтесь
ПАСИБА
- Для комментирования войдите или зарегистрируйтесь
спасибо
- Для комментирования войдите или зарегистрируйтесь
только строчка
if ($vocabularies) {
должна быть перед
foreach($vocabularies as $vocabulary) {
и ссылка http://drupal.org/node/133223
- Для комментирования войдите или зарегистрируйтесь
С чего это их нужно менять? Все правильно, все работает. Но за ссылку спасибо - там как раз показано, каким образом отобразить словари и термины с использованием списков (UL и LI).
- Для комментирования войдите или зарегистрируйтесь
ну тогда
if ($vocabulary)
- Для комментирования войдите или зарегистрируйтесь
Thank you Very Much ...
Как раз начал было думать над этим вопросом - сам сайт делаю сейчас и вижу это... как раз вовремя.
Спасибо :)
Удачи!
Gendalf.
- Для комментирования войдите или зарегистрируйтесь
taxonomy_get_parents и тд и тп, смотрим на api.drupal.org ключевое слово taxonomy
- Для комментирования войдите или зарегистрируйтесь
В Друпале почти всегда одного и того же результата можно добиться разными методами. У сниппетов чаще всего есть преимущество в скорости, и часто в переносимости между версиями. А код на api короче и "круче", понятнее, меньше, но медленнее, как правило.
- Для комментирования войдите или зарегистрируйтесь
Чтобы убрать вообще все ссылки таксономии или все ссылки для определенного типа контента — пишем модуль remove_links с таким хуком:
<?php
function remove_links_link_alter(&$node, &$links) {
if ($node->type == 'news') { // убираем все ссылки у новостей
$links = array();
} else {
foreach ($links as $module => $link) {
if (substr($module, 0, 14) == 'taxonomy_term_') { // убираем все ссылки таксономии
unset($links[$module]);
}
}
}
}
?>- Для комментирования войдите или зарегистрируйтесь
всем вечер добрый! впервые столкнулась с термином таксономия, ПОМОГИТЕ!!! что это для медицины и ваще?
- Для комментирования войдите или зарегистрируйтесь
Спасибо! )
- Для комментирования войдите или зарегистрируйтесь
мож чего не догнал, но ведь можно CSS обойтись
для подписей тегов использовать селектор name-class:before { content "Name tag: "}
а для сокрытия св-во .name-class {display:none;}
- Для комментирования войдите или зарегистрируйтесь
Спасибо
- Для комментирования войдите или зарегистрируйтесь
супер
- Для комментирования войдите или зарегистрируйтесь
Так и не понял как с CSS. Не работают эти строчки.
А как этот код применить к разным типам контента? К примеру, в одном виде контента мне не нужно выводить такое, а в другом нужно, чтобы всё было по-порядку.
- Для комментирования войдите или зарегистрируйтесь
СпасибО!
- Для комментирования войдите или зарегистрируйтесь
Спасибо! С таксономией пока не разобрался, но к сведению принял -)
- Для комментирования войдите или зарегистрируйтесь
Нашёл модуль для пятого и шестого Друпала, который, по сути, делает то же самое. Модуль называется Term Display. Судя по тому, что написано на странице модуля, он позволяет настроить отображение терминов таксономии на странице ноды.
Модуль предусматривает четыре типа отображения:
1. По умолчанию (модуль не меняет ничего);
2. Список (модуль убирает словарь со стандартного вывода и представляет его термины в виде списка, указывая имя самого словаря);
3. Другой (модуль убирает словарь со стандартного вывода и показывает его термины в виде списка тегов, разделённых запятыми, + пишет имя словаря);
4. Не показывать (вообще не показывает термины).
2/3 вариант может выглядеть так:
Шоколад: Алёнка
Настройки выставляются в параметрах словаря. Можно указать также «вес», но авторы не рекомендуют этого делать. Модуль поддаётся темизации.
- Для комментирования войдите или зарегистрируйтесь
для Drupal 6 код:
<?php if (count($taxonomy)): // заменить '4' на ваш ID номер словаря $terms = taxonomy_node_get_terms_by_vocabulary($node, 4); if ($terms) { foreach ($terms as $key => $term) { $items4[] = l($term->name, taxonomy_term_path($term), array('attributes' => array('rel' => 'tag', 'title' => $term->description))); } print '<p>' . t("Filed in: ") . implode(', ', $items4) . '</p>'; // alternatively theme as an item list. //print theme('item_list', $items4); } endif; ?>
- Для комментирования войдите или зарегистрируйтесь
для Drupal 6 по моему правильней:
<?php if ($taxonomy): $vocabularie = taxonomy_get_vocabularies('blog'); // словари прикрепленные к содержимому типа 'blog', для всех типов оставить пустым foreach ($vocabularie as $voc): $terms = taxonomy_node_get_terms_by_vocabulary($node, $voc->vid); if ($terms) { unset($items); foreach ($terms as $key => $term) { $items[] = l($term->name, taxonomy_term_path($term), array('attributes' => array('rel' => 'tag', 'title' => $term->description))); } print '<p>' . $voc->name . ': ' . implode(', ', $items) . '</p>'; } endforeach; endif; ?>
- Для комментирования войдите или зарегистрируйтесь
Большое спасибо! Мегаценное инфо.
З.Ы.: Хто ищет - тот всегда нейдет!
- Для комментирования войдите или зарегистрируйтесь
Хм, таким же образом можно заменить вывод полей, как в CCK, если, конечно, задача стоит, как у создателя этой темы (не сложнее, или не намного сложнее) + слова в полях становятся ссылками на родственные (по терминам) материалы. Надо поразмыслить над этим...
Спасибо!
- Для комментирования войдите или зарегистрируйтесь
Здесь показано, как сделать разбивку по словарям с помощью переопределения $terms в template.php. Имхо, так получается более гибко и правильно.
- Для комментирования войдите или зарегистрируйтесь
а вот здесь красиво сделано?
- Для комментирования войдите или зарегистрируйтесь
В закладку себе
- Для комментирования войдите или зарегистрируйтесь
MDinc:
от мой пример оформления таксономи
http://www.plienitas.lt/forum/taxonomy/term/45/all
выдает ошибку
warning: preg_match() expects parameter 2 to be string, array given in /data/web/www.plienitas.lt/public_html/includes/bootstrap.inc on line 777.
- Для комментирования войдите или зарегистрируйтесь
Способ, указанный Т-34, работает правильно. За исключением небольшого косяка: ему наплевать на мультиязычность. Имена словарей он выводит исключительно родные, смена языка сайта никак не влияет на это(однако термины с синонимами выводит верно). Помог бы кто подправить это...
- Для комментирования войдите или зарегистрируйтесь
Еще вариант - модуль
content_taxonomy
Кстати, в д7 он уже в ядре
- Для комментирования войдите или зарегистрируйтесь
как вывести термин из словаря принадлежавшей какой либо ноде?
- Для комментирования войдите или зарегистрируйтесь
недавно обсуждали http://www.drupal.ru/node/52264
- Для комментирования войдите или зарегистрируйтесь
И что этот код выполняет нужное мне действие?
т.е.
как вывести термин из словаря принадлежавшей какой либо ноде?
а точнее
Тремин 2 словаря 3 для ноды такой то?
<?php
$type = $subject = '';
foreach ($node->taxonomy as $term) {
if ($term->vid == 3) $type = $term->name;
elseif ($term->vid == 2) $subject = $term->name;
}
if (!empty($type) && !empty($subject)) print "$type с предмета $subject";
?>
- Для комментирования войдите или зарегистрируйтесь
код же примитивный:
<?php
foreach ($node->taxonomy as $term) {
if ($term->vid == НОМЕР_СЛОВАРЯ) print $term->name . ' ';
}
?>- выводит список терминов словаря НОМЕР_СЛОВАРЯ ноды $node
- Для комментирования войдите или зарегистрируйтесь
у меня словарь Публикации (с терминами рецензия, статья, интервью)
в ноде выбираю один из этих терминов и хочу что бы
в пейдже и в ноде этого типа материала...
выводилось Термин -> Титл ноды
--
код выше что-то не выводит термин относящийся к ноде...
- Для комментирования войдите или зарегистрируйтесь
я пас)
- Для комментирования войдите или зарегистрируйтесь
Никто не сталкивался с такой проблемой то? полезная весч... то.
- Для комментирования войдите или зарегистрируйтесь
я пас)
дело в том что я все term убрал модулем "таксономия hide" и по этому не появлялось...
сейчас добавил этот словарь и он вылез, но...
мне как бы не нужн очто бы было термин в заголовке и под содержанием, можно как то под содержанием убрать а у заголовка добавить... ссылку к термину а то как бы смысл тогда?
- Для комментирования войдите или зарегистрируйтесь






















Комментарии