如何将分类菜单作为标准菜单项的子菜单注入?


12

我有一个主菜单,其顶级结构类似于以下内容:

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

这些顶级链接中的每一个都转到相应的节点页面。

我有一个类别(多级)词汇表,我需要在“类别”项下的子菜单中获得这些分类法术语。我想避免将项目硬编码到主菜单中,因为子菜单应该像词汇表一样增长/缩小。

过去,我编写了过多的代码来完成此工作,该代码与分类法操作挂钩并基于此操作管理特定菜单的子项(与“ 分类法菜单”的工作非常相似,但每个分类不必具有不同的菜单)词汇)。

尽管该方法有效,但它不是理想的方法,当然也不是通用的。我不能只是将代码从旧项目中提升到新项目中,这将需要进行合理的定制。

我忍不住觉得必须有一个基于模块的“标准”解决方案。

我已经看到了一些建议,可以结合使用许多不同的模块(甚至有些建议很奇怪地建议使用基于视图的模块)。我愿意接受任何建议,但是如果涉及安装1个或2个以上的模块,以及大量的硬编码,特定于上下文的配置,那么在这种情况下它可能不会有太大帮助。


1
我想我已经看过了... 相似的主题包含有关使用规则在菜单中创建基于分类标准的项目的想法,但这似乎也不理想。
Mołot

如果我正确理解,您是否看起来像此模块drupal.org/project/taxonomy_treemenu一样,它可以与漂亮的菜单集成,但对于D6
Bala 2013年

您是否必须具有实际的菜单项,或者在呈现菜单时将分类术语树添加到菜单中是否可行?
rooby

感谢@Bala,不过需要D7解决方案
Clive

1
克莱夫,我有一个建议。据我所知,您可以生成包含词汇名称的taxonomu菜单,然后直接将其他菜单链接直接添加到生成的菜单中。分类项目可能会自动进行更新...我不知道它是否有效,只需尝试一下即可。
milkovsky 2013年

Answers:


13

选项a)除非我弄错了,您能不能仅在创建分类菜单时选择分类菜单的父位置(菜单位置)?我认为您可能会遇到的唯一问题是,我认为每次分类法更新时都需要您重新构建菜单

选项b)我在网站上做了类似的事情,我使用了菜单视图模块,以允许将视图放入主菜单。

如果您创建一个列出所有分类法术语的新视图作为块显示,请在必要时在视图中应用任何其他过滤/修改(您可能没有,但在我的示例中我想这样做)。然后,当您在主菜单中添加新链接时,可以选择使用视图而不是链接。从那里选择要使用的视图,选择“类别”菜单项作为其父项并保存(保存后,您必须在菜单中启用它,这似乎是模块本身的错误)

我不能保证这是最适合您的解决方案,但是当我刚刚测试它时它就起作用了


1
是的,事实证明我一直很愚蠢-分类菜单内置了此确切功能(您的选项a)。我要处理的特定菜单很小,类别不会经常更改,因此重建不是问题。非常感谢完整性检查
克莱夫

3

Menupoly具有用于自定义“菜单树源”的API。除菜单链接外,我从未真正使用过此功能,因此我们可能需要解决一些问题。但是基本的架构在那里。

如果你走这条路,你会

  • 使用现有的主菜单,“分类”页面后没有任何分类术语链接。
  • 创建与此无关的分类树。
  • 编写一个自定义的“菜单树源”,该菜单源正常地从menu_links获取,但是当找到分类术语时,它将改为从分类中获取。
    因此,您需要以某种方式能够检测到“类别”链接与分类法相关。
  • 如果菜单链接与分类法相关,并且同时具有常规子菜单,则需要以某种方式将两种类型的子项混合在一起。

这条路线可能会有些工作,但对其他人可能有用,并且它可能比特定于站点的逻辑更优雅,更可重用。

当前甚至不存在仅分类​​法的“菜单树源”,因此在开始使用混合插件之前,这也许是一个合理的第一步。


话虽这么说,安德鲁·莫里斯(Andrew Morris)接受的答案可能就足够好了。这对我来说意味着更少的工作:)仍然希望将其发布给可能会觉得有用的任何人。
donquixote13年

五,有趣,谢谢。公认的答案是做得很好,但是我也很想获得代码解决方案。我是否可以假设它是您的模块之一,并且全部建立在PSR-0优势之上?:)
Clive

此版本使用xautoload的PHP 5.2兼容模式,这有点像PEAR,但目录较浅。因此,未经PSR批准。我可能会去PSR-0的某一天..
donquixote

尽管我对PSR-X非常感兴趣(可悲的是,它可能永远不会进入D8)
donquixote 2013年

2

Metro Menus可以满足您的要求,即使它具有内置的外观,也可以创建自己的外观,就像精美的菜单一样。使用此模块,您可以从菜单或分类中选择具有任何深度的任何子项,而我以前没有使用过。

与触摸屏(iPad,iPhone等)的兼容性。

在此处输入图片说明


2

您可以使用Om Maxi菜单模块。它将允许管理员创建带有您要作为附件的块的菜单,诸如视图,幻灯片,菜单,用户,精美菜单,快速选项卡的自定义块,以及带有表,列表,图像,视频等的自定义块。

您可以使用分类法菜单创建单独的菜单,并且可以将此菜单作为子链接附加到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中显示为另一个函数。

希望它能帮助或至少迈向解决方案。

保罗

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.