更改面包屑的内容


13

我正在尝试使用此钩子来更改面包屑链接:

hook_menu_breadcrumb_alter(&$active_trail, $item)

该钩似乎没有被调用。

我试过了 :

  • 使用主题上的钩子
  • 使用自定义模块上的钩子(breadcrumb_finder_fix)
  • 使用Drush清除所有缓存

我已经安装并激活了Devel模块,以下内容不会产生任何输出。

function breadcrumb_finder_fix_menu_breadcrumb_alter(&$active_trail, $item) {
    drupal_set_message(krumo($active_trail));
}

有任何想法吗 ?方向?请指教。

OBS:我已阅读此答案:https//drupal.stackexchange.com/a/7659/12647


我有同样的问题。我创建了MYMODULE_menu_breadcrumb_alter()挂钩函数,启用了该模块,清除了缓存,该挂钩似乎从未在用户页面上调用。具有讽刺意味的是,它似乎确实在管理页面上被调用(我在管理页面上得到了krumo输出)。主题的_breadcrumb()级别似乎是执行此操作的错误位置。
彼得·默里

Answers:


4

这是一个片段,显示如何更改面包屑。

请记住以下几点:

  • 此方法在主题级别更改面包屑,这是在到达模板文件之前更改任何内容的最后一个位置,因此在此处进行更改将不允许其他模块稍后更改面包屑。
  • 将这种方法视为更改面包屑的最后一个选择。
  • 将此片段添加到主题的template.php文件中。

    function THEME_NAME_breadcrumb($variables) {
      $breadcrumb = $variables['breadcrumb'];
    
      // check to ensure this is the one you want to alter
      // Custom rebuild process of breadcrumb with custom links.
      if ($breadcrumb[1] == 'your_breadcrumb_id') {
        // linking to home page
        $links[0] = l(t('Home'), '<front>');
    
        // Keeping the trail/current page as non linked
        $links[1] = ('your desired breadcrumb');
        drupal_set_breadcrumb($links);
      }
    }

@jean我做了几处更改,请看一下(不在摘录中),但在免责声明中
arpitr 2013年

13

响应可能有点晚了,但是今天早上我遇到了这个问题,当时正在寻找一种方法来替代Drupal 7中的面包屑,它有所帮助,所以我想我会添加我的解决方案。

这会根据内容类型创建额外的碎屑,并将当前页面添加到碎屑中。我正在使用它来添加面包屑到给定节点之前看到的过滤视图。

function MYMODULE_menu_breadcrumb_alter(&$active_trail, $item) {

    //STORE THE LAST ITEM
    $end = end($active_trail);

    foreach ($active_trail as $key => $crumb){

        //CHECK AGAINST NODE TYPE
        if($crumb['map'][1]->type == 'NODE_MACHINE_NAME'){

            //INSERT THE REPLACEMENT CRUMB
            $active_trail[$key] = array( 
                'title' => t("Title"),
                'href' => 'PATH',
                'link_path' => 'PATH', 
                'localized_options' => array(),
                'type' => 0
            );
            //RECREATE ITEM
            $active_trail[] = $crumb;
        }

    }


    //SHOW CURRENT PAGE IN BREADCRUMB BY DUPLICATING THE LAST ARRAY ITEM IN ACTIVE_TRAIL

    if (!drupal_is_front_page()) {
        if ($item['href'] == $end['href']) {
            $active_trail[] = $end;
        }       
    }

}

2
这似乎是正确的方法,但对我不起作用。具有讽刺意味的是,这确实适用于管理页面,但不适用于一般用户内容。关于如何调试的建议?
彼得·穆雷

我和@PeterMurray有相同的问题。我还没有完全解决它,但是据我现在所知,这是由于custom_breadcrumbs模块以某种方式覆盖了链接所致。无论如何,我的2美分。
Pax

9

hook_menu_breadcrumb_alter()在之前已调用drupal_set_breadcrumb()的页面上不起作用

hook_menu_breadcrumb_alter()menu_get_active_breadcrumb()调用。这是从所谓的drupal_get_breadcrumb() ,但只有当没有面包屑已经与以前设置drupal_set_breadcrumb()

看起来好像不是从用户页面调用了drupal_set_breadcrumb()。但是也许有一个contrib模块可以做到这一点。您可以将dpm()或ddebug_backtrace()放在drupal_set_breadcrumb()中,以查看是否为这种情况(需要启用devel模块,并且您有权查看devel信息)。

您可以改用hook_preprocess_breadcrumb(),但这需要解析要更改的面包屑链接。因为在该钩子中,面包屑链接已经呈现为html,所以您需要使用正则表达式(preg_match())或类似的表达式来确定例如url。

更好的解决方案是使用可用于Drupal 的各种面包屑定制模块之一。


2

这可能不是最有效的方法,但是请尝试:

function THEME_breadcrumb($variables)

然后读取变量。

……我的天哪,我讨厌面包屑。非常。


1
我看见了这个。但这似乎不是“ Drupal方式”。这是一个主题挂钩,因此不应使用它来修改输入
Jean-Michel Garcia

我要这样做是因为另一种方法不起作用。我支持您的问题,但不接受。希望有人找到“正确的道路”。
Jean-Michel Garcia

1

如果您只需要更改特定页面上的面包屑,则以下解决方案可以为您提供帮助。该示例将面包屑更新为编辑表单。

$breadcrumb = array();
$breadcrumb[] = l(t('Home'), '<front>');
$breadcrumb[] = l(t('Nodes listing'), 'nodes/listing');
# Update breadcrumb on the edit form
if (isset($form['nid']) && (is_numeric($form['nid']['#value']))) {
    $breadcrumb[] = l($form['#node']->title, 'node/' . $node->nid);
}

drupal_set_breadcrumb($breadcrumb);

Drupal的另一种方式是给用户使用,hook_menu_breadcrumb_alter但是YOUR_MODULE_menu_breadcrumb_alter在添加功能后请确保命名并清除缓存。

或者,这也是theme_breadcrumbDrupal更新面包屑的方式,但是在此挂钩中,您应该仅更改面包屑的标记,而不更改链接。


0

THEME_NAME_breadcrumb没有为我工作。但是,我确实使用此功能覆盖了面包屑:

function MODULE_node_view_alter(&$build) {
  $node = $build['#node'];
  if ($build['#view_mode'] == 'full' && $node->type == 'CONTENT_TYPE') {
    $breadcrumb = array();
    $breadcrumb[] = l('Home', '<front>');
    $breadcrumb[] = l('People', 'group/node/' . arg(2) . '/people');
    $breadcrumb[] = l('Attendance', 'group/node/' . arg(2) . '/people/attendance');
    drupal_set_breadcrumb($breadcrumb);
  }
}

信用去:https//stackoverflow.com/questions/10087168/how-to-add-breadcrumb


0

函数MODULE_menu_breadcrumb_alter(&$ active_trail,$ item){

//STORE THE LAST ITEM
$end = end($active_trail);
foreach ($active_trail as $key => $crumb){
    //CHECK AGAINST NODE TYPE
    if($crumb['map'][1]->type == 'CONTENT_TYPE' && $crumb['link_path'] == 'node/%'){
       //INSERT THE REPLACEMENT CRUMB
        //INSERT THE REPLACEMENT CRUMB
        $active_trail[$key] = array( 
            'title' => t("Title"),
            'href' => 'PATH',
            'link_path' => 'PATH', 
            'localized_options' => array(),
            'type' => 0
        );
    }
}

}

这么多的代码足以修改面包屑url。

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.