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

Автор: Sergey1917 - 31.01/2008, чт - 16:12

Владимир, помогите пожалуйста. Сайт уже надо на хост выкладывать, но осталась нерешенная проблема (небольшая для тех, кто знает PHP).
Есть сниппет: "Список терминов определённого словаря (с иерархией) + количество документов" - как сделать список документов термина по алфавиту. Views не предлагать.

Вот сам сниппет:

  1. <?php
  2. $vid = 3;  // Номер словаря
  3. $pole = array();
  4. $items = array();
  5. $terms = taxonomy_get_tree($vid);
  6. foreach ( $terms as $term ) {
  7.   $count = db_result(db_query("SELECT COUNT(nid) FROM {term_node} WHERE tid = %d", $term->tid));
  8.   $pole[]=Array (l($term->name, "taxonomy/term/$term->tid") . " ($count)", $term->depth, $count, $term->tid)  ;
  9. }
  10.   $depth =-1;
  11.   foreach ($pole as $list) {
  12.     if ($list[1] > $depth) echo "\n<ul>";
  13.     if ($list[1] < $depth) echo "\n</li>\n</ul>\n</li>";
  14.     if ($list[1] == $depth) echo "</li>";
  15.     $poc++;
  16.     echo "\n<li>$list[0]";
  17. if ($list[2]>0) {
  18.       echo "\n<ul>";
  19.       $result = db_query("SELECT * FROM {term_node} WHERE tid=$list[3]");
  20.       while($zaznam = db_fetch_array($result)) {
  21.         $node = db_result(db_query("SELECT title FROM {node} WHERE nid=$zaznam[nid]"));
  22.         $node_link = l($node, "node/$zaznam[nid]");
  23.         echo "\n<li>$node_link</li>";
  24.       }
  25.       echo "\n</ul>";
  26.   }
  27.     $depth=$list[1];
  28. }
  29. echo "</li>\n</ul>";
  30. ?>

Комментарии

я бы предложил воспользоваться модулём Node list, посмотреть в действии можно по этому адресу...

по алфавиту всё, да ещё и со ссылками в начале страницы на буква алфавита... модуль простой, лёгкий, страницы вывода кэшируются...

Модуль Node list я уже использую, по вашему же совету. Но у меня много списков самых разных. А этот модуль поддерживает только один. Сниппет выводит список наподобие. Термины выводятся по алфавиту (или по порядку создания, в данном случае для меня это одно и то же) а документы нет.

Есть другой сниппет, Список документов определённого термина. Сетегном помог его сделать по алфавиту, вот уже готовый код:

ORDER BY node.title ASC — упорядочивание по названию документа А-Я. Таблица node, колонка title.

  1. <?php
  2. $taxo_id = 5;  // номер термина
  3. $list_no =10;  // количество документов в списке
  4. $sql = "SELECT node.title, node.nid FROM node INNER JOIN term_node ON node.nid = term_node.nid WHERE term_node.tid = $taxo_id ORDER BY node.title ASC LIMIT $list_no";
  5. $output .= "<ul>";
  6. $result = db_query($sql);
  7. while ($anode = db_fetch_object($result)) {
  8.   $output .= "<li>".l($anode->title, "node/$anode->nid")."</li>";
  9. }
  10. $output .= "</ul>";
  11. print $output;
  12. ?>

Может с ним будет яснее. Но так как я в РНР вообще ничего не понимаю, я не могу воспользоваться этим аналогом.

Пробовал обратиться к Сетегному, но безрезультатно, на Друпал.ру тоже никто не ответил.

