Спецы по РНР откликнитесь.
<?php
$vid = 3; // Номер словаря
$pole = array();
$items = array();
$terms = taxonomy_get_tree($vid);
foreach ( $terms as $term ) {
$count = db_result(db_query("SELECT COUNT(nid) FROM {term_node} WHERE tid = %d", $term->tid));
$pole[]=Array (l($term->name, "taxonomy/term/$term->tid") . " ($count)", $term->depth, $count, $term->tid) ;
}
$depth =-1;
foreach ($pole as $list) {
if ($list[1] > $depth) echo "\n<ul>";
if ($list[1] < $depth) echo "\n</li>\n</ul>\n</li>";
if ($list[1] == $depth) echo "</li>";
$poc++;
echo "\n<li>$list[0]";
if ($list[2]>0) {
echo "\n<ul>";
$result = db_query("SELECT * FROM {term_node} WHERE tid=$list[3]");
while($zaznam = db_fetch_array($result)) {
$node = db_result(db_query("SELECT title FROM {node} WHERE nid=$zaznam[nid]"));
$node_link = l($node, "node/$zaznam[nid]");
echo "\n<li>$node_link</li>";
}
echo "\n</ul>";
}
$depth=$list[1];
}
echo "</li>\n</ul>";
?>
$vid = 3; // Номер словаря
$pole = array();
$items = array();
$terms = taxonomy_get_tree($vid);
foreach ( $terms as $term ) {
$count = db_result(db_query("SELECT COUNT(nid) FROM {term_node} WHERE tid = %d", $term->tid));
$pole[]=Array (l($term->name, "taxonomy/term/$term->tid") . " ($count)", $term->depth, $count, $term->tid) ;
}
$depth =-1;
foreach ($pole as $list) {
if ($list[1] > $depth) echo "\n<ul>";
if ($list[1] < $depth) echo "\n</li>\n</ul>\n</li>";
if ($list[1] == $depth) echo "</li>";
$poc++;
echo "\n<li>$list[0]";
if ($list[2]>0) {
echo "\n<ul>";
$result = db_query("SELECT * FROM {term_node} WHERE tid=$list[3]");
while($zaznam = db_fetch_array($result)) {
$node = db_result(db_query("SELECT title FROM {node} WHERE nid=$zaznam[nid]"));
$node_link = l($node, "node/$zaznam[nid]");
echo "\n<li>$node_link</li>";
}
echo "\n</ul>";
}
$depth=$list[1];
}
echo "</li>\n</ul>";
?>
Это код сниппета "Список терминов определённого словаря (с иерархией) + количество документов". Сниппет выводит список терминов и документов терминов словаря по дате создания или последнего изменения.
Что надо изменить в коде, чтобы и термины и документы выводились по алфавиту.?
Комментарии
Задача решается просто:
После строки :
$terms = taxonomy_get_tree($vid);
(5-я строка в вашем исходном файле)
Добавляем строку:
usort($terms,create_function('$a,$b','return strcasecmp ($a->name,$b->name);'));
И наслаждаемся списком, который отсортирован по алфавиту
Да, но там два списка - терминов и в каждом термине документов. И тот и другой выводятся по дате.
Или это добавление изменяет и то и другое одновременно?
Да, ты прав, я забыл про сортировку документов.
Тот код, который предложил я, отсортирует по алфавиту термины, тот код, который прислал goodboy - документы.
Объединив усилия, получишь требуемый результат.
Для сортировки списка документов в алфавитном порядке:
замени
<?php
$result = db_query("SELECT * FROM {term_node} WHERE tid=$list[3]");
while($zaznam = db_fetch_array($result)) {
$node = db_result(db_query("SELECT title FROM {node} WHERE nid=$zaznam[nid]"));
$node_link = l($node, "node/$zaznam[nid]");
echo "\n
";
}
?>
на
<?php
$result = db_query("SELECT n.title, n.nid FROM {term_node} t INNER JOIN {node} n ON t.nid=n.nid WHERE t.tid=$list[3] ORDER BY n.title ASC");
while($zaznam = db_fetch_array($result)) {
$node_link = l($zaznam[title], "node/$zaznam[nid]");
echo "\n
";
}
?>
Заодно избавляемся от запросов в цикле while, должно работать пошустрее
Большое спасибо! Попробую.
Не ожидал, что так быстро ответят.
Спасибо mityok и goodboy!
Все класно получилось. Сделал себе два списка. Один сортировка терминов и документов по алфавиту, другой - сортировка терминов по алфавиту, а документов оставил по дате, такой тоже пригодится в хозяйстве.
Мучился с этим уже два месяца, на нескольких форумах задавал вопрос, а здесь все решилось так оперативно.
Хм... Однако, необходимость монструозного Views отпадает. Спасибо!
Зря Вы так, ничего монструозного во views нету. Это тот же конструктор запросов к базе. Только там все это делается грамотней да и проще.
весьма
Позволю себе подвести итог.
Обратите внимание - скрипт выводит иерархию терминов, а не документов.
Итак, этот код выведет "Алфавитный список терминов определённого словаря (с иерархией) + количество документов":
$vid = 3; // Номер словаря
$pole = array();
$items = array();
$terms = taxonomy_get_tree($vid);
usort($terms,create_function('$a,$b','return strcasecmp ($a->name,$b->name);'));
foreach ( $terms as $term ) {
$count = db_result(db_query("SELECT COUNT(nid) FROM {term_node} WHERE tid = %d", $term->tid));
$pole[]=Array (l($term->name, "taxonomy/term/$term->tid") . " ($count)", $term->depth, $count, $term->tid) ;
}
$depth =-1;
foreach ($pole as $list) {
if ($list[1] > $depth) echo "\n
";
if ($list[1] < $depth) echo "\n\n
\n";
if ($list[1] == $depth) echo "";
$poc++;
echo "\n
if ($list[2]>0) {
echo "\n
";- $node_link
$result = db_query("SELECT n.title, n.nid FROM {term_node} t INNER JOIN {node} n ON t.nid=n.nid WHERE t.tid=$list[3] ORDER BY n.title ASC");
while($zaznam = db_fetch_array($result)) {
$node_link = l($zaznam[title], "node/$zaznam[nid]");
echo "\n
";
}
echo "\n
";
}
$depth=$list[1];
}
echo "
\n";
?>
Решение было сохранено на сайте DrupalCookBook.ru:
Алфавитный список терминов определённого словаря (с иерархией) + количество документов.
Авторы, предложившие решения, также указаны в сохранённой статье.
«Алфавитный список терминов определённого словаря (с иерархией) + количество документов"»
Весь вечер пытался переделать для 7ки, не вышло( Может кто-то сможет помочь? Не хватает знаний(
А что нужно добавить, что бы выводился список документов с аннотацией, как при выводе стандартной таксономии http://mysite/taxonomy/term/21(но отсортированное по алфавиту) а не по мере добавления?
Или может быть есть подобный модуль, что бы реализовывал функцию taxonomy_menu и одновременно можно было настраивать способ выдачи материалов (по дате, по алфавиту, еще по чему нибудь)
а для 6-го друпала подойдёт это решение?
Как сделать подобное с полями (cck) ?
Может уже не актуально но поделюсь своим решением:
Я использовал в своем модуле mymodule_taxonomy_term_page($tids, $result)
foreach ($tids as $key => $tid) {
$t = taxonomy_get_term($tid);
switch(taxonomy_vocabulary_load($t->vid)->name){
//Определяем имя словаря и вызываем соответствущую функцию формирования те для каждого словаря делаете свою либо умолчанию
case "name1":
$output=some_taxonomy_term_page($tids, $result);
break;
default: $output=taxonomy_term_page($tids, $result);
}
return $output;
}
function some_taxonomy_term_page($tids, $result) {
drupal_add_css(drupal_get_path('module', 'taxonomy') . '/taxonomy.css');
$output = '';
foreach ($tids as $tid) {
$query=('SELECT r.nid FROM {term_node} r INNER JOIN {term_data} t ON t.tid=r.tid INNER JOIN {node} n ON n.nid=r.nid ORDER BY n.title ASC');
$result=pager_query($query, 10);
$output .= some_taxonomy_render_nodes($result);
}
return $output;
}
Может не лучшее решение зато быстрое и без лишних запросов к базе.