Ändern des Brotkrumeninhalts


13

Ich versuche, diesen Hook zu verwenden, um einen Breadcrumb-Link zu ändern:

hook_menu_breadcrumb_alter(&$active_trail, $item)

Der Haken scheint nicht genannt zu werden.

Ich habe es versucht :

  • Verwenden des Hakens für ein Thema
  • Verwenden des Hooks in einem benutzerdefinierten Modul (breadcrumb_finder_fix)
  • Löschen Sie alle Caches mit Drush

Ich habe das Devel-Modul installiert und aktiviert und das Folgende erzeugt keine Ausgabe.

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

Irgendwelche Ideen ? Richtungen ? Bitte beraten.

OBS: Ich habe diese Antwort gelesen: /drupal//a/7659/12647


Ich habe das gleiche Problem. Ich habe die Hook-Funktion MYMODULE_menu_breadcrumb_alter () erstellt, das Modul aktiviert, den Cache geleert und der Hook scheint auf Benutzerseiten nie aufgerufen zu werden. Ironischerweise scheint es auf Admin-Seiten aufgerufen zu werden (ich bekomme die Krumo-Ausgabe auf Admin-Seiten). Die _breadcrumb () -Ebene des Themas scheint der falsche Ort zu sein, um dies zu tun.
Peter Murray

Antworten:


4

Hier ist ein Ausschnitt, der zeigt, wie Sie Semmelbrösel ändern können.

Beachten Sie Folgendes:

  • Bei dieser Methode werden die Breadcrumbs auf Designebene geändert. Dies ist der letzte Ort, an dem Änderungen an Vorlagendateien vorgenommen werden, bevor diese vorgenommen werden. Wenn Sie also hier Änderungen vornehmen, können andere Module die Breadcrumbs später nicht mehr ändern.
  • Betrachten Sie diesen Weg als die letzte Option, um Ihre Paniermehl zu ändern.
  • Fügen Sie dieses Snippet zur template.php-Datei Ihres Themas hinzu.

    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 Ich habe ein paar Änderungen vorgenommen, schau es dir an (nicht im Snippet), sondern im Disclaimer
Arpitr

13

Wahrscheinlich etwas spät, um zu antworten, aber ich bin heute Morgen auf diesen Thread gestoßen, als ich nach einer Möglichkeit gesucht habe, den Breadcrumb in Drupal 7 zu überschreiben. Es hat ein wenig geholfen, also dachte ich, ich würde meine Lösung hinzufügen.

Dadurch werden basierend auf den Inhaltstypen zusätzliche Krümel erstellt, und die aktuelle Seite wird dem Krümel hinzugefügt. Ich verwende dies, um einer Filteransicht, die vor dem angegebenen Knoten angezeigt wird, einen Krümel hinzuzufügen.

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
Dies scheint der richtige Weg zu sein, aber es funktioniert nicht für mich. Ironischerweise funktioniert dies auf Admin-Seiten, aber nicht auf allgemeinen Benutzerinhalten. Vorschläge zum Debuggen?
Peter Murray

Ich habe das gleiche Problem wie @PeterMurray. Ich habe es noch nicht vollständig gelöst, aber soweit ich es jetzt beurteilen kann, liegt dies daran, dass das custom_breadcrumbs-Modul die Links irgendwie überschreibt. Meine 2 Cent jedenfalls.
Pax

9

hook_menu_breadcrumb_alter () funktioniert nicht auf Seiten, auf denen zuvor drupal_set_breadcrumb () aufgerufen wurde.

hook_menu_breadcrumb_alter () wird von menu_get_active_breadcrumb () aufgerufen . Dies wird von drupal_get_breadcrumb () aufgerufen , aber nur, wenn zuvor mit drupal_set_breadcrumb () kein Breadcrumb gesetzt wurde .

Es sieht nicht so aus, als würde drupal_set_breadcrumb () von der Benutzerseite aufgerufen. Aber vielleicht gibt es ein Contrib-Modul, das das macht. Sie können dpm () oder ddebug_backtrace () in drupal_set_breadcrumb () einfügen, um festzustellen, ob dies der Fall ist (das Entwicklungsmodul muss aktiviert sein und Sie haben die Berechtigung, Entwicklungsinformationen anzuzeigen).

Sie können stattdessen hook_preprocess_breadcrumb () verwenden. Dazu müssen Sie jedoch den zu ändernden Breadcrumb-Link analysieren. Da in diesem Hook die Breadcrumb-Links bereits als HTML gerendert sind, benötigen Sie reguläre Ausdrücke (preg_match ()) oder ähnliches, um zB die URL zu bestimmen.

Eine viel bessere Lösung ist die Verwendung eines der verschiedenen Breadcrumb-Customizing-Module , die für Drupal verfügbar sind.


2

Dies ist möglicherweise nicht der effizienteste Weg, aber versuchen Sie Folgendes:

function THEME_breadcrumb($variables)

und dann lesen Sie die Variablen.

... auch mein Gott, ich hasse Semmelbrösel. so viel.


1
Ich habe es gesehen. Aber es scheint nicht der "Drupal-Weg" zu sein. Dies ist ein Theme-Hook und sollte daher nicht verwendet werden, um die Eingabe zu ändern
Jean-Michel Garcia

Ich mache das, weil der andere Weg nicht funktioniert. Ich stimme Ihrer Frage zu, aber ich akzeptiere sie nicht. Ich hoffe, dass jemand den "richtigen Weg" findet.
Jean-Michel Garcia

1

Wenn Sie nur den Breadcrumb auf einer bestimmten Seite ändern müssen, hilft Ihnen möglicherweise die folgende Lösung. In diesem Beispiel wird der Breadcrumb für ein Bearbeitungsformular aktualisiert.

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

Eine andere Drupal-Methode ist der Benutzer, hook_menu_breadcrumb_alteraber stellen Sie sicher, dass Sie ihn benennen YOUR_MODULE_menu_breadcrumb_alterund den Cache leeren, nachdem Sie die Funktion hinzugefügt haben.

Oder theme_breadcrumbist auch eine Drupal-Methode zum Aktualisieren des Breadcrumb, aber in diesem Hook sollten Sie nur das Markup des Breadcrumb ändern, keine Links.


0

das THEME_NAME_breadcrumbhat bei mir nicht geklappt. Allerdings habe ich es geschafft, Breadcrumb mit dieser Funktion zu überschreiben:

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

Gutschrift geht an: /programming/10087168/how-to-add-breadcrumb


0

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

}

So viel Code reicht aus, um die Breadcrumb-URL zu ändern.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.