Не проверял, но работать должно

  1. <?php
  2. $taxo_id_arr = array(2,3);  // Номера терминов
  3. $taxo_id = join($taxo_id_arr, ',');
  4. $list_no = 100;  // Количество документов в списке
  5. $query = "SELECT DISTINCT(n.nid), n.title, n.created FROM {node} n INNER JOIN {term_node} tn ON n.nid = tn.nid WHERE tn.tid in ($taxo_id) AND n.status = 1 ORDER BY n.created DESC LIMIT $list_no";
  6. $sql = db_rewrite_sql($query);
  7. $result = db_query($sql);
  8. $items = array();
  9. while ($anode = db_fetch_object($result)) {
  10.  
  11.   $term_names = array();
  12.   # gather, into $term_names, all the terms because of which this node was selected:
  13.  foreach (taxonomy_node_get_terms($anode->nid) as $term) {
  14.      if (in_array($term->tid, $taxo_id_arr))
  15.          $term_names[] = $term->name;
  16.   }
  17.  
  18.   $items[]= l($anode->title, "node/$anode->nid") .
  19.     '<br /> (Category/ies: ' . join($term_names, ', ') .
  20.     ' - date added ' . format_date($anode->created, 'custom', 'd-m-Y') . ')';
  21. }
  22.  
  23. if(count($items)) {
  24.   return theme('item_list',$items);
  25. }
  26.  
  27. ?>

Separator@drupal.org или вы Владимир

Пожалуйста поправте в предыдущем сообщении формат ввода: поставте - code. А то вширь распирает.

Separator@drupal.org, это что-то другое. Нужен же список словаря с терминами, а уже внутри этого списка словаря, под каждым термином - список документов. И вот этот то список документов нужно вывести по алфавиту. Посмотрите в самом начале.

А в приведенном вами коде нет номера словаря, а только номера терминов. Так что это не совсем то что нужно.

Модуль Node list я уже использую, по вашему же совету. Но у меня много списков самых разных. А этот модуль поддерживает только один. Сниппет выводит список наподобие. Термины выводятся по алфавиту (или по порядку создания, в данном случае для меня это одно и то же) а документы нет.

так и не понял, что было нужно... вот список документов по алфавиту из определённого термина: модули Друпала...

так и не понял, что было нужно... вот список документов по алфавиту из определённого термина: модули Друпала...

Проблема в том, что этот модуль у меня работает, но он может выдать только один список (да, его можно настроить, но только один). У меня списков на сайте будет несколько самых разных. Тот сниппет, который я просил исправить, выводит список терминов какого либо словаря и под каждым термином список документов с ним связанных. Но он выводит список самих терминов и список документов каждого термина не по алфавиту, а по номеру создания их на сайте, что некрасиво выглядит.

Например, у меня в словаре "N1" 29 терминов - 29 букв алфавита. На каждый термин есть документы, их число будет увеличиваться без конца.

В словаре "N2" ~250 терминов - страны мира.

Я хочу сделать список:
1) авторов по буквам алфавита (сами термины-буквы алфавита и документы)
2)авторов по странам (страны по алфавиту и документы в каждой стране по алфавиту)
и другие списки по другим словарям с терминами, тоже по алфавиту.

Для этого я использую сниппеты. А модулем я не могу даже два списка сделать.

Повторю свою просьбу: в сниппете, код которого приведен в самом верху топика, список и терминов и документов терминов выводится по номеру nod. Как переделать код, чтобы и термины и документы этих терминов выводились по алфавиту. Ниже верхнего (в топике) кода сниппета я привел для сравнения другой сниппет, где документы выводятся по алфавиту (чтобы легче было первый исправить).

Надеюсь, что понятно теперь описал свою проблему.

Владимир, а в приведенном вами примере, вы чем список делали?

прочитайте про модуль Nodelist подробнее, там не один общий список...
там много списков можно сделать...
вышеприведённый пример я делал этим модулем...

прочитайте про модуль Nodelist подробнее, там не один общий список...
там много списков можно сделать...
вышеприведённый пример я делал этим модулем...

Спасибо я посмотрю повнимательнее.

p.s. В вышеописанном мной сниппете - список выводится не по номеру nod, а по дате создания или изменения nod.

Владимир, вы не специалист по РНР, но немного (из ваших слов) в нем разбираетесь. Неужели такая проблема сделать сортировку документов и терминов не по дате, а по алфавиту?

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

Date: 10.07.2007 22:46

Здравствуйте, Сергей.

> Если сможете, то пожалуйста объясните его настройки:

> 1. "Page title for nodes in a vocabulary: *",
> по умолчанию стоит - Content list for for %id

Это оформление заголовка документов... а именно букв А Б и тд.

> 2. "Page title for nodes in a taxonomy term: *",
> по умолчанию стоит - Content list for %id

Тоже самое, только для словарей таксономии...

> 3. Опция "Include node children when using therm hierarchy".

Спрашивает вас, включить ли например, дочерние словари при применении
иерархии в словарях (например, если будете использовать подфорумы и тд.)

> 4. "Node types to include:" - здесь перечисляются все, доступные для
> модуля виды материалов, или это выбор только одного, конкретного? А
> если нужно выбрать два или три вида, тогда как быть? У меня еще почти
> нет введенного материала чтобы определить опытным путем. Например, я
> еще графику не вводил, галереи. До них еще очередь не дошла.

Нажмите кнопку Ctrl на клавиатуре и выделите мышкой все материалы,
например... или несколько, без Ctrl возможно выбрать только один тип
материала...

> Как можно сделать, чтобы выводились материалы, относящиеся
> только к терминам определенного мной словаря?

taxonomy/term/1/list
и vocabulary/1/list где цифра 1 - это номер вашего словаря...

> А если мне нужно на одной странице выводить списки документов по одному словарю, а на
> другой или других списки документов по другим словарям? Возможно ли это?

я думаю, для этого нужны сторонние модули для вывода...

Владимир, это цитата из вашего письма по модулю Node list. Я и искал "сторонние" и нашел сниппеты. Я тогда вообще не знал Друпал, а эта фраза ("я думаю, для этого нужны сторонние модули для вывода...") мне врезалась в память и я даже не пытался с этим модулем экспериментировать.

и я даже не пытался с этим модулем экспериментировать

так выше я же сказал как выводить из определённого словаря документы по алфавиту:
> Как можно сделать, чтобы выводились материалы, относящиеся
> только к терминам определенного мной словаря?

taxonomy/term/1/list
и vocabulary/1/list где цифра 1 - это номер вашего словаря...

единственное, что не позволяет этот модуль, это выводить документы по дате и по автору, но этого можно добиться теми же сниппетами, достоинство этого модуля в том, что все списки есть и так, не нужно вручную каждому словарю делать список, достаточно добавить /list в конец ссылки любого словаря и вы увидите список по алфавиту...

Попробовал с ним поэкспериментировать. Он выводит список документов из словаря без терминов. При однотипном материале не видно никакой разницы и не понять, что же в этом списке. А заголовок только один на всех, выставляется в настройках модуля.

Получается очень красивый и удобный список, но только для одного словаря. А для других придется все-таки приспосабливать сниппеты.

Спасибо за участие.

если вам нужно что-то действительно сложное в выводе документов из разных словарей, то вам наверное действительно стоит посмотреть в сторону Views, так как всё остальное просто не даёт необходимой гибкости...

не за что, пишите, если появятся ещё какие-то вопросы по настройке... если смогу, - отвечу...

Не хочется Views. Я как-то пытался с ним разобраться, там столько гемороя. А сложного у меня ничего в списках нет.

Через сниппет "Список документов определённого термина" список тоже выводился не по алфавиту. Изменение в коде уместилось на одной (небольшой) строке. Думаю, что в сниппете "Список терминов определённого словаря (с иерархией) + количество документов" изменение в коде займет две такие строки кода. Т.е. специалисту на это понадобится максимум 1 минута. Просто профессионалы не обращают внимание на вопросы новичков, за редкими исключениями.

зато Views позволяет любым людям, которые освоились с модулем выводить материал в любом виде... всё сниппетами не решить, так как сейчас вам надо вывод по авторам, потом что-то другое... лучше использовать комплексное решение и знать PHP там не нужно вообще, зная Views вы будете независимы от кого-бы то ни было...

насчёт того "как разобраться" - это отдельный вопрос, но по данному модулю написано уже довольно много документации...

Владимир, может кому нужен список с сортировкой по алфавиту, то решение здесь: http://www.drupal.ru/node/11620

Сортировка терминов по алфавиту - добавилась одна строка, сортировка документов по алфавиту - замена пяти строк кода.

Приятно было пообщаться.

да, те, кто знают php в конце концов и решили данную задачу...
так что, зря вы так о Друпал.Ру...

хех, там тоже можно быстро получать ответы...
и с вами тоже было приятно пообщаться...