Иерархическое меню из двух словарей

Главные вкладки

Аватар пользователя antondexter antondexter 24 августа 2009 в 11:19

Есть два словаря "фрукты" и "цвета".
В первом термины:
- Персик
- Яблоко
Во втором, соответственно:
- Белый
- Зеленый.

Задача: создать меню

Персик
- Белый
- Зеленый
Яблоко
- Белый
- Зеленый

Пояснение задачи: жмем "Персик" --> "Белый" = получаем перечень нод, имеющих оба термина.
Вопрос: КАК? Голову уже сломал, а надо. Не вручную же прописывать все меню - пунктов море и автоматом должны создаваться...
Помогите.

Комментарии

Аватар пользователя antondexter antondexter 24 августа 2009 в 12:24

Попробую переопределить задачу.

Есть только один словарь.
В нем термины "Яблоко" и "Персики".
А еще термин "белый", у которого два родителя - "Яблоко" и "Персики".
И термин "красный", у которого тоже два тех же родителя.

Задача - вывести меню полную иерархию вида

Яблоко
- Белый
- Красный
Персики
- Белый
- Красный

Модуль Taxonomy Treemenu выводит такое дерево, но при этом "Яблоко-Белый" имеет тот же путь, что и "Персики-Белый", то есть просто "Белый". Нужно что-то другое

Аватар пользователя BorisVlasenko BorisVlasenko 21 сентября 2009 в 14:51

Таксономией обязательно?
Может быть другой способ?
Насколько я понимаю, иерархия - это не самое сильное место таксономии.
На ум приходит book, но я им даже не пользовался.

Аватар пользователя Xermit Xermit 22 апреля 2010 в 2:56

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

Модуль для 5-ки пришлось писать свой (на основе taxonomy_menu) так как таксономия из коробки похоже не умеет выводить пересечения терминов, во всяком случае иерархически связанных. С чем это связано не знаю так как если дергать api функции самой таксономии, как в D5 и D6 то функции умеют выводить пересечение терминов, даже иерархических.

Но лично у меня почему-то не работает конструкция вида
site/taxonomy/menu/Яблоко,Белый

вот хоть убейся, но функция taxonomy_terms_parse_string, которая должна парсить строку вида "Яблоко,Белый", чтобы определить булевый операнд операции, не вызывается в этом случае, она вызывается только из функции taxonomy_term_page.

То есть, если сделать иерархический один словарь, как я описал, то

require_once drupal_get_path('module', 'taxonomy') .'/taxonomy.pages.inc';
$output = taxonomy_term_page("nid_apple,nid_white", 0 , 'page');

вместо nid_* подставить числа в таксономии, то эта функция вернет контент пересечения ровно двух терминов, а именно Белых яблок.

Того же самого еще можно добиться так

$result = taxonomy_select_nodes($tids, 'and', 0);
$output = taxonomy_render_nodes($result);

tids это массив, где каждый желемент это номер в таксономии, в данном случае array(nid_apple, nid_white)

Почему эти функция ни в D6 ни в D5 не используется мне не понятно.

Вот и пришлось свой модуль под D5 накатать используя за базу taxonomy_menu, а щас вот опять озаботился этим так как под D6 переносить надо, перенес, только вот не осталось
в views вот такой функции

$output = theme('view', variable_get('taxonomy_menu_show_views2_'.$vid, ''), NULL, NULL, 'embed', array(implode(",", $tids)));

с помощью которой я накладывал определенный view, название которого хранилось в taxonomy_menu_show_views2_ в зависимости от словаря

в D6 + Views 2 теперь такой функции нет
заметьте в implode(",", $tids) используется запятая, то есть операция типа and, а не or как в случае с + или пробелом.

view использую, чтобы убрать повторы терминов, функция их множит в моем случае, так как иерархия, то есть одно и то же яблоко есть как в категории белый, так и в яблоко, но при операции and он это самое яблоко мне дважды выводит, потому поверх я прикрутил в свое время view, который копию убирал, плюс сортировку делал по cck полям ubercart-a.

А щас что то не пойму как в новом view аналог функции найти.

Надеюсь разъяснил то что сам нарыл, вот теперь думаю может можно как то саму таксономию лягнуть чтобы она эти , + обрабатывала прямо из url. Тогда и гемороев бы не было бы без всяких других модулей типа taxonomy_menu или hierarhy select или category, там конечно своего функционала наверчено.

Сижу вот думаю, кто же обрабатывает url taxonomy/term/%, чтобы хоть глазком взглянуть на код.

Аватар пользователя Xermit Xermit 22 апреля 2010 в 3:00

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

Аватар пользователя Xermit Xermit 22 апреля 2010 в 3:34

Эх, вот здесь http://drupal.org/node/564652 указано, что если у вас кривая view для taxonomy_term

то ссылки site/taxonomy/term/Яблоко,Белый могут не работать так как их перехватывает кривая view,
отключил эту view сразу заработали подобные url и функция та по разбору строки вызывается теперь Smile

осталось все переосмыслить только как бы уменьшить себе гемору, вот знал бы раньше, сделал бы возможно все по другому без всяких taxonomy_menu к примеру Biggrin

а еще кто бы ткнул носом в то место которое у view в аргументах не правильное