Список по алфавиту без Views

Аватар пользователя Sergey1917 Sergey1917 2 февраля 2008 в 14:14

Спецы по РНР откликнитесь.

<?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>";
?>

Это код сниппета "Список терминов определённого словаря (с иерархией) + количество документов". Сниппет выводит список терминов и документов терминов словаря по дате создания или последнего изменения.

Что надо изменить в коде, чтобы и термины и документы выводились по алфавиту.?

Комментарии

Аватар пользователя mityok mityok 2 февраля 2008 в 15:47

Задача решается просто:

После строки :

$terms = taxonomy_get_tree($vid);

(5-я строка в вашем исходном файле)

Добавляем строку:

usort($terms,create_function('$a,$b','return strcasecmp ($a->name,$b->name);'));

И наслаждаемся списком, который отсортирован по алфавиту Smile

Аватар пользователя Sergey1917 Sergey1917 2 февраля 2008 в 16:25

Да, но там два списка - терминов и в каждом термине документов. И тот и другой выводятся по дате.

Или это добавление изменяет и то и другое одновременно?

Аватар пользователя mityok mityok 2 февраля 2008 в 20:30

Да, ты прав, я забыл про сортировку документов.

Тот код, который предложил я, отсортирует по алфавиту термины, тот код, который прислал goodboy - документы.
Объединив усилия, получишь требуемый результат.

Аватар пользователя goodboy goodboy 2 февраля 2008 в 16:39

Для сортировки списка документов в алфавитном порядке:

замени

<?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

  • $node_link
  • ";
    }

    ?>

    на

    <?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

  • $node_link
  • ";
    }

    ?>

    Заодно избавляемся от запросов в цикле while, должно работать пошустрее

    Аватар пользователя Sergey1917 Sergey1917 2 февраля 2008 в 21:23

    Спасибо mityok и goodboy!

    Все класно получилось. Сделал себе два списка. Один сортировка терминов и документов по алфавиту, другой - сортировка терминов по алфавиту, а документов оставил по дате, такой тоже пригодится в хозяйстве.

    Мучился с этим уже два месяца, на нескольких форумах задавал вопрос, а здесь все решилось так оперативно.

    Аватар пользователя seaji seaji 20 марта 2008 в 15:03

    Зря Вы так, ничего монструозного во views нету. Это тот же конструктор запросов к базе. Только там все это делается грамотней да и проще.

    Аватар пользователя VladSavitsky VladSavitsky 23 апреля 2008 в 20:59

    Позволю себе подвести итог.
    Обратите внимание - скрипт выводит иерархию терминов, а не документов.
    Итак, этот код выведет "Алфавитный список терминов определённого словаря (с иерархией) + количество документов":

    $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

  • $list[0]";
    if ($list[2]>0) {
    echo "\n
      ";
      $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
    • $node_link
    • ";
      }
      echo "\n

    ";
    }
    $depth=$list[1];
    }
    echo "

  • \n

    ";
    ?>

    Drupal CookBook - Готовить может каждый!Решение было сохранено на сайте DrupalCookBook.ru:
    Алфавитный список терминов определённого словаря (с иерархией) + количество документов.
    Авторы, предложившие решения, также указаны в сохранённой статье.

    Аватар пользователя каранёвы каранёвы 26 октября 2011 в 1:55

    «Алфавитный список терминов определённого словаря (с иерархией) + количество документов"»
    Весь вечер пытался переделать для 7ки, не вышло( Может кто-то сможет помочь? Не хватает знаний(

    Аватар пользователя Conan Conan 4 июля 2008 в 15:24

    А что нужно добавить, что бы выводился список документов с аннотацией, как при выводе стандартной таксономии http://mysite/taxonomy/term/21(но отсортированное по алфавиту) а не по мере добавления?
    Или может быть есть подобный модуль, что бы реализовывал функцию taxonomy_menu и одновременно можно было настраивать способ выдачи материалов (по дате, по алфавиту, еще по чему нибудь)

    Аватар пользователя enemis enemis 17 декабря 2011 в 2:08

    Может уже не актуально но поделюсь своим решением:
    Я использовал в своем модуле mymodule_taxonomy_term_page($tids, $result)

    function 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;
    }

    Может не лучшее решение зато быстрое и без лишних запросов к базе.