Как я могу ввести меню таксономии как подменю стандартного пункта меню?

12

У меня есть главное меню со структурой верхнего уровня, похожей на следующую:

Home - Categories - Something Else - ... - Contact

Каждая из этих ссылок верхнего уровня идет на соответствующую страницу узла.

У меня есть словарь для категорий (многоуровневый), и мне нужно получить эти термины таксономии в подменю в разделе «Категории». Я бы хотел избежать жесткого кодирования элементов в главном меню, так как подменю должно увеличиваться / уменьшаться по мере увеличения словарного запаса.

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

Хотя этот метод работает, он не идеален и, конечно, не является универсальным. Я не могу просто поднять этот код из старого проекта в новый, для этого потребуется разумное количество настроек.

Я не могу удержаться от ощущения, что для этого должно быть «стандартное» модульное решение.

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

Клайв
источник
1
Я думаю, что видел это ... Подобная тема содержит идею об использовании правил для создания элементов меню на основе таксономии, но это тоже кажется далеко не идеальным.
Молот
Если я правильно понял, вы похожи на этот модуль drupal.org/project/taxonomy_treemenu , он может интегрироваться с хорошим меню, но для D6
Бала
У вас должны быть настоящие пункты меню или целесообразно добавить дерево терминов таксономии в меню при его отображении?
Роби
Спасибо @Bala, нужно решение D7, хотя
Клайв
1
Клайв, у меня есть одно предложение. Как я знаю, вы можете сгенерировать таксономное меню с включенным именем словаря, а затем просто добавить другие ссылки меню прямо в сгенерированное меню. Элементы таксономии могут обновляться автоматически ... Я не знаю, сработает ли это, просто попробуйте.
Милковский

Ответы:

13

Вариант а) Если я не ошибаюсь, вы не можете просто указать, где будет создано ваше меню таксономии (Расположение меню) при его создании? Я думаю, что единственная проблема, с которой вы можете столкнуться, это то, что вам нужно пересобирать меню каждый раз, когда обновляется таксономия.

Вариант б) Я сделал что-то похожее на этом на своем сайте, я использовал модуль « Представления меню », чтобы позволить мне поместить представление в основное меню.

Если вы создаете новое представление, в котором перечислены все ваши термины таксономии, в качестве отображения блока, примените любую дополнительную фильтрацию / модификацию в представлении, если это необходимо (вы можете этого не делать, но в моем примере я хотел). Затем, когда вы добавляете новую ссылку в свое главное меню, вы можете выбрать использование вида, а не ссылки. Оттуда вы выбираете, какое представление вы хотите использовать, выбираете пункт меню «Категория» в качестве родительского и сохраняете (после сохранения вы должны включить его в меню, что, по-видимому, является ошибкой в ​​самом модуле).

Я не могу гарантировать, что это лучшее решение для вас, но оно сработало, когда я только что проверил его

Эндрю Моррис
источник
1
Да, оказывается, я был довольно глупым - таксономическое меню имеет такую ​​встроенную функциональность (ваш вариант а). Конкретное меню, с которым я имею дело, довольно маленькое, и категории меняются не часто, поэтому перестройка не проблема. Большое спасибо за проверку работоспособности
Клайв
3

Menupoly имеет API для пользовательских «источников дерева меню». Я никогда не использовал это для чего-то другого, кроме ссылок в меню, поэтому могут возникнуть проблемы, которые мы должны исправить на пути. Но основная архитектура есть.

Если вы пойдете по этому маршруту, вы бы

  • Используйте существующее главное меню без ссылок на термины таксономии за пределами страницы «Категории».
  • Создайте свое дерево таксономии независимо от этого.
  • Напишите пользовательский «источник дерева меню», который извлекается из menu_links как обычно, но когда он находит термин таксономии, он вместо этого выбирает из таксономии.
    Итак, каким-то образом вы должны быть в состоянии обнаружить, что ссылка «Категории» связана с таксономией.
  • Если ссылка меню связана с таксономией и в то же время имеет регулярное подменю, вам нужно как-то смешать два типа детей вместе.

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

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

Дон Кихот
источник
это сказанное, принятый ответ Эндрю Моррисом мог бы быть достаточно хорошим. А это значит, что для меня меньше работы :) Все еще хотел опубликовать это для тех, кто может найти это полезным.
Donquixote
В. интересно, спасибо. Принятый ответ отлично справляется со своей работой, но мне также очень интересно найти решения для кода. Могу ли я предположить, что это один из ваших модулей, который построен на доброте PSR-0? :)
Клайв
В этом используется режим совместимости PHP 5.2 xautoload, который похож на PEAR, но с неглубокими каталогами. Итак, не одобрено PSR. Я мог бы когда-нибудь пойти PSR-0 ..
donquixote
хотя я очень заинтересован в PSR-X (который, к сожалению, может никогда не попасть в D8)
donquixote
2

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

Совместимость с сенсорным экраном (iPad, iPhone и т. Д.).

введите описание изображения здесь

Bala
источник
2

Вы можете использовать модуль меню Om Maxi для того же. Это позволит администратору создавать меню с нужными вам блоками в виде вложений, такими модулями, как представления, слайд-шоу, меню, пользовательские, удобные меню, быстрые вкладки и пользовательские блоки с таблицами, списками, изображениями, видео и т. Д.

Вы можете создать отдельное меню с помощью таксономического меню и прикрепить это меню в качестве подссылки на меню, созданное ом макси меню.

Благодарность

Джаендра Каинтола
источник
2

Я недавно сделал нечто подобное для меню категории продуктов. Это было только для 1 уровня, но его можно легко изменить, чтобы показать дальнейшие уровни.

/**
 * Implements theme_menu_link().
 */
function THEME_menu_link__main_menu($variables) {

  $sub_menu = '';
  $element = $variables['element'];
  $menu_string = $element['#title'];

  if (module_load_include('inc','pathauto','pathauto') !== FALSE) {
    $menu_string =  pathauto_cleanstring($menu_string);
  }

  if ($menu_string == 'categories') {
    $sub_menu = get_categories_menu();
  }

  if ($sub_menu) {
    $element['#attributes']['class'][] = 'haschildren';
  }

  $output = l($element['#title'], $element['#href'], $element['#localized_options']);
  return '<li' . drupal_attributes($element['#attributes']) . '>' . $output . $sub_menu . "</li>\n";
}

function get_categories_menu() {

  $current_category = arg(2); // Get current category from path
  $volcab = taxonomy_vocabulary_machine_name_load('product-categories');
  $tree = taxonomy_get_tree($volcab->vid,0,1);

  $output = '<ul class="menu product-category">';
  foreach ($tree as $term) {
    $safe_term = pathauto_cleanstring($term->name);
    $class = ($current_category==$safe_term) ? ' class="active"' : '';
    $output .= '<li><a' . $class . ' href="/drupal//path/to/' . $safe_term . '">' . $term->name . '</a></li>';
  }
  $output .= '</ul>';

  return $output;
}

Функция get_category_menu лучше использовать как блок, но для удобства она показана здесь как другая функция в файле template.php.

Надеюсь, что это помогает или, по крайней мере, шаг к решению.

Павел

paul.linney
источник