Modification du contenu du fil d'Ariane

13

J'essaie d'utiliser ce crochet pour modifier un lien de navigation:

hook_menu_breadcrumb_alter(&$active_trail, $item)

Le crochet ne semble pas s'appeler.

J'ai essayé :

  • Utiliser le crochet sur un thème
  • Utilisation du crochet sur un module personnalisé (breadcrumb_finder_fix)
  • Effacement de tous les caches à l'aide de Drush

J'ai le module Devel installé et activé, et ce qui suit ne produit aucune sortie.

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

Des idées ? Instructions ? S'il vous plaît donnez votre avis.

OBS: J'ai lu cette réponse: /drupal//a/7659/12647

Jean-Michel Garcia
la source
J'ai le même problème. J'ai créé la fonction de hook MYMODULE_menu_breadcrumb_alter (), activé le module, effacé le cache et le hook ne semble jamais être appelé sur les pages utilisateur. Ironiquement, il semble être appelé sur les pages d'administration (j'obtiens la sortie krumo sur les pages d'administration). Le niveau _breadcrumb () du thème semble être le mauvais endroit pour le faire.
Peter Murray

Réponses:

4

Voici un extrait pour montrer comment vous pouvez modifier le fil d'Ariane.

Gardez à l'esprit les points suivants:

  • Cette méthode modifie le fil d'Ariane au niveau du thème, qui est le dernier endroit pour changer quoi que ce soit avant qu'il n'atteigne les fichiers de modèle, donc changer ici ne permettra pas à un autre module de changer le fil d'Ariane plus tard.
  • Considérez cette façon comme la dernière option pour modifier votre fil d'Ariane.
  • Ajoutez cet extrait au fichier template.php de votre thème.

    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
la source
@jean J'ai fait quelques changements, regardez-le (pas dans l'extrait), mais dans l'avertissement
arpitr
13

Probablement un peu tard pour répondre, mais je suis tombé sur ce sujet ce matin alors que je cherchais un moyen de remplacer le fil d'Ariane dans Drupal 7, cela m'a un peu aidé, alors j'ai pensé ajouter ma solution.

Cela crée des miettes supplémentaires en fonction des types de contenu et ajoute la page actuelle à la miette. J'utilise ceci pour ajouter une miette à une vue de filtrage vue avant le nœud donné.

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
la source
2
Cela semble être la bonne façon, mais cela ne fonctionne pas pour moi. Ironiquement, cela fonctionne sur les pages d'administration, mais cela ne fonctionne pas sur le contenu utilisateur général. Des suggestions sur la façon de déboguer?
Peter Murray
J'ai le même problème que @PeterMurray. Je ne l'ai pas encore entièrement résolu, mais d'après ce que je peux dire en ce moment, cela est dû au fait que le module custom_breadcrumbs remplace en quelque sorte les liens. Mes 2 cents, en tout cas.
Pax
9

hook_menu_breadcrumb_alter () ne fonctionne pas sur les pages où drupal_set_breadcrumb () a été appelé auparavant.

hook_menu_breadcrumb_alter () est appelé à partir de menu_get_active_breadcrumb () . Ceci est appelé depuis drupal_get_breadcrumb () , mais uniquement si aucun fil d' Ariane n'a été précédemment défini avec drupal_set_breadcrumb () .

Il ne semble pas que drupal_set_breadcrumb () soit appelé depuis la page utilisateur. Mais il y a peut-être un module contrib qui fait ça. Vous pouvez mettre un dpm () ou ddebug_backtrace () dans drupal_set_breadcrumb () pour voir si c'est le cas (nécessite l'activation du module devel, et vous avez la permission de voir les informations devel).

Vous pouvez utiliser hook_preprocess_breadcrumb () à la place, mais cela nécessite d'analyser le lien de navigation que vous souhaitez modifier. Parce que dans ce hook, les liens du fil d'Ariane sont déjà rendus en html, donc vous avez besoin d'expressions régulières (preg_match ()) ou similaire pour déterminer par exemple l'url.

Une bien meilleure solution consiste à utiliser l'un des différents modules de personnalisation du fil d'Ariane disponibles pour Drupal.

don Quichotte
la source
2

ce n'est peut-être pas le moyen le plus efficace, mais essayez:

function THEME_breadcrumb($variables)

puis lisez les variables.

... aussi mon dieu, je déteste la chapelure. tellement de.

jdu
la source
1
J'ai vu ça. Mais cela ne semble pas être la "voie Drupal". Ceci est un crochet de thème et ne doit donc pas être utilisé pour modifier l'entrée
Jean-Michel Garcia
J'y vais parce que l'autre façon ne fonctionne pas. Je vote pour votre question, mais je n'accepte pas. En espérant que quelqu'un trouve la "bonne voie".
Jean-Michel Garcia
1

Si vous avez seulement besoin de modifier le fil d'Ariane sur une page spécifique, la solution suivante peut peut-être vous aider. L'exemple met à jour le fil d'Ariane d'un formulaire de modification.

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

Une autre façon Drupal est d'utiliser l'utilisateur hook_menu_breadcrumb_altermais assurez-vous de le nommer YOUR_MODULE_menu_breadcrumb_alteret de vider le cache après avoir ajouté la fonction.

Ou theme_breadcrumbest également un moyen Drupal de mettre à jour le fil d'Ariane, mais dans ce crochet, vous devez uniquement modifier le balisage du fil d'Ariane, pas les liens.

bogtan
la source
0

cela THEME_NAME_breadcrumbn'a pas fonctionné pour moi. Cependant, j'ai réussi à remplacer le fil d'Ariane avec cette fonction:

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

le crédit va à: /programming/10087168/how-to-add-breadcrumb

Turtletrail
la source
0

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

}

ce code est suffisant pour modifier l'URL du fil d'Ariane.

Nayana
la source