web-dev-qa-db-fra.com

Modification du contenu du fil d'Ariane

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 hook 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: https://drupal.stackexchange.com/a/7659/12647

13

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

Probablement un peu tard pour répondre, mais je suis tombé sur ce sujet ce matin tout en cherchant 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;
        }       
    }

}
13
andrew_hoffi

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

hook_menu_breadcrumb_alter () est invoqué depuis 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 ressemble pas à drupal_set_breadcrumb () est 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, vous avez donc 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 divers modules de personnalisation du fil d'Ariane disponibles pour Drupal.

9
donquixote

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.

2
jdu

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 Drupal façon est d'utiliser l'utilisateur hook_menu_breadcrumb_alter mais assurez-vous de le nommer YOUR_MODULE_menu_breadcrumb_alter et vider le cache après avoir ajouté la fonction.

Ou aussi theme_breadcrumb est un moyen Drupal de mettre à jour le fil d'Ariane, mais dans ce hook, vous ne devez modifier que le balisage du fil d'Ariane, pas les liens.

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

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

0
Nayana

le THEME_NAME_breadcrumb N'a pas travaillé 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 à: https://stackoverflow.com/questions/10087168/how-to-add-breadcrumb

0
Turtletrail