web-dev-qa-db-ja.com

ブレッドクラムの内容を変更する

私はパンくずリンクを変更するためにこのフックを使用しようとしています:

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

13

以下は、パンくずリストを変更する方法を示すスニペットです。

次の点に注意してください。

  • このメソッドは、テーマレベルでパンくずを変更します。これは、テンプレートファイルに到達する前に何かを変更する最後の場所であるため、ここで変更すると、他のモジュールが後でパンくずを変更できなくなります。
  • この方法を、パンくずリストを変更する最後のオプションとして検討してください。
  • このスニペットをテーマの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);
      }
    }
    
4
arpitr

おそらく少し遅れて応答しましたが、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;
        }       
    }

}
13
andrew_hoffi

hook_menu_breadcrumb_alter()は機能しないで、以前にdrupal_set_breadcrumb()が呼び出されたページで機能します。

hook_menu_breadcrumb_alter()menu_get_active_breadcrumb() から呼び出されます。これは drupal_get_breadcrumb() から呼び出されますが、-[if if]drupal_set_breadcrumb() で事前にブレッドクラムが設定されていません。

それは見えない drupal_set_breadcrumb()がユーザーページから呼び出されます。しかし、多分 contrib module があります。 drupal_set_breadcrumb()にdpm()またはddebug_backtrace()を配置して、これが当てはまるかどうかを確認できます(develモジュールを有効にする必要があり、devel情報を表示する権限がある)。

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

はるかに優れたソリューションは、Drupalで使用できるさまざまな breadcrumb-customizing modules のいずれかを使用することです。

9
donquixote

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

function THEME_breadcrumb($variables)

次に変数を読み取ります。

...私の神もパンくずを嫌いです。そんなに。

2
jdu

特定のページのパンくずリストを変更するだけでよい場合は、次の解決策が役立つでしょう。この例では、編集フォームのブレッドクラムを更新します。

$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_breadcrumbはDrupalブレッドクラムを更新する方法ですが、このフックでは、リンクではなくブレッドクラムのマークアップのみを変更する必要があります。

1
bogtan
function MODULE_menu_breadcrumb_alter(&$active_trail, $item) {
  // Store the last item
  $end = end($active_trail);
  foreach ($active_trail as $key => $crumb){
    // Check against the node type
    if ($crumb['map'][1]->type == 'CONTENT_TYPE' && $crumb['link_path'] == 'node/%') {
      // Replace the breadcrumb
      $active_trail[$key] = array( 
        'title' => t("Title"),
        'href' => 'PATH',
        'link_path' => 'PATH', 
        'localized_options' => array(),
        'type' => 0
      );
    }
  }  
}

これだけのコードでパンくずリストのURLを変更できます。

0
Nayana

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
Turtletrail