Zmiana zawartości bułki tartej

13

Próbuję użyć tego haka, aby zmienić link nawigacyjny:

hook_menu_breadcrumb_alter(&$active_trail, $item)

Hak nie wydaje się być nazywany.

Próbowałem :

  • Korzystanie z haka na temat
  • Korzystanie z haka na module niestandardowym (breadcrumb_finder_fix)
  • Czyszczenie wszystkich skrzynek przy użyciu Drush

Mam zainstalowany i aktywowany moduł Devel, a poniższe nie generują żadnych danych wyjściowych.

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

Jakieś pomysły ? Wskazówki dojazdu Proszę doradź.

OBS: Przeczytałem tę odpowiedź: /drupal//a/7659/12647

Jean-Michel Garcia
źródło
Mam ten sam problem. Utworzyłem funkcję przechwytującą MYMODULE_menu_breadcrumb_alter (), włączyłem moduł, wyczyściłem pamięć podręczną, a zaczep nie wydaje się być wywoływany na stronach użytkownika. Jak na ironię, wydaje się, że jest wywoływany na stronach administracyjnych (otrzymuję dane wyjściowe krumo na stronach administracyjnych). Poziom _breadcrumb () motywu wydaje się być niewłaściwym miejscem do tego.
Peter Murray

Odpowiedzi:

4

Oto fragment pokazujący, jak możesz zmienić bułkę tartą.

Pamiętaj, że:

  • Ta metoda zmienia bułkę tartą na poziomie kompozycji, która jest ostatnim miejscem do zmiany czegokolwiek, zanim dotrze do plików szablonów, więc zmiana tutaj nie pozwoli innym modułom na zmianę bułki tartej później.
  • Rozważ ten sposób jako ostatnią opcję zmiany bułki tartej.
  • Dodaj ten fragment kodu do pliku template.php swojego motywu.

    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);
      }
    }
arpitr
źródło
@jean Zrobiłem kilka zmian, spójrz na to (nie we fragmencie), ale w zrzeczeniu się odpowiedzialności
arpitr
13

Prawdopodobnie trochę późno, by odpowiedzieć, ale natknąłem się na ten wątek dziś rano, szukając sposobu na zastąpienie bułki tartej w Drupal 7, pomogło to trochę, więc pomyślałem, że dodam moje rozwiązanie.

To tworzy dodatkowe okruchy na podstawie typów treści i dodaje bieżącą stronę do okruchów. Używam tego, aby dodać okruchy do widoku filtrowania widzianego przed danym węzłem.

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;
        }       
    }

}
andrew_hoffi
źródło
2
Wydaje się, że to właściwy sposób, ale dla mnie to nie działa. Jak na ironię działa to na stronach administracyjnych, ale nie działa na ogólnych treściach użytkowników. Sugestie dotyczące debugowania?
Peter Murray,
Mam ten sam problem co @PeterMurray. Nie rozwiązałem go jeszcze w pełni, ale z tego, co mogę teraz powiedzieć, jest to spowodowane tym, że moduł custom_breadcrumbs w jakiś sposób przesłania linki. W każdym razie moje 2 centy.
Pax
9

hook_menu_breadcrumb_alter () nie działa na stronach, na których wcześniej wywołano drupal_set_breadcrumb ().

hook_menu_breadcrumb_alter () jest wywoływany z menu_get_active_breadcrumb () . Jest to wywoływane z drupal_get_breadcrumb () , ale tylko jeśli wcześniej nie ustawiono breadcrumb z drupal_set_breadcrumb () .

Nie wygląda to na wywołanie funkcji drupal_set_breadcrumb () ze strony użytkownika. Ale może istnieje moduł contrib, który to robi. Możesz umieścić dpm () lub ddebug_backtrace () w drupal_set_breadcrumb (), aby zobaczyć, czy tak jest w tym przypadku (wymaga włączenia modułu devel i posiadania uprawnień do wyświetlania informacji o devel).

Zamiast tego możesz użyć hook_preprocess_breadcrumb (), ale wymaga to przeanalizowania łącza do breadcrumb, które chcesz zmienić. Ponieważ w tym haku łącza nawigacyjne są już renderowane jako HTML, więc potrzebujesz wyrażeń regularnych (preg_match ()) lub podobnych, aby określić np. Adres URL.

O wiele lepszym rozwiązaniem jest użycie jednego z różnych modułów dostosowywania bułki tartej, które są dostępne dla Drupala.

Don Kichot
źródło
2

może to nie być najskuteczniejszy sposób, ale spróbuj:

function THEME_breadcrumb($variables)

a następnie przeczytaj zmienne.

... także mój boże, nienawidzę bułki tartej. tak wiele.

jdu
źródło
1
Zobaczyłem to. Ale to nie wydaje się „drogą Drupala”. To jest haczyk tematyczny i dlatego nie należy go używać do modyfikowania danych wejściowych
Jean-Michel Garcia z
Idę po to, ponieważ inny sposób nie działa. Głosuję za twoim pytaniem, ale nie akceptuję. Mam nadzieję, że ktoś znajdzie „właściwą drogę”.
Jean-Michel Garcia
1

Jeśli potrzebujesz tylko zmienić element nawigacyjny na określonej stronie, być może poniższe rozwiązanie może ci pomóc. Przykład aktualizuje menu nawigacyjne dla formularza edycji.

$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);

Innym sposobem Drupala jest użytkownik, hook_menu_breadcrumb_alterale pamiętaj, aby nazwać go YOUR_MODULE_menu_breadcrumb_alteri wyczyścić pamięć podręczną po dodaniu funkcji.

Lub też theme_breadcrumbjest sposobem Drupala na aktualizację bułki tartej, ale w tym haku powinieneś zmienić tylko znaczniki bułki tartej, a nie linki.

bogtan
źródło
0

THEME_NAME_breadcrumbnie działa dla mnie. Udało mi się jednak zastąpić bułkę tartą za pomocą tej funkcji:

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);
  }
}

kredyt trafia do: /programming/10087168/how-to-add-breadcrumb

Turtletrail
źródło
0

funkcja 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
        );
    }
}

}

tyle kodu wystarcza do zmodyfikowania adresu URL breadcrumb.

Nayana
źródło