Modificare il contenuto del pangrattato


13

Sto cercando di utilizzare questo hook per modificare un link breadcrumb:

hook_menu_breadcrumb_alter(&$active_trail, $item)

Il gancio non sembra essere chiamato.

Ho provato :

  • Usando il gancio su un tema
  • Utilizzo dell'hook su un modulo personalizzato (breadcrumb_finder_fix)
  • Svuotare tutte le cache usando Drush

Ho il modulo Devel installato e attivato e quanto segue non produce alcun output.

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

Qualche idea ? Indicazioni ? Si prega di avvisare.

OBS: ho letto questa risposta: /drupal//a/7659/12647


Sto avendo lo stesso problema. Ho creato la funzione hook MYMODULE_menu_breadcrumb_alter (), abilitato il modulo, svuotato la cache e l'hook non sembra mai essere chiamato nelle pagine dell'utente. Ironia della sorte, sembra essere chiamato nelle pagine di amministrazione (ottengo l'output di krumo nelle pagine di amministrazione). Il livello _breadcrumb () del tema sembra essere il posto sbagliato per farlo.
Peter Murray,

Risposte:


4

Ecco uno snippet per mostrare come modificare il pangrattato.

Tieni presente quanto segue:

  • Questo metodo cambia breadcrumb a livello di tema, che è l'ultimo posto dove cambiare qualsiasi cosa prima che raggiunga i file modello, quindi la modifica qui non consentirà ad altri moduli di cambiare il breadcrumb in seguito.
  • Considera in questo modo l'ultima opzione per modificare il pangrattato.
  • Aggiungi questo snippet al file template.php del tuo tema.

    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 Ho apportato alcune modifiche, date un'occhiata (non nello snippet), ma nella dichiarazione di non responsabilità
arpitr

13

Probabilmente un po 'tardi per rispondere, ma stamattina mi sono imbattuto in questo thread mentre cercavo un modo per ignorare il pangrattato in Drupal 7, mi ha aiutato un po', quindi ho pensato di aggiungere la mia soluzione.

Questo crea briciole extra in base ai tipi di contenuto e aggiunge la pagina corrente alla briciola. Sto usando questo per aggiungere una briciola a una vista di filtro vista prima del nodo dato.

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
Questo sembra essere il modo giusto, ma non funziona per me. Ironia della sorte, questo funziona su pagine di amministrazione, ma non su contenuti di utenti generici. Suggerimenti su come eseguire il debug?
Peter Murray,

Ho lo stesso problema di @PeterMurray. Non l'ho ancora risolto completamente, ma da quello che posso dire in questo momento, questo è causato dal modulo custom_breadcrumbs in qualche modo sovrascrivendo i collegamenti. I miei 2 centesimi, comunque.
Pax,

9

hook_menu_breadcrumb_alter () non funziona su pagine in cui drupal_set_breadcrumb () è stato chiamato in precedenza.

hook_menu_breadcrumb_alter () viene richiamato da menu_get_active_breadcrumb () . Questo viene chiamato da drupal_get_breadcrumb () , ma solo se in precedenza non è stato impostato breadcrumb con drupal_set_breadcrumb () .

Non sembra che drupal_set_breadcrumb () sia chiamato dalla pagina dell'utente. Ma forse c'è un modulo contrib che lo fa. È possibile inserire un dpm () o ddebug_backtrace () in drupal_set_breadcrumb () per vedere se questo è il caso (è necessario abilitare il modulo di sviluppo e si dispone dell'autorizzazione per visualizzare le informazioni di sviluppo).

Puoi usare hook_preprocess_breadcrumb () invece, ma questo richiede di analizzare il link breadcrumb che vuoi modificare. Perché in questo hook i collegamenti breadcrumb sono già resi come html, quindi hai bisogno di espressioni regolari (preg_match ()) o simili per determinare, ad esempio, l'URL.

Una soluzione molto migliore consiste nell'utilizzare uno dei vari moduli di personalizzazione del breadcrumb disponibili per Drupal.


2

questo potrebbe non essere il modo più efficiente, ma prova:

function THEME_breadcrumb($variables)

e poi leggi le variabili.

... anche il mio dio odio il pangrattato. così tanto.


1
L'ho visto. Ma non sembra il "modo Drupal". Questo è un hook a tema e quindi non dovrebbe essere usato per modificare l'input
Jean-Michel Garcia

Sto andando per questo perché l'altro modo non funziona. Sto votando la tua domanda, ma non accetto. Sperando che qualcuno trovi la "strada giusta".
Jean-Michel Garcia,

1

Se hai solo bisogno di modificare il pangrattato su una pagina specifica, forse la seguente soluzione può aiutarti. L'esempio aggiorna il breadcrumb per un modulo di modifica.

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

Un altro modo di Drupal è l'utente, hook_menu_breadcrumb_alterma assicurati di nominarlo YOUR_MODULE_menu_breadcrumb_altere svuotare la cache dopo aver aggiunto la funzione.

O theme_breadcrumbè anche un modo Drupal per aggiornare il breadcrumb ma in questo hook dovresti cambiare solo il markup del breadcrumb, non i link.


0

il THEME_NAME_breadcrumbnon ha funzionato per me. Tuttavia, sono riuscito a sostituire il pangrattato con questa funzione:

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

il merito va a: /programming/10087168/how-to-add-breadcrumb


0

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

}

questo codice è sufficiente per modificare l'URL breadcrumb.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.