パンくずリストの内容を変更する


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()レベルは、これを行うのに間違った場所のようです。
ピーターマレー

回答:


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

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セント。
パックス14年

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モジュールがあります。drupal_set_breadcrumb()にdpm()またはddebug_backtrace()を配置して、これが該当するかどうかを確認できます(develモジュールを有効にする必要があり、devel情報を表示する権限が必要です)。

代わりにhook_preprocess_breadcrumb()を使用できますが、これには変更するパンくずリンクを解析する必要があります。このフックでは、パンくずリストのリンクはすでにhtmlとしてレンダリングされているため、たとえばurlを決定するには正規表現(preg_match())などが必要です。

はるかに優れたソリューションは、Drupalで利用可能なさまざまなブレッドクラムカスタマイズモジュールの 1つを使用することです。


2

これは最も効率的な方法ではないかもしれませんが、試してください:

function THEME_breadcrumb($variables)

その後、変数を読み取ります。

...また、パンくずが嫌いです。そんなに。


1
これを見た。しかし、それは「Drupalの方法」ではないようです。このテーマフックであるため、入力を変更するために使用すべきではない
ジャン=ミシェル・ガルシア

他の方法が機能しないので、私はこれに行きます。私はあなたの質問を支持していますが、受け入れません。誰かが「正しい方法」を見つけることを望んでいます。
ジャン=ミシェルガルシア

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_alterYOUR_MODULE_menu_breadcrumb_alter、関数を追加した後、必ず名前を付けてキャッシュをクリアしてください。

またはtheme_breadcrumb、パンくずリストを更新するDrupalの方法でもありますが、このフックでは、リンクではなくパンくずリストのマークアップのみを変更する必要があります。


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を変更するには、これだけのコードで十分です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